diff options
author | Boss Marco <bossm8@bfh.ch> | 2021-11-05 16:57:32 +0100 |
---|---|---|
committer | Boss Marco <bossm8@bfh.ch> | 2021-11-05 16:57:32 +0100 |
commit | 98064f0652d8e1dff661e3bb0d8791f4af04ad6f (patch) | |
tree | 5d278fd1fab17b0c4b03cc89bcea678edd3789d3 | |
parent | 8d9386ac008e9d095867433bfc789d09bd93414d (diff) | |
parent | 842cc327541ebcfc761208f42bf5f74e22c6283c (diff) | |
download | wallet-core-98064f0652d8e1dff661e3bb0d8791f4af04ad6f.tar.xz |
added some logging messages
124 files changed, 14270 insertions, 4211 deletions
diff --git a/package.json b/package.json index 95ef6f5e1..b6e27b997 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "check": "pnpm run --filter '{packages}' --if-present test" }, "devDependencies": { - "@linaria/esbuild": "^3.0.0-beta.7", - "@linaria/shaker": "^3.0.0-beta.7", - "esbuild": "^0.12.21" + "@linaria/esbuild": "^3.0.0-beta.13", + "@linaria/shaker": "^3.0.0-beta.13", + "esbuild": "^0.12.29" } } diff --git a/packages/anastasis-core/bin/anastasis-ts-reducer.js b/packages/anastasis-core/bin/anastasis-ts-reducer.js new file mode 100755 index 000000000..9e1120516 --- /dev/null +++ b/packages/anastasis-core/bin/anastasis-ts-reducer.js @@ -0,0 +1,14 @@ +#!/usr/bin/env node + +async function r() { + try { + (await import("source-map-support")).install(); + } catch (e) { + console.warn("can't load souremaps"); + // Do nothing. + } + + (await import("../dist/anastasis-cli.js")).reducerCliMain(); +} + +r(); diff --git a/packages/anastasis-core/package.json b/packages/anastasis-core/package.json index 8dbef2d45..7e4fba9e3 100644 --- a/packages/anastasis-core/package.json +++ b/packages/anastasis-core/package.json @@ -6,8 +6,8 @@ "module": "./lib/index.js", "types": "./lib/index.d.ts", "scripts": { - "prepare": "tsc", - "compile": "tsc", + "prepare": "tsc && rollup -c", + "compile": "tsc && rollup -c", "pretty": "prettier --write src", "test": "tsc && ava", "coverage": "tsc && nyc ava", @@ -17,15 +17,23 @@ "license": "AGPL-3-or-later", "type": "module", "devDependencies": { + "@rollup/plugin-commonjs": "^21.0.1", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^13.0.6", "ava": "^3.15.0", - "typescript": "^4.4.3" + "rimraf": "^3.0.2", + "rollup": "^2.59.0", + "rollup-plugin-sourcemaps": "^0.6.3", + "source-map-support": "^0.5.19", + "typescript": "^4.4.4" }, "dependencies": { "@gnu-taler/taler-util": "workspace:^0.8.3", "fetch-ponyfill": "^7.1.0", "fflate": "^0.6.0", "hash-wasm": "^4.9.0", - "node-fetch": "^3.0.0" + "node-fetch": "^3.0.0", + "tslib": "^2.1.0" }, "ava": { "files": [ diff --git a/packages/anastasis-core/rollup.config.js b/packages/anastasis-core/rollup.config.js new file mode 100644 index 000000000..a9af1d3b5 --- /dev/null +++ b/packages/anastasis-core/rollup.config.js @@ -0,0 +1,56 @@ +// rollup.config.js +import commonjs from "@rollup/plugin-commonjs"; +import nodeResolve from "@rollup/plugin-node-resolve"; +import json from "@rollup/plugin-json"; +import builtins from "builtin-modules"; +import sourcemaps from "rollup-plugin-sourcemaps"; + +const cli = { + input: "lib/index.node.js", + output: { + file: "dist/anastasis-cli.js", + format: "es", + sourcemap: true, + }, + external: builtins, + plugins: [ + nodeResolve({ + preferBuiltins: true, + }), + + sourcemaps(), + + commonjs({ + sourceMap: true, + transformMixedEsModules: true, + }), + + json(), + ], +}; + +const standalone = { + input: "lib/cli-entry.js", + output: { + file: "dist/anastasis-cli-standalone.js", + format: "es", + sourcemap: true, + }, + external: [...builtins, "source-map-support"], + plugins: [ + nodeResolve({ + preferBuiltins: true, + }), + + sourcemaps(), + + commonjs({ + sourceMap: true, + transformMixedEsModules: true, + }), + + json(), + ], +}; + +export default [standalone, cli]; diff --git a/packages/anastasis-core/src/challenge-feedback-types.ts b/packages/anastasis-core/src/challenge-feedback-types.ts new file mode 100644 index 000000000..0770d9296 --- /dev/null +++ b/packages/anastasis-core/src/challenge-feedback-types.ts @@ -0,0 +1,168 @@ +import { AmountString, HttpStatusCode } from "@gnu-taler/taler-util"; + +export enum ChallengeFeedbackStatus { + Solved = "solved", + ServerFailure = "server-failure", + TruthUnknown = "truth-unknown", + Redirect = "redirect", + Payment = "payment", + Pending = "pending", + Message = "message", + Unsupported = "unsupported", + RateLimitExceeded = "rate-limit-exceeded", + AuthIban = "auth-iban", +} + +export type ChallengeFeedback = + | ChallengeFeedbackSolved + | ChallengeFeedbackPending + | ChallengeFeedbackPayment + | ChallengeFeedbackServerFailure + | ChallengeFeedbackRateLimitExceeded + | ChallengeFeedbackTruthUnknown + | ChallengeFeedbackRedirect + | ChallengeFeedbackMessage + | ChallengeFeedbackUnsupported + | ChallengeFeedbackAuthIban; + +/** + * Challenge has been solved and the key share has + * been retrieved. + */ +export interface ChallengeFeedbackSolved { + state: ChallengeFeedbackStatus.Solved; +} + +/** + * The challenge given by the server is unsupported + * by the current anastasis client. + */ +export interface ChallengeFeedbackUnsupported { + state: ChallengeFeedbackStatus.Unsupported; + http_status: HttpStatusCode; + /** + * Human-readable identifier of the unsupported method. + */ + unsupported_method: string; +} + +/** + * The user tried to answer too often with a wrong answer. + */ +export interface ChallengeFeedbackRateLimitExceeded { + state: ChallengeFeedbackStatus.RateLimitExceeded; +} + +/** + * Instructions for performing authentication via an + * IBAN bank transfer. + */ +export interface ChallengeFeedbackAuthIban { + state: ChallengeFeedbackStatus.AuthIban; + + /** + * Amount that should be transfered for a successful authentication. + */ + challenge_amount: AmountString; + + /** + * Account that should be credited. + */ + credit_iban: string; + + /** + * Creditor name. + */ + business_name: string; + + /** + * Unstructured remittance information that should + * be contained in the bank transfer. + */ + wire_transfer_subject: string; + + /** + * FIXME: This field is only present for compatibility with + * the C reducer test suite. + */ + method: "iban"; + + answer_code: number; + + /** + * FIXME: This field is only present for compatibility with + * the C reducer test suite. + */ + details: { + challenge_amount: AmountString; + credit_iban: string; + business_name: string; + wire_transfer_subject: string; + }; +} + +/** + * Challenge still needs to be solved. + */ +export interface ChallengeFeedbackPending { + state: ChallengeFeedbackStatus.Pending; +} + +/** + * Human-readable response from the provider + * after the user failed to solve the challenge + * correctly. + */ +export interface ChallengeFeedbackMessage { + state: ChallengeFeedbackStatus.Message; + message: string; +} + +/** + * The server experienced a temporary failure. + */ +export interface ChallengeFeedbackServerFailure { + state: ChallengeFeedbackStatus.ServerFailure; + http_status: HttpStatusCode | 0; + + /** + * Taler-style error response, if available. + */ + error_response?: any; +} + +/** + * The truth is unknown to the provider. There + * is no reason to continue trying to solve any + * challenges in the policy. + */ +export interface ChallengeFeedbackTruthUnknown { + state: ChallengeFeedbackStatus.TruthUnknown; +} + +/** + * The user should be asked to go to a URL + * to complete the authentication there. + */ +export interface ChallengeFeedbackRedirect { + state: ChallengeFeedbackStatus.Redirect; + http_status: number; + redirect_url: string; +} + +/** + * A payment is required before the user can + * even attempt to solve the challenge. + */ +export interface ChallengeFeedbackPayment { + state: ChallengeFeedbackStatus.Payment; + + taler_pay_uri: string; + + provider: string; + + /** + * FIXME: Why is this required?! + */ + payment_secret: string; +} diff --git a/packages/anastasis-core/src/cli-entry.ts b/packages/anastasis-core/src/cli-entry.ts new file mode 100644 index 000000000..151b47f2b --- /dev/null +++ b/packages/anastasis-core/src/cli-entry.ts @@ -0,0 +1,15 @@ +import { reducerCliMain } from "./cli.js"; + +async function r() { + try { + // @ts-ignore + (await import("source-map-support")).install(); + } catch (e) { + console.warn("can't load souremaps, please install source-map-support"); + // Do nothing. + } + + reducerCliMain(); +} + +r(); diff --git a/packages/anastasis-core/src/cli.ts b/packages/anastasis-core/src/cli.ts new file mode 100644 index 000000000..517f2876d --- /dev/null +++ b/packages/anastasis-core/src/cli.ts @@ -0,0 +1,64 @@ +import { clk } from "@gnu-taler/taler-util"; +import { + getBackupStartState, + getRecoveryStartState, + reduceAction, +} from "./index.js"; +import fs from "fs"; + +export const reducerCli = clk + .program("reducer", { + help: "Command line interface for Anastasis.", + }) + .flag("initBackup", ["-b", "--backup"]) + .flag("initRecovery", ["-r", "--restore"]) + .maybeOption("argumentsJson", ["-a", "--arguments"], clk.STRING) + .maybeArgument("action", clk.STRING) + .maybeArgument("stateFile", clk.STRING); + +async function read(stream: NodeJS.ReadStream): Promise<string> { + const chunks = []; + for await (const chunk of stream) { + chunks.push(chunk); + } + return Buffer.concat(chunks).toString("utf8"); +} + +reducerCli.action(async (x) => { + if (x.reducer.initBackup) { + console.log(JSON.stringify(await getBackupStartState())); + return; + } else if (x.reducer.initRecovery) { + console.log(JSON.stringify(await getRecoveryStartState())); + return; + } + + const action = x.reducer.action; + if (!action) { + console.log("action required"); + return; + } + + let lastState: any; + if (x.reducer.stateFile) { + const s = fs.readFileSync(x.reducer.stateFile, { encoding: "utf-8" }); + lastState = JSON.parse(s); + } else { + const s = await read(process.stdin); + lastState = JSON.parse(s); + } + + let args: any; + if (x.reducer.argumentsJson) { + args = JSON.parse(x.reducer.argumentsJson); + } else { + args = {}; + } + + const nextState = await reduceAction(lastState, action, args); + console.log(JSON.stringify(nextState)); +}); + +export function reducerCliMain() { + reducerCli.run(); +} diff --git a/packages/anastasis-core/src/crypto.ts b/packages/anastasis-core/src/crypto.ts index da8338636..206d9eca8 100644 --- a/packages/anastasis-core/src/crypto.ts +++ b/packages/anastasis-core/src/crypto.ts @@ -10,8 +10,10 @@ import { crypto_sign_keyPair_fromSeed, stringToBytes, secretbox_open, + hash, + Logger, + j2s, } from "@gnu-taler/taler-util"; -import { gzipSync } from "fflate"; import { argon2id } from "hash-wasm"; export type Flavor<T, FlavorT extends string> = T & { @@ -248,7 +250,6 @@ export async function coreSecretRecover(args: { args.encryptedMasterKey, "emk", ); - console.log("recovered master key", masterKey); return await anastasisDecrypt(masterKey, args.encryptedCoreSecret, "cse"); } @@ -283,6 +284,10 @@ export async function coreSecretEncrypt( }; } +export async function pinAnswerHash(pin: number): Promise<SecureAnswerHash> { + return encodeCrock(hash(stringToBytes(pin.toString()))); +} + export async function secureAnswerHash( answer: string, truthUuid: TruthUuid, diff --git a/packages/anastasis-core/src/index.node.ts b/packages/anastasis-core/src/index.node.ts new file mode 100644 index 000000000..d08906a22 --- /dev/null +++ b/packages/anastasis-core/src/index.node.ts @@ -0,0 +1,2 @@ +export * from "./index.js"; +export { reducerCliMain } from "./cli.js"; diff --git a/packages/anastasis-core/src/index.ts b/packages/anastasis-core/src/index.ts index b4e911ffb..362ac3317 100644 --- a/packages/anastasis-core/src/index.ts +++ b/packages/anastasis-core/src/index.ts @@ -1,14 +1,22 @@ import { + AmountJson, + AmountLike, + Amounts, AmountString, buildSigPS, bytesToString, Codec, codecForAny, decodeCrock, + Duration, eddsaSign, encodeCrock, getRandomBytes, hash, + HttpStatusCode, + j2s, + Logger, + parsePayUri, stringToBytes, TalerErrorCode, TalerSignaturePurpose, @@ -17,35 +25,46 @@ import { import { anastasisData } from "./anastasis-data.js"; import { EscrowConfigurationResponse, + IbanExternalAuthResponse, TruthUploadRequest, } from "./provider-types.js"; import { - ActionArgAddAuthentication, - ActionArgDeleteAuthentication, - ActionArgDeletePolicy, - ActionArgEnterSecret, - ActionArgEnterSecretName, - ActionArgEnterUserAttributes, + ActionArgsAddAuthentication, + ActionArgsDeleteAuthentication, + ActionArgsDeletePolicy, + ActionArgsEnterSecret, + ActionArgsEnterSecretName, + ActionArgsEnterUserAttributes, + ActionArgsAddPolicy, + ActionArgsSelectContinent, + ActionArgsSelectCountry, ActionArgsSelectChallenge, ActionArgsSolveChallengeRequest, + ActionArgsUpdateExpiration, AuthenticationProviderStatus, AuthenticationProviderStatusOk, AuthMethod, BackupStates, + codecForActionArgsEnterUserAttributes, + codecForActionArgsAddPolicy, + codecForActionArgsSelectChallenge, + codecForActionArgSelectContinent, + codecForActionArgSelectCountry, + codecForActionArgsUpdateExpiration, ContinentInfo, CountryInfo, - MethodSpec, - Policy, - PolicyProvider, RecoveryInformation, RecoveryInternalData, RecoveryStates, ReducerState, ReducerStateBackup, - ReducerStateBackupUserAttributesCollecting, ReducerStateError, ReducerStateRecovery, SuccessDetails, + codecForActionArgsChangeVersion, + ActionArgsChangeVersion, + TruthMetaData, + ActionArgsUpdatePolicy, } from "./reducer-types.js"; import fetchPonyfill from "fetch-ponyfill"; import { @@ -61,8 +80,6 @@ import { PolicySalt, TruthSalt, secureAnswerHash, - TruthKey, - TruthUuid, UserIdentifier, userIdentifierDerive, typedArrayConcat, @@ -70,13 +87,27 @@ import { decryptKeyShare, KeyShare, coreSecretRecover, + pinAnswerHash, } from "./crypto.js"; import { unzlibSync, zlibSync } from "fflate"; -import { EscrowMethod, RecoveryDocument } from "./recovery-document-types.js"; +import { + ChallengeType, + EscrowMethod, + RecoveryDocument, +} from "./recovery-document-types.js"; +import { ProviderInfo, suggestPolicies } from "./policy-suggestion.js"; +import { + ChallengeFeedback, + ChallengeFeedbackStatus, +} from "./challenge-feedback-types.js"; -const { fetch, Request, Response, Headers } = fetchPonyfill({}); +const { fetch } = fetchPonyfill({}); export * from "./reducer-types.js"; +export * as validators from "./validators.js"; +export * from "./challenge-feedback-types.js"; + +const logger = new Logger("anastasis-core:index.ts"); function getContinents(): ContinentInfo[] { const continentSet = new Set<string>(); @@ -94,10 +125,40 @@ function getContinents(): ContinentInfo[] { return continents; } +interface ErrorDetails { + code: TalerErrorCode; + message?: string; + hint?: string; +} + +export class ReducerError extends Error { + constructor(public errorJson: ErrorDetails) { + super( + errorJson.message ?? + errorJson.hint ?? + `${TalerErrorCode[errorJson.code]}`, + ); + + // Set the prototype explicitly. + Object.setPrototypeOf(this, ReducerError.prototype); + } +} + +/** + * Get countries for a continent, abort with ReducerError + * exception when continent doesn't exist. + */ function getCountries(continent: string): CountryInfo[] { - return anastasisData.countriesList.countries.filter( + const countries = anastasisData.countriesList.countries.filter( (x) => x.continent === continent, ); + if (countries.length <= 0) { + throw new ReducerError({ + code: TalerErrorCode.ANASTASIS_REDUCER_INPUT_INVALID, + hint: "continent not found", + }); + } + return countries; } export async function getBackupStartState(): Promise<ReducerStateBackup> { @@ -114,19 +175,27 @@ export async function getRecoveryStartState(): Promise<ReducerStateRecovery> { }; } -async function backupSelectCountry( - state: ReducerStateBackup, - countryCode: string, - currencies: string[], -): Promise<ReducerStateError | ReducerStateBackupUserAttributesCollecting> { +async function selectCountry( + selectedContinent: string, + args: ActionArgsSelectCountry, +): Promise<Partial<ReducerStateBackup> & Partial<ReducerStateRecovery>> { + const countryCode = args.country_code; + const currencies = args.currencies; const country = anastasisData.countriesList.countries.find( (x) => x.code === countryCode, ); if (!country) { - return { + throw new ReducerError({ code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, hint: "invalid country selected", - }; + }); + } + + if (country.continent !== selectedContinent) { + throw new ReducerError({ + code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, + hint: "selected country is not in selected continent", + }); } const providers: { [x: string]: {} } = {}; @@ -140,8 +209,6 @@ async function backupSelectCountry( .required_attributes; return { - ...state, - backup_state: BackupStates.UserAttributesCollecting, selected_country: countryCode, currencies, required_attributes: ra, @@ -149,38 +216,25 @@ async function backupSelectCountry( }; } +async function backupSelectCountry( + state: ReducerStateBackup, + args: ActionArgsSelectCountry, +): Promise<ReducerStateError | ReducerStateBackup> { + return { + ...state, + ...(await selectCountry(state.selected_continent!, args)), + backup_state: BackupStates.UserAttributesCollecting, + }; +} + async function recoverySelectCountry( state: ReducerStateRecovery, - countryCode: string, - currencies: string[], + args: ActionArgsSelectCountry, ): Promise<ReducerStateError | ReducerStateRecovery> { - const country = anastasisData.countriesList.countries.find( - (x) => x.code === countryCode, - ); - if (!country) { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: "invalid country selected", - }; - } - - const providers: { [x: string]: {} } = {}; - for (const prov of anastasisData.providersList.anastasis_provider) { - if (currencies.includes(prov.currency)) { - providers[prov.url] = {}; - } - } - - const ra = (anastasisData.countryDetails as any)[countryCode] - .required_attributes; - return { ...state, recovery_state: RecoveryStates.UserAttributesCollecting, - selected_country: countryCode, - currencies, - required_attributes: ra, - authentication_providers: providers, + ...(await selectCountry(state.selected_continent!, args)), }; } @@ -230,8 +284,9 @@ async function getProviderInfo( async function backupEnterUserAttributes( state: ReducerStateBackup, - attributes: Record<string, string>, + args: ActionArgsEnterUserAttributes, ): Promise<ReducerStateBackup> { + const attributes = args.identity_attributes; const providerUrls = Object.keys(state.authentication_providers ?? {}); const newProviders = state.authentication_providers ?? {}; for (const url of providerUrls) { @@ -246,139 +301,6 @@ async function backupEnterUserAttributes( return newState; } -interface PolicySelectionResult { - policies: Policy[]; - policy_providers: PolicyProvider[]; -} - -type MethodSelection = number[]; - -function enumerateSelections(n: number, m: number): MethodSelection[] { - const selections: MethodSelection[] = []; - const a = new Array(n); - const sel = (i: number) => { - if (i === n) { - selections.push([...a]); - return; - } - const start = i == 0 ? 0 : a[i - 1] + 1; - for (let j = start; j < m; j++) { - a[i] = j; - sel(i + 1); - } - }; - sel(0); - return selections; -} - -/** - * Provider information used during provider/method mapping. - */ -interface ProviderInfo { - url: string; - methodCost: Record<string, AmountString>; -} - -/** - * Assign providers to a method selection. - */ -function assignProviders( - methods: AuthMethod[], - providers: ProviderInfo[], - methodSelection: number[], -): Policy | undefined { - const selectedProviders: string[] = []; - for (const mi of methodSelection) { - const m = methods[mi]; - let found = false; - for (const prov of providers) { - if (prov.methodCost[m.type]) { - selectedProviders.push(prov.url); - found = true; - break; - } - } - if (!found) { - /* No provider found for this method */ - return undefined; - } - } - return { - methods: methodSelection.map((x, i) => { - return { - authentication_method: x, - provider: selectedProviders[i], - }; - }), - }; -} - -function suggestPolicies( - methods: AuthMethod[], - providers: ProviderInfo[], -): PolicySelectionResult { - const numMethods = methods.length; - if (numMethods === 0) { - throw Error("no methods"); - } - let numSel: number; - if (numMethods <= 2) { - numSel = numMethods; - } else if (numMethods <= 4) { - numSel = numMethods - 1; - } else if (numMethods <= 6) { - numSel = numMethods - 2; - } else if (numMethods == 7) { - numSel = numMethods - 3; - } else { - numSel = 4; - } - const policies: Policy[] = []; - const selections = enumerateSelections(numSel, numMethods); - console.log("selections", selections); - for (const sel of selections) { - const p = assignProviders(methods, providers, sel); - if (p) { - policies.push(p); - } - } - return { - policies, - policy_providers: providers.map((x) => ({ - provider_url: x.url, - })), - }; -} - -/** - * Truth data as stored in the reducer. - */ -interface TruthMetaData { - uuid: string; - - key_share: string; - - policy_index: number; - - pol_method_index: number; - - /** - * Nonce used for encrypting the truth. - */ - nonce: string; - - /** - * Key that the truth (i.e. secret question answer, email address, mobile number, ...) - * is encrypted with when stored at the provider. - */ - truth_key: string; - - /** - * Truth-specific salt. - */ - truth_salt: string; -} - async function getTruthValue( authMethod: AuthMethod, truthUuid: string, @@ -408,7 +330,6 @@ async function getTruthValue( * Compress the recovery document and add a size header. */ async function compressRecoveryDoc(rd: any): Promise<Uint8Array> { - console.log("recovery document", rd); const docBytes = stringToBytes(JSON.stringify(rd)); const sizeHeaderBuf = new ArrayBuffer(4); const dvbuf = new DataView(sizeHeaderBuf); @@ -424,14 +345,19 @@ async function uncompressRecoveryDoc(zippedRd: Uint8Array): Promise<any> { return JSON.parse(bytesToString(res)); } -async function uploadSecret( +/** + * Prepare the recovery document and truth metadata based + * on the selected policies. + */ +async function prepareRecoveryData( state: ReducerStateBackup, -): Promise<ReducerStateBackup | ReducerStateError> { +): Promise<ReducerStateBackup> { const policies = state.policies!; const secretName = state.secret_name!; const coreSecret: OpaqueData = encodeCrock( stringToBytes(JSON.stringify(state.core_secret!)), ); + // Truth key is `${methodIndex}/${providerUrl}` const truthMetadataMap: Record<string, TruthMetaData> = {}; @@ -472,17 +398,6 @@ async function uploadSecret( const csr = await coreSecretEncrypt(policyKeys, coreSecret); - const uidMap: Record<string, UserIdentifier> = {}; - for (const prov of state.policy_providers!) { - const provider = state.authentication_providers![ - prov.provider_url - ] as AuthenticationProviderStatusOk; - uidMap[prov.provider_url] = await userIdentifierDerive( - state.identity_attributes!, - provider.salt, - ); - } - const escrowMethods: EscrowMethod[] = []; for (const truthKey of Object.keys(truthMetadataMap)) { @@ -494,24 +409,92 @@ async function uploadSecret( const provider = state.authentication_providers![ meth.provider ] as AuthenticationProviderStatusOk; + escrowMethods.push({ + escrow_type: authMethod.type as any, + instructions: authMethod.instructions, + provider_salt: provider.salt, + truth_salt: tm.truth_salt, + truth_key: tm.truth_key, + url: meth.provider, + uuid: tm.uuid, + }); + } + + const rd: RecoveryDocument = { + secret_name: secretName, + encrypted_core_secret: csr.encCoreSecret, + escrow_methods: escrowMethods, + policies: policies.map((x, i) => { + return { + master_key: csr.encMasterKeys[i], + uuids: policyUuids[i], + salt: policySalts[i], + }; + }), + }; + + return { + ...state, + recovery_data: { + recovery_document: rd, + truth_metadata: truthMetadataMap, + }, + }; +} + +async function uploadSecret( + state: ReducerStateBackup, +): Promise<ReducerStateBackup | ReducerStateError> { + if (!state.recovery_data) { + state = await prepareRecoveryData(state); + } + + const recoveryData = state.recovery_data; + if (!recoveryData) { + throw Error("invariant failed"); + } + + const truthMetadataMap = recoveryData.truth_metadata; + const rd = recoveryData.recovery_document; + + const truthPayUris: string[] = []; + const truthPaySecrets: Record<string, string> = {}; + + const userIdCache: Record<string, UserIdentifier> = {}; + const getUserIdCaching = async (providerUrl: string) => { + let userId = userIdCache[providerUrl]; + if (!userId) { + const provider = state.authentication_providers![ + providerUrl + ] as AuthenticationProviderStatusOk; + userId = userIdCache[providerUrl] = await userIdentifierDerive( + state.identity_attributes!, + provider.salt, + ); + } + return userId; + }; + for (const truthKey of Object.keys(truthMetadataMap)) { + const tm = truthMetadataMap[truthKey]; + const pol = state.policies![tm.policy_index]; + const meth = pol.methods[tm.pol_method_index]; + const authMethod = + state.authentication_methods![meth.authentication_method]; const truthValue = await getTruthValue(authMethod, tm.uuid, tm.truth_salt); const encryptedTruth = await encryptTruth( tm.nonce, tm.truth_key, truthValue, ); - const uid = uidMap[meth.provider]; + logger.info(`uploading truth to ${meth.provider}`); + const userId = await getUserIdCaching(meth.provider); const encryptedKeyShare = await encryptKeyshare( tm.key_share, - uid, + userId, authMethod.type === "question" ? bytesToString(decodeCrock(authMethod.challenge)) : undefined, ); - console.log( - "encrypted key share len", - decodeCrock(encryptedKeyShare).length, - ); const tur: TruthUploadRequest = { encrypted_truth: encryptedTruth, key_share_data: encryptedKeyShare, @@ -519,59 +502,74 @@ async function uploadSecret( type: authMethod.type, truth_mime: authMethod.mime_type, }; - const resp = await fetch(new URL(`truth/${tm.uuid}`, meth.provider).href, { + const reqUrl = new URL(`truth/${tm.uuid}`, meth.provider); + const paySecret = (state.truth_upload_payment_secrets ?? {})[meth.provider]; + if (paySecret) { + // FIXME: Get this from the params + reqUrl.searchParams.set("timeout_ms", "500"); + } + const resp = await fetch(reqUrl.href, { method: "POST", headers: { "content-type": "application/json", + ...(paySecret + ? { + "Anastasis-Payment-Identifier": paySecret, + } + : {}), }, body: JSON.stringify(tur), }); - if (resp.status !== 204) { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED, - hint: "could not upload policy", - }; + if (resp.status === HttpStatusCode.NoContent) { + continue; } - - escrowMethods.push({ - escrow_type: authMethod.type, - instructions: authMethod.instructions, - provider_salt: provider.salt, - truth_salt: tm.truth_salt, - truth_key: tm.truth_key, - url: meth.provider, - uuid: tm.uuid, - }); + if (resp.status === HttpStatusCode.PaymentRequired) { + const talerPayUri = resp.headers.get("Taler"); + if (!talerPayUri) { + return { + code: TalerErrorCode.ANASTASIS_REDUCER_BACKEND_FAILURE, + hint: `payment requested, but no taler://pay URI given`, + }; + } + truthPayUris.push(talerPayUri); + const parsedUri = parsePayUri(talerPayUri); + if (!parsedUri) { + return { + code: TalerErrorCode.ANASTASIS_REDUCER_BACKEND_FAILURE, + hint: `payment requested, but no taler://pay URI given`, + }; + } + truthPaySecrets[meth.provider] = parsedUri.orderId; + continue; + } + return { + code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED, + hint: `could not upload truth (HTTP status ${resp.status})`, + }; } - // FIXME: We need to store the truth metadata in - // the state, since it's possible that we'll run into - // a provider that requests a payment. - - console.log("policy UUIDs", policyUuids); - - const rd: RecoveryDocument = { - secret_name: secretName, - encrypted_core_secret: csr.encCoreSecret, - escrow_methods: escrowMethods, - policies: policies.map((x, i) => { - return { - master_key: csr.encMasterKeys[i], - uuids: policyUuids[i], - salt: policySalts[i], - }; - }), - }; + if (truthPayUris.length > 0) { + return { + ...state, + backup_state: BackupStates.TruthsPaying, + truth_upload_payment_secrets: truthPaySecrets, + payments: truthPayUris, + }; + } const successDetails: SuccessDetails = {}; + const policyPayUris: string[] = []; + const policyPayUriMap: Record<string, string> = {}; + //const policyPaySecrets: Record<string, string> = {}; + for (const prov of state.policy_providers!) { - const uid = uidMap[prov.provider_url]; - const acctKeypair = accountKeypairDerive(uid); + const userId = await getUserIdCaching(prov.provider_url); + const acctKeypair = accountKeypairDerive(userId); const zippedDoc = await compressRecoveryDoc(rd); const encRecoveryDoc = await encryptRecoveryDocument( - uid, + userId, encodeCrock(zippedDoc), ); const bodyHash = hash(decodeCrock(encRecoveryDoc)); @@ -579,44 +577,99 @@ async function uploadSecret( .put(bodyHash) .build(); const sig = eddsaSign(sigPS, decodeCrock(acctKeypair.priv)); - const resp = await fetch( - new URL(`policy/${acctKeypair.pub}`, prov.provider_url).href, - { - method: "POST", - headers: { - "Anastasis-Policy-Signature": encodeCrock(sig), - "If-None-Match": encodeCrock(bodyHash), - }, - body: decodeCrock(encRecoveryDoc), + const talerPayUri = state.policy_payment_requests?.find( + (x) => x.provider === prov.provider_url, + )?.payto; + let paySecret: string | undefined; + if (talerPayUri) { + paySecret = parsePayUri(talerPayUri)!.orderId; + } + const reqUrl = new URL(`policy/${acctKeypair.pub}`, prov.provider_url); + if (paySecret) { + // FIXME: Get this from the params + reqUrl.searchParams.set("timeout_ms", "500"); + } + logger.info(`uploading policy to ${prov.provider_url}`); + const resp = await fetch(reqUrl.href, { + method: "POST", + headers: { + "Anastasis-Policy-Signature": encodeCrock(sig), + "If-None-Match": encodeCrock(bodyHash), + ...(paySecret + ? { + "Anastasis-Payment-Identifier": paySecret, + } + : {}), }, - ); - if (resp.status !== 204) { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED, - hint: "could not upload policy", + body: decodeCrock(encRecoveryDoc), + }); + logger.info(`got response for policy upload (http status ${resp.status})`); + if (resp.status === HttpStatusCode.NoContent) { + let policyVersion = 0; + let policyExpiration: Timestamp = { t_ms: 0 }; + try { + policyVersion = Number(resp.headers.get("Anastasis-Version") ?? "0"); + } catch (e) {} + try { + policyExpiration = { + t_ms: + 1000 * + Number(resp.headers.get("Anastasis-Policy-Expiration") ?? "0"), + }; + } catch (e) {} + successDetails[prov.provider_url] = { + policy_version: policyVersion, + policy_expiration: policyExpiration, }; + continue; } - let policyVersion = 0; - let policyExpiration: Timestamp = { t_ms: 0 }; - try { - policyVersion = Number(resp.headers.get("Anastasis-Version") ?? "0"); - } catch (e) {} - try { - policyExpiration = { - t_ms: - 1000 * Number(resp.headers.get("Anastasis-Policy-Expiration") ?? "0"), - }; - } catch (e) {} - successDetails[prov.provider_url] = { - policy_version: policyVersion, - policy_expiration: policyExpiration, + if (resp.status === HttpStatusCode.PaymentRequired) { + const talerPayUri = resp.headers.get("Taler"); + if (!talerPayUri) { + return { + code: TalerErrorCode.ANASTASIS_REDUCER_BACKEND_FAILURE, + hint: `payment requested, but no taler://pay URI given`, + }; + } + policyPayUris.push(talerPayUri); + const parsedUri = parsePayUri(talerPayUri); + if (!parsedUri) { + return { + code: TalerErrorCode.ANASTASIS_REDUCER_BACKEND_FAILURE, + hint: `payment requested, but no taler://pay URI given`, + }; + } + policyPayUriMap[prov.provider_url] = talerPayUri; + continue; + } + return { + code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED, + hint: `could not upload policy (http status ${resp.status})`, + }; + } + + if (policyPayUris.length > 0) { + return { + ...state, + backup_state: BackupStates.PoliciesPaying, + payments: policyPayUris, + policy_payment_requests: Object.keys(policyPayUriMap).map((x) => { + return { + payto: policyPayUriMap[x], + provider: x, + }; + }), }; } + logger.info("backup finished"); + return { ...state, + core_secret: undefined, backup_state: BackupStates.BackupFinished, success_details: successDetails, + payments: undefined, }; } @@ -633,6 +686,7 @@ async function downloadPolicy( const newProviderStatus: { [url: string]: AuthenticationProviderStatusOk } = {}; const userAttributes = state.identity_attributes!; + const restrictProvider = state.selected_provider_url; // FIXME: Shouldn't we also store the status of bad providers? for (const url of providerUrls) { const pi = await getProviderInfo(url); @@ -647,9 +701,17 @@ async function downloadPolicy( if (!pi) { continue; } + if (restrictProvider && url !== state.selected_provider_url) { + // User wants specific provider. + continue; + } const userId = await userIdentifierDerive(userAttributes, pi.salt); const acctKeypair = accountKeypairDerive(userId); - const resp = await fetch(new URL(`policy/${acctKeypair.pub}`, url).href); + const reqUrl = new URL(`policy/${acctKeypair.pub}`, url); + if (state.selected_version) { + reqUrl.searchParams.set("version", `${state.selected_version}`); + } + const resp = await fetch(reqUrl.href); if (resp.status !== 200) { continue; } @@ -661,7 +723,6 @@ async function downloadPolicy( const rd: RecoveryDocument = await uncompressRecoveryDoc( decodeCrock(bodyDecrypted), ); - console.log("rd", rd); let policyVersion = 0; try { policyVersion = Number(resp.headers.get("Anastasis-Version") ?? "0"); @@ -682,7 +743,6 @@ async function downloadPolicy( } const recoveryInfo: RecoveryInformation = { challenges: recoveryDoc.escrow_methods.map((x) => { - console.log("providers", newProviderStatus); const prov = newProviderStatus[x.url] as AuthenticationProviderStatusOk; return { cost: prov.methods.find((m) => m.type === x.escrow_type)?.usage_fee!, @@ -750,25 +810,92 @@ async function tryRecoverSecret( return { ...state }; } -async function solveChallenge( +/** + * Re-check the status of challenges that are solved asynchronously. + */ +async function pollChallenges( state: ReducerStateRecovery, - ta: ActionArgsSolveChallengeRequest, + args: void, ): Promise<ReducerStateRecovery | ReducerStateError> { - const recDoc: RecoveryDocument = state.verbatim_recovery_document!; - const truth = recDoc.escrow_methods.find( - (x) => x.uuid === state.selected_challenge_uuid, - ); - if (!truth) { - throw "truth for challenge not found"; + for (const truthUuid in state.challenge_feedback) { + if (state.recovery_state === RecoveryStates.RecoveryFinished) { + break; + } + const feedback = state.challenge_feedback[truthUuid]; + const truth = state.verbatim_recovery_document!.escrow_methods.find( + (x) => x.uuid === truthUuid, + ); + if (!truth) { + logger.warn( + "truth for challenge feedback entry not found in recovery document", + ); + continue; + } + if (feedback.state === ChallengeFeedbackStatus.AuthIban) { + const s2 = await requestTruth(state, truth, { + pin: feedback.answer_code, + }); + if (s2.recovery_state) { + state = s2; + } + } } + return state; +} +/** + * Request a truth, optionally with a challenge solution + * provided by the user. + */ +async function requestTruth( + state: ReducerStateRecovery, + truth: EscrowMethod, + solveRequest?: ActionArgsSolveChallengeRequest, +): Promise<ReducerStateRecovery | ReducerStateError> { const url = new URL(`/truth/${truth.uuid}`, truth.url); - // FIXME: This isn't correct for non-question truth responses. - url.searchParams.set( - "response", - await secureAnswerHash(ta.answer, truth.uuid, truth.truth_salt), - ); + if (solveRequest) { + logger.info(`handling solve request ${j2s(solveRequest)}`); + let respHash: string; + switch (truth.escrow_type) { + case ChallengeType.Question: { + if ("answer" in solveRequest) { + respHash = await secureAnswerHash( + solveRequest.answer, + truth.uuid, + truth.truth_salt, + ); + } else { + throw Error("unsupported answer request"); + } + break; + } + case ChallengeType.Email: + case ChallengeType.Sms: + case ChallengeType.Post: + case ChallengeType.Iban: + case ChallengeType.Totp: { + if ("answer" in solveRequest) { + const s = solveRequest.answer.trim().replace(/^A-/, ""); + let pin: number; + try { + pin = Number.parseInt(s); + } catch (e) { + throw Error("invalid pin format"); + } + respHash = await pinAnswerHash(pin); + } else if ("pin" in solveRequest) { + respHash = await pinAnswerHash(solveRequest.pin); + } else { + throw Error("unsupported answer request"); + } + break; + } + default: + throw Error(`unsupported challenge type "${truth.escrow_type}""`); + } + url.searchParams.set("response", respHash); + } const resp = await fetch(url.href, { headers: { @@ -776,60 +903,140 @@ async function solveChallenge( }, }); - console.log(resp); + logger.info( + `got GET /truth response from ${truth.url}, http status ${resp.status}`, + ); - if (resp.status !== 200) { - return { - code: TalerErrorCode.ANASTASIS_TRUTH_CHALLENGE_FAILED, - hint: "got non-200 response", - http_status: resp.status, - } as ReducerStateError; - } + if (resp.status === HttpStatusCode.Ok) { + let answerSalt: string | undefined = undefined; + if ( + solveRequest && + truth.escrow_type === "question" && + "answer" in solveRequest + ) { + answerSalt = solveRequest.answer; + } - const answerSalt = truth.escrow_type === "question" ? ta.answer : undefined; + const userId = await userIdentifierDerive( + state.identity_attributes, + truth.provider_salt, + ); - const userId = await userIdentifierDerive( - state.identity_attributes, - truth.provider_salt, - ); + const respBody = new Uint8Array(await resp.arrayBuffer()); + const keyShare = await decryptKeyShare( + encodeCrock(respBody), + userId, + answerSalt, + ); - const respBody = new Uint8Array(await resp.arrayBuffer()); - const keyShare = await decryptKeyShare( - encodeCrock(respBody), - userId, - answerSalt, - ); + const recoveredKeyShares = { + ...(state.recovered_key_shares ?? {}), + [truth.uuid]: keyShare, + }; - const recoveredKeyShares = { - ...(state.recovered_key_shares ?? {}), - [truth.uuid]: keyShare, - }; + const challengeFeedback: { [x: string]: ChallengeFeedback } = { + ...state.challenge_feedback, + [truth.uuid]: { + state: ChallengeFeedbackStatus.Solved, + }, + }; - const challengeFeedback = { - ...state.challenge_feedback, - [truth.uuid]: { - state: "solved", - }, - }; + const newState: ReducerStateRecovery = { + ...state, + recovery_state: RecoveryStates.ChallengeSelecting, + challenge_feedback: challengeFeedback, + recovered_key_shares: recoveredKeyShares, + }; - const newState: ReducerStateRecovery = { - ...state, - recovery_state: RecoveryStates.ChallengeSelecting, - challenge_feedback: challengeFeedback, - recovered_key_shares: recoveredKeyShares, - }; + return tryRecoverSecret(newState); + } + + if (resp.status === HttpStatusCode.Forbidden) { + return { + ...state, + recovery_state: RecoveryStates.ChallengeSolving, + challenge_feedback: { + ...state.challenge_feedback, + [truth.uuid]: { + state: ChallengeFeedbackStatus.Message, + message: "Challenge should be solved", + }, + }, + }; + } + + if (resp.status === HttpStatusCode.Accepted) { + const body = await resp.json(); + logger.info(`got body ${j2s(body)}`); + if (body.method === "iban") { + const b = body as IbanExternalAuthResponse; + return { + ...state, + recovery_state: RecoveryStates.ChallengeSolving, + challenge_feedback: { + ...state.challenge_feedback, + [truth.uuid]: { + state: ChallengeFeedbackStatus.AuthIban, + answer_code: b.answer_code, + business_name: b.details.business_name, + challenge_amount: b.details.challenge_amount, + credit_iban: b.details.credit_iban, + wire_transfer_subject: b.details.wire_transfer_subject, + details: b.details, + method: "iban", + }, + }, + }; + } else { + return { + code: TalerErrorCode.ANASTASIS_TRUTH_CHALLENGE_FAILED, + hint: "unknown external authentication method", + http_status: resp.status, + } as ReducerStateError; + } + } - return tryRecoverSecret(newState); + return { + code: TalerErrorCode.ANASTASIS_TRUTH_CHALLENGE_FAILED, + hint: "got unexpected /truth/ response status", + http_status: resp.status, + } as ReducerStateError; +} + +async function solveChallenge( + state: ReducerStateRecovery, + ta: ActionArgsSolveChallengeRequest, +): Promise<ReducerStateRecovery | ReducerStateError> { + const recDoc: RecoveryDocument = state.verbatim_recovery_document!; + const truth = recDoc.escrow_methods.find( + (x) => x.uuid === state.selected_challenge_uuid, + ); + if (!truth) { + throw Error("truth for challenge not found"); + } + return requestTruth(state, truth, ta); } async function recoveryEnterUserAttributes( state: ReducerStateRecovery, - attributes: Record<string, string>, + args: ActionArgsEnterUserAttributes, ): Promise<ReducerStateRecovery | ReducerStateError> { // FIXME: validate attributes const st: ReducerStateRecovery = { ...state, - identity_attributes: attributes, + identity_attributes: args.identity_attributes, + }; + return downloadPolicy(st); +} + +async function changeVersion( + state: ReducerStateRecovery, + args: ActionArgsChangeVersion, +): Promise<ReducerStateRecovery | ReducerStateError> { + const st: ReducerStateRecovery = { + ...state, + selected_version: args.version, + selected_provider_url: args.provider_url, }; return downloadPolicy(st); } @@ -844,369 +1051,457 @@ async function selectChallenge( throw "truth for challenge not found"; } - const url = new URL(`/truth/${truth.uuid}`, truth.url); + return requestTruth({ ...state, selected_challenge_uuid: ta.uuid }, truth); +} - const resp = await fetch(url.href, { - headers: { - "Anastasis-Truth-Decryption-Key": truth.truth_key, +async function backupSelectContinent( + state: ReducerStateBackup, + args: ActionArgsSelectContinent, +): Promise<ReducerStateBackup | ReducerStateError> { + const countries = getCountries(args.continent); + if (countries.length <= 0) { + return { + code: TalerErrorCode.ANASTASIS_REDUCER_INPUT_INVALID, + hint: "continent not found", + }; + } + return { + ...state, + backup_state: BackupStates.CountrySelecting, + countries, + selected_continent: args.continent, + }; +} + +async function recoverySelectContinent( + state: ReducerStateRecovery, + args: ActionArgsSelectContinent, +): Promise<ReducerStateRecovery | ReducerStateError> { + const countries = getCountries(args.continent); + return { + ...state, + recovery_state: RecoveryStates.CountrySelecting, + countries, + selected_continent: args.continent, + }; +} + +interface TransitionImpl<S, T> { + argCodec: Codec<T>; + handler: (s: S, args: T) => Promise<S | ReducerStateError>; +} + +interface Transition<S, T> { + [x: string]: TransitionImpl<S, T>; +} + +function transition<S, T>( + action: string, + argCodec: Codec<T>, + handler: (s: S, args: T) => Promise<S | ReducerStateError>, +): Transition<S, T> { + return { + [action]: { + argCodec, + handler, }, - }); + }; +} - console.log(resp); +function transitionBackupJump( + action: string, + st: BackupStates, +): Transition<ReducerStateBackup, void> { + return { + [action]: { + argCodec: codecForAny(), + handler: async (s, a) => ({ ...s, backup_state: st }), + }, + }; +} +function transitionRecoveryJump( + action: string, + st: RecoveryStates, +): Transition<ReducerStateRecovery, void> { + return { + [action]: { + argCodec: codecForAny(), + handler: async (s, a) => ({ ...s, recovery_state: st }), + }, + }; +} + +async function addAuthentication( + state: ReducerStateBackup, + args: ActionArgsAddAuthentication, +): Promise<ReducerStateBackup> { return { ...state, - recovery_state: RecoveryStates.ChallengeSolving, - selected_challenge_uuid: ta.uuid, + authentication_methods: [ + ...(state.authentication_methods ?? []), + args.authentication_method, + ], }; } -export async function reduceAction( - state: ReducerState, - action: string, - args: any, -): Promise<ReducerState> { - console.log(`ts reducer: handling action ${action}`); - if (state.backup_state === BackupStates.ContinentSelecting) { - if (action === "select_continent") { - const continent: string = args.continent; - if (typeof continent !== "string") { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: "continent required", - }; - } - return { - ...state, - backup_state: BackupStates.CountrySelecting, - countries: getCountries(continent), - selected_continent: continent, - }; - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; - } - } - if (state.backup_state === BackupStates.CountrySelecting) { - if (action === "back") { - return { - ...state, - backup_state: BackupStates.ContinentSelecting, - countries: undefined, - }; - } else if (action === "select_country") { - const countryCode = args.country_code; - if (typeof countryCode !== "string") { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: "country_code required", - }; - } - const currencies = args.currencies; - return backupSelectCountry(state, countryCode, currencies); - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; - } - } - if (state.backup_state === BackupStates.UserAttributesCollecting) { - if (action === "back") { - return { - ...state, - backup_state: BackupStates.CountrySelecting, - }; - } else if (action === "enter_user_attributes") { - const ta = args as ActionArgEnterUserAttributes; - return backupEnterUserAttributes(state, ta.identity_attributes); - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; +async function deleteAuthentication( + state: ReducerStateBackup, + args: ActionArgsDeleteAuthentication, +): Promise<ReducerStateBackup> { + const m = state.authentication_methods ?? []; + m.splice(args.authentication_method, 1); + return { + ...state, + authentication_methods: m, + }; +} + +async function deletePolicy( + state: ReducerStateBackup, + args: ActionArgsDeletePolicy, +): Promise<ReducerStateBackup> { + const policies = [...(state.policies ?? [])]; + policies.splice(args.policy_index, 1); + return { + ...state, + policies, + }; +} + +async function updatePolicy( + state: ReducerStateBackup, + args: ActionArgsUpdatePolicy, +): Promise<ReducerStateBackup> { + const policies = [...(state.policies ?? [])]; + policies[args.policy_index] = { methods: args.policy }; + return { + ...state, + policies, + }; +} + +async function addPolicy( + state: ReducerStateBackup, + args: ActionArgsAddPolicy, +): Promise<ReducerStateBackup> { + return { + ...state, + policies: [ + ...(state.policies ?? []), + { + methods: args.policy, + }, + ], + }; +} + +async function nextFromAuthenticationsEditing( + state: ReducerStateBackup, + args: {}, +): Promise<ReducerStateBackup | ReducerStateError> { + const methods = state.authentication_methods ?? []; + const providers: ProviderInfo[] = []; + for (const provUrl of Object.keys(state.authentication_providers ?? {})) { + const prov = state.authentication_providers![provUrl]; + if ("error_code" in prov) { + continue; } - } - if (state.backup_state === BackupStates.AuthenticationsEditing) { - if (action === "back") { - return { - ...state, - backup_state: BackupStates.UserAttributesCollecting, - }; - } else if (action === "add_authentication") { - const ta = args as ActionArgAddAuthentication; - return { - ...state, - authentication_methods: [ - ...(state.authentication_methods ?? []), - ta.authentication_method, - ], - }; - } else if (action === "delete_authentication") { - const ta = args as ActionArgDeleteAuthentication; - const m = state.authentication_methods ?? []; - m.splice(ta.authentication_method, 1); - return { - ...state, - authentication_methods: m, - }; - } else if (action === "next") { - const methods = state.authentication_methods ?? []; - const providers: ProviderInfo[] = []; - for (const provUrl of Object.keys(state.authentication_providers ?? {})) { - const prov = state.authentication_providers![provUrl]; - if ("error_code" in prov) { - continue; - } - if (!("http_status" in prov && prov.http_status === 200)) { - continue; - } - const methodCost: Record<string, AmountString> = {}; - for (const meth of prov.methods) { - methodCost[meth.type] = meth.usage_fee; - } - providers.push({ - methodCost, - url: provUrl, - }); - } - const pol = suggestPolicies(methods, providers); - console.log("policies", pol); - return { - ...state, - backup_state: BackupStates.PoliciesReviewing, - ...pol, - }; - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; + if (!("http_status" in prov && prov.http_status === 200)) { + continue; } - } - if (state.backup_state === BackupStates.PoliciesReviewing) { - if (action === "back") { - return { - ...state, - backup_state: BackupStates.AuthenticationsEditing, - }; - } else if (action === "delete_policy") { - const ta = args as ActionArgDeletePolicy; - const policies = [...(state.policies ?? [])]; - policies.splice(ta.policy_index, 1); - return { - ...state, - policies, - }; - } else if (action === "next") { - return { - ...state, - backup_state: BackupStates.SecretEditing, - }; - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; + const methodCost: Record<string, AmountString> = {}; + for (const meth of prov.methods) { + methodCost[meth.type] = meth.usage_fee; } + providers.push({ + methodCost, + url: provUrl, + }); } - if (state.backup_state === BackupStates.SecretEditing) { - if (action === "back") { - return { - ...state, - backup_state: BackupStates.PoliciesReviewing, - }; - } else if (action === "enter_secret_name") { - const ta = args as ActionArgEnterSecretName; - return { - ...state, - secret_name: ta.name, - }; - } else if (action === "enter_secret") { - const ta = args as ActionArgEnterSecret; - return { - ...state, - expiration: ta.expiration, - core_secret: { - mime: ta.secret.mime ?? "text/plain", - value: ta.secret.value, - }, - }; - } else if (action === "next") { - return uploadSecret(state); - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; - } + const pol = suggestPolicies(methods, providers); + return { + ...state, + backup_state: BackupStates.PoliciesReviewing, + ...pol, + }; +} + +async function updateUploadFees( + state: ReducerStateBackup, +): Promise<ReducerStateBackup | ReducerStateError> { + const expiration = state.expiration; + if (!expiration) { + return { ...state }; } - if (state.backup_state === BackupStates.BackupFinished) { - if (action === "back") { - return { - ...state, - backup_state: BackupStates.SecretEditing, - }; - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; + logger.info("updating upload fees"); + const feePerCurrency: Record<string, AmountJson> = {}; + const addFee = (x: AmountLike) => { + x = Amounts.jsonifyAmount(x); + feePerCurrency[x.currency] = Amounts.add( + feePerCurrency[x.currency] ?? Amounts.getZero(x.currency), + x, + ).amount; + }; + const years = Duration.toIntegerYears(Duration.getRemaining(expiration)); + logger.info(`computing fees for ${years} years`); + // For now, we compute fees for *all* available providers. + for (const provUrl in state.authentication_providers ?? {}) { + const prov = state.authentication_providers![provUrl]; + if ("annual_fee" in prov) { + const annualFee = Amounts.mult(prov.annual_fee, years).amount; + logger.info(`adding annual fee ${Amounts.stringify(annualFee)}`); + addFee(annualFee); } } - - if (state.recovery_state === RecoveryStates.ContinentSelecting) { - if (action === "select_continent") { - const continent: string = args.continent; - if (typeof continent !== "string") { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: "continent required", - }; + const coveredProvTruth = new Set<string>(); + for (const x of state.policies ?? []) { + for (const m of x.methods) { + const prov = state.authentication_providers![ + m.provider + ] as AuthenticationProviderStatusOk; + const authMethod = state.authentication_methods![m.authentication_method]; + const key = `${m.authentication_method}@${m.provider}`; + if (coveredProvTruth.has(key)) { + continue; } - return { - ...state, - recovery_state: RecoveryStates.CountrySelecting, - countries: getCountries(continent), - selected_continent: continent, - }; - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; + logger.info( + `adding cost for auth method ${authMethod.challenge} / "${authMethod.instructions}" at ${m.provider}`, + ); + coveredProvTruth.add(key); + addFee(prov.truth_upload_fee); } } + return { + ...state, + upload_fees: Object.values(feePerCurrency).map((x) => ({ + fee: Amounts.stringify(x), + })), + }; +} - if (state.recovery_state === RecoveryStates.CountrySelecting) { - if (action === "back") { - return { - ...state, - recovery_state: RecoveryStates.ContinentSelecting, - countries: undefined, - }; - } else if (action === "select_country") { - const countryCode = args.country_code; - if (typeof countryCode !== "string") { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: "country_code required", - }; - } - const currencies = args.currencies; - return recoverySelectCountry(state, countryCode, currencies); - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; - } - } +async function enterSecret( + state: ReducerStateBackup, + args: ActionArgsEnterSecret, +): Promise<ReducerStateBackup | ReducerStateError> { + return updateUploadFees({ + ...state, + expiration: args.expiration, + core_secret: { + mime: args.secret.mime ?? "text/plain", + value: args.secret.value, + }, + // A new secret invalidates the existing recovery data. + recovery_data: undefined, + }); +} - if (state.recovery_state === RecoveryStates.UserAttributesCollecting) { - if (action === "back") { - return { - ...state, - recovery_state: RecoveryStates.CountrySelecting, - }; - } else if (action === "enter_user_attributes") { - const ta = args as ActionArgEnterUserAttributes; - return recoveryEnterUserAttributes(state, ta.identity_attributes); - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; - } +async function nextFromChallengeSelecting( + state: ReducerStateRecovery, + args: void, +): Promise<ReducerStateRecovery | ReducerStateError> { + const s2 = await tryRecoverSecret(state); + if (s2.recovery_state === RecoveryStates.RecoveryFinished) { + return s2; } + return { + code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, + hint: "Not enough challenges solved", + }; +} - if (state.recovery_state === RecoveryStates.SecretSelecting) { - if (action === "back") { - return { - ...state, - recovery_state: RecoveryStates.UserAttributesCollecting, - }; - } else if (action === "next") { - return { - ...state, - recovery_state: RecoveryStates.ChallengeSelecting, - }; - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; - } - } +async function enterSecretName( + state: ReducerStateBackup, + args: ActionArgsEnterSecretName, +): Promise<ReducerStateBackup | ReducerStateError> { + return { + ...state, + secret_name: args.name, + }; +} - if (state.recovery_state === RecoveryStates.ChallengeSelecting) { - if (action === "select_challenge") { - const ta: ActionArgsSelectChallenge = args; - return selectChallenge(state, ta); - } else if (action === "back") { - return { - ...state, - recovery_state: RecoveryStates.SecretSelecting, - }; - } else if (action === "next") { - const s2 = await tryRecoverSecret(state); - if (s2.recovery_state === RecoveryStates.RecoveryFinished) { - return s2; - } - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: "Not enough challenges solved", - }; - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; - } - } +async function updateSecretExpiration( + state: ReducerStateBackup, + args: ActionArgsUpdateExpiration, +): Promise<ReducerStateBackup | ReducerStateError> { + return updateUploadFees({ + ...state, + expiration: args.expiration, + }); +} - if (state.recovery_state === RecoveryStates.ChallengeSolving) { - if (action === "back") { - const ta: ActionArgsSelectChallenge = args; - return { - ...state, - selected_challenge_uuid: undefined, - recovery_state: RecoveryStates.ChallengeSelecting, - }; - } else if (action === "solve_challenge") { - const ta: ActionArgsSolveChallengeRequest = args; - return solveChallenge(state, ta); - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; - } - } +const backupTransitions: Record< + BackupStates, + Transition<ReducerStateBackup, any> +> = { + [BackupStates.ContinentSelecting]: { + ...transition( + "select_continent", + codecForActionArgSelectContinent(), + backupSelectContinent, + ), + }, + [BackupStates.CountrySelecting]: { + ...transitionBackupJump("back", BackupStates.ContinentSelecting), + ...transition( + "select_country", + codecForActionArgSelectCountry(), + backupSelectCountry, + ), + ...transition( + "select_continent", + codecForActionArgSelectContinent(), + backupSelectContinent, + ), + }, + [BackupStates.UserAttributesCollecting]: { + ...transitionBackupJump("back", BackupStates.CountrySelecting), + ...transition( + "enter_user_attributes", + codecForActionArgsEnterUserAttributes(), + backupEnterUserAttributes, + ), + }, + [BackupStates.AuthenticationsEditing]: { + ...transitionBackupJump("back", BackupStates.UserAttributesCollecting), + ...transition("add_authentication", codecForAny(), addAuthentication), + ...transition("delete_authentication", codecForAny(), deleteAuthentication), + ...transition("next", codecForAny(), nextFromAuthenticationsEditing), + }, + [BackupStates.PoliciesReviewing]: { + ...transitionBackupJump("back", BackupStates.AuthenticationsEditing), + ...transitionBackupJump("next", BackupStates.SecretEditing), + ...transition("add_policy", codecForActionArgsAddPolicy(), addPolicy), + ...transition("delete_policy", codecForAny(), deletePolicy), + ...transition("update_policy", codecForAny(), updatePolicy), + }, + [BackupStates.SecretEditing]: { + ...transitionBackupJump("back", BackupStates.PoliciesReviewing), + ...transition("next", codecForAny(), uploadSecret), + ...transition("enter_secret", codecForAny(), enterSecret), + ...transition( + "update_expiration", + codecForActionArgsUpdateExpiration(), + updateSecretExpiration, + ), + ...transition("enter_secret_name", codecForAny(), enterSecretName), + }, + [BackupStates.PoliciesPaying]: { + ...transitionBackupJump("back", BackupStates.SecretEditing), + ...transition("pay", codecForAny(), uploadSecret), + }, + [BackupStates.TruthsPaying]: { + ...transitionBackupJump("back", BackupStates.SecretEditing), + ...transition("pay", codecForAny(), uploadSecret), + }, + [BackupStates.BackupFinished]: { + ...transitionBackupJump("back", BackupStates.SecretEditing), + }, +}; + +const recoveryTransitions: Record< + RecoveryStates, + Transition<ReducerStateRecovery, any> +> = { + [RecoveryStates.ContinentSelecting]: { + ...transition( + "select_continent", + codecForActionArgSelectContinent(), + recoverySelectContinent, + ), + }, + [RecoveryStates.CountrySelecting]: { + ...transitionRecoveryJump("back", RecoveryStates.ContinentSelecting), + ...transition( + "select_country", + codecForActionArgSelectCountry(), + recoverySelectCountry, + ), + ...transition( + "select_continent", + codecForActionArgSelectContinent(), + recoverySelectContinent, + ), + }, + [RecoveryStates.UserAttributesCollecting]: { + ...transitionRecoveryJump("back", RecoveryStates.CountrySelecting), + ...transition( + "enter_user_attributes", + codecForActionArgsEnterUserAttributes(), + recoveryEnterUserAttributes, + ), + }, + [RecoveryStates.SecretSelecting]: { + ...transitionRecoveryJump("back", RecoveryStates.UserAttributesCollecting), + ...transitionRecoveryJump("next", RecoveryStates.ChallengeSelecting), + ...transition( + "change_version", + codecForActionArgsChangeVersion(), + changeVersion, + ), + }, + [RecoveryStates.ChallengeSelecting]: { + ...transitionRecoveryJump("back", RecoveryStates.SecretSelecting), + ...transition( + "select_challenge", + codecForActionArgsSelectChallenge(), + selectChallenge, + ), + ...transition("poll", codecForAny(), pollChallenges), + ...transition("next", codecForAny(), nextFromChallengeSelecting), + }, + [RecoveryStates.ChallengeSolving]: { + ...transitionRecoveryJump("back", RecoveryStates.ChallengeSelecting), + ...transition("solve_challenge", codecForAny(), solveChallenge), + }, + [RecoveryStates.ChallengePaying]: {}, + [RecoveryStates.RecoveryFinished]: { + ...transitionRecoveryJump("back", RecoveryStates.ChallengeSelecting), + }, +}; - if (state.recovery_state === RecoveryStates.RecoveryFinished) { - if (action === "back") { - const ta: ActionArgsSelectChallenge = args; - return { - ...state, - selected_challenge_uuid: undefined, - recovery_state: RecoveryStates.ChallengeSelecting, - }; - } else if (action === "solve_challenge") { - const ta: ActionArgsSolveChallengeRequest = args; - return solveChallenge(state, ta); - } else { - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: `Unsupported action '${action}'`, - }; +export async function reduceAction( + state: ReducerState, + action: string, + args: any, +): Promise<ReducerState> { + let h: TransitionImpl<any, any>; + let stateName: string; + if ("backup_state" in state && state.backup_state) { + stateName = state.backup_state; + h = backupTransitions[state.backup_state][action]; + } else if ("recovery_state" in state && state.recovery_state) { + stateName = state.recovery_state; + h = recoveryTransitions[state.recovery_state][action]; + } else { + return { + code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, + hint: `Invalid state (needs backup_state or recovery_state)`, + }; + } + if (!h) { + return { + code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, + hint: `Unsupported action '${action}' in state '${stateName}'`, + }; + } + let parsedArgs: any; + try { + parsedArgs = h.argCodec.decode(args); + } catch (e: any) { + return { + code: TalerErrorCode.ANASTASIS_REDUCER_INPUT_INVALID, + hint: "argument validation failed", + message: e.toString(), + }; + } + try { + return await h.handler(state, parsedArgs); + } catch (e) { + logger.error("action handler failed"); + if (e instanceof ReducerError) { + return e.errorJson; } + throw e; } - - return { - code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID, - hint: "Reducer action invalid", - }; } diff --git a/packages/anastasis-core/src/policy-suggestion.ts b/packages/anastasis-core/src/policy-suggestion.ts new file mode 100644 index 000000000..7eb6c21cc --- /dev/null +++ b/packages/anastasis-core/src/policy-suggestion.ts @@ -0,0 +1,230 @@ +import { AmountString, j2s, Logger } from "@gnu-taler/taler-util"; +import { AuthMethod, Policy, PolicyProvider } from "./reducer-types.js"; + +const logger = new Logger("anastasis-core:policy-suggestion.ts"); + +const maxMethodSelections = 200; +const maxPolicyEvaluations = 10000; + +/** + * Provider information used during provider/method mapping. + */ +export interface ProviderInfo { + url: string; + methodCost: Record<string, AmountString>; +} + +export function suggestPolicies( + methods: AuthMethod[], + providers: ProviderInfo[], +): PolicySelectionResult { + const numMethods = methods.length; + if (numMethods === 0) { + throw Error("no methods"); + } + let numSel: number; + if (numMethods <= 2) { + numSel = numMethods; + } else if (numMethods <= 4) { + numSel = numMethods - 1; + } else if (numMethods <= 6) { + numSel = numMethods - 2; + } else if (numMethods == 7) { + numSel = numMethods - 3; + } else { + numSel = 4; + } + const policies: Policy[] = []; + const selections = enumerateMethodSelections( + numSel, + numMethods, + maxMethodSelections, + ); + logger.info(`selections: ${j2s(selections)}`); + for (const sel of selections) { + const p = assignProviders(policies, methods, providers, sel); + if (p) { + policies.push(p); + } + } + logger.info(`suggesting policies ${j2s(policies)}`); + return { + policies, + policy_providers: providers.map((x) => ({ + provider_url: x.url, + })), + }; +} + +/** + * Assign providers to a method selection. + * + * The evaluation of the assignment is made with respect to + * previously generated policies. + */ +function assignProviders( + existingPolicies: Policy[], + methods: AuthMethod[], + providers: ProviderInfo[], + methodSelection: number[], +): Policy | undefined { + const providerSelections = enumerateProviderMappings( + methodSelection.length, + providers.length, + maxPolicyEvaluations, + ); + + let bestProvSel: ProviderSelection | undefined; + // Number of different providers selected, larger is better + let bestDiversity = 0; + // Number of identical challenges duplicated at different providers, + // smaller is better + let bestDuplication = Number.MAX_SAFE_INTEGER; + + for (const provSel of providerSelections) { + // First, check if selection is even possible with the methods offered + let possible = true; + for (const methIndex in provSel) { + const provIndex = provSel[methIndex]; + const meth = methods[methIndex]; + const prov = providers[provIndex]; + if (!prov.methodCost[meth.type]) { + possible = false; + break; + } + } + if (!possible) { + continue; + } + + // Evaluate diversity, always prefer policies + // that increase diversity. + const providerSet = new Set<string>(); + // The C reducer evaluates diversity only per policy + // for (const pol of existingPolicies) { + // for (const m of pol.methods) { + // providerSet.add(m.provider); + // } + // } + for (const provIndex of provSel) { + const prov = providers[provIndex]; + providerSet.add(prov.url); + } + + const diversity = providerSet.size; + + // Number of providers that each method shows up at. + const provPerMethod: Set<string>[] = []; + for (let i = 0; i < methods.length; i++) { + provPerMethod[i] = new Set<string>(); + } + for (const pol of existingPolicies) { + for (const m of pol.methods) { + provPerMethod[m.authentication_method].add(m.provider); + } + } + for (const methSelIndex in provSel) { + const prov = providers[provSel[methSelIndex]]; + provPerMethod[methodSelection[methSelIndex]].add(prov.url); + } + + let duplication = 0; + for (const provSet of provPerMethod) { + duplication += provSet.size; + } + + logger.info(`diversity ${diversity}, duplication ${duplication}`); + + if (!bestProvSel || diversity > bestDiversity) { + bestProvSel = provSel; + bestDiversity = diversity; + bestDuplication = duplication; + logger.info(`taking based on diversity`); + } else if (diversity == bestDiversity && duplication < bestDuplication) { + bestProvSel = provSel; + bestDiversity = diversity; + bestDuplication = duplication; + logger.info(`taking based on duplication`); + } + // TODO: also evaluate costs + } + + if (!bestProvSel) { + return undefined; + } + + return { + methods: bestProvSel.map((x, i) => ({ + authentication_method: methodSelection[i], + provider: providers[x].url, + })), + }; +} + +/** + * A provider selection maps a method selection index to a provider index. + */ +type ProviderSelection = number[]; + +/** + * Compute provider mappings. + * Enumerates all n-combinations with repetition of m providers. + */ +function enumerateProviderMappings( + n: number, + m: number, + limit?: number, +): ProviderSelection[] { + const selections: ProviderSelection[] = []; + const a = new Array(n); + const sel = (i: number, start: number = 0) => { + if (i === n) { + selections.push([...a]); + return; + } + for (let j = start; j < m; j++) { + a[i] = j; + sel(i + 1, j); + if (limit && selections.length >= limit) { + break; + } + } + }; + sel(0); + return selections; +} + +interface PolicySelectionResult { + policies: Policy[]; + policy_providers: PolicyProvider[]; +} + +type MethodSelection = number[]; + +/** + * Compute method selections. + * Enumerates all n-combinations without repetition of m methods. + */ +function enumerateMethodSelections( + n: number, + m: number, + limit?: number, +): MethodSelection[] { + const selections: MethodSelection[] = []; + const a = new Array(n); + const sel = (i: number, start: number = 0) => { + if (i === n) { + selections.push([...a]); + return; + } + for (let j = start; j < m; j++) { + a[i] = j; + sel(i + 1, j + 1); + if (limit && selections.length >= limit) { + break; + } + } + }; + sel(0); + return selections; +} diff --git a/packages/anastasis-core/src/provider-types.ts b/packages/anastasis-core/src/provider-types.ts index b477c09b9..f4d998e0a 100644 --- a/packages/anastasis-core/src/provider-types.ts +++ b/packages/anastasis-core/src/provider-types.ts @@ -1,4 +1,4 @@ -import { AmountString } from "@gnu-taler/taler-util"; +import { Amounts, AmountString } from "@gnu-taler/taler-util"; export interface EscrowConfigurationResponse { // Protocol identifier, clarifies that this is an Anastasis provider. @@ -72,3 +72,14 @@ export interface TruthUploadRequest { // store the truth? storage_duration_years: number; } + +export interface IbanExternalAuthResponse { + method: "iban"; + answer_code: number; + details: { + challenge_amount: AmountString; + credit_iban: string; + business_name: string; + wire_transfer_subject: string; + }; +} diff --git a/packages/anastasis-core/src/recovery-document-types.ts b/packages/anastasis-core/src/recovery-document-types.ts index 74003ccb1..3dc4481ff 100644 --- a/packages/anastasis-core/src/recovery-document-types.ts +++ b/packages/anastasis-core/src/recovery-document-types.ts @@ -1,5 +1,14 @@ import { TruthKey, TruthSalt, TruthUuid } from "./crypto.js"; +export enum ChallengeType { + Question = "question", + Sms = "sms", + Email = "email", + Post = "post", + Totp = "totp", + Iban = "iban", +} + export interface RecoveryDocument { /** * Human-readable name of the secret @@ -9,7 +18,7 @@ export interface RecoveryDocument { /** * Encrypted core secret. - * + * * Variable-size length, base32-crock encoded. */ encrypted_core_secret: string; @@ -56,7 +65,7 @@ export interface EscrowMethod { /** * Type of the escrow method (e.g. security question, SMS etc.). */ - escrow_type: string; + escrow_type: ChallengeType; /** * UUID of the escrow method. diff --git a/packages/anastasis-core/src/reducer-types.ts b/packages/anastasis-core/src/reducer-types.ts index 1a443bf9b..0f64be4eb 100644 --- a/packages/anastasis-core/src/reducer-types.ts +++ b/packages/anastasis-core/src/reducer-types.ts @@ -1,4 +1,15 @@ -import { Duration, Timestamp } from "@gnu-taler/taler-util"; +import { + AmountString, + buildCodecForObject, + codecForAny, + codecForList, + codecForNumber, + codecForString, + codecForTimestamp, + Duration, + Timestamp, +} from "@gnu-taler/taler-util"; +import { ChallengeFeedback } from "./challenge-feedback-types.js"; import { KeyShare } from "./crypto.js"; import { RecoveryDocument } from "./recovery-document-types.js"; @@ -23,7 +34,7 @@ export interface Policy { authentication_method: number; provider: string; }[]; -} +} export interface PolicyProvider { provider_url: string; @@ -47,7 +58,7 @@ export interface ReducerStateBackup { code?: undefined; currencies?: string[]; continents?: ContinentInfo[]; - countries?: any; + countries?: CountryInfo[]; identity_attributes?: { [n: string]: string }; authentication_providers?: { [url: string]: AuthenticationProviderStatus }; authentication_methods?: AuthMethod[]; @@ -56,21 +67,53 @@ export interface ReducerStateBackup { selected_country?: string; secret_name?: string; policies?: Policy[]; + + recovery_data?: { + /** + * Map from truth key (`${methodIndex}/${providerUrl}`) to + * the truth metadata. + */ + truth_metadata: Record<string, TruthMetaData>; + recovery_document: RecoveryDocument; + }; + /** * Policy providers are providers that we checked to be functional * and that are actually used in policies. */ policy_providers?: PolicyProvider[]; success_details?: SuccessDetails; + + /** + * Currently requested payments. + * + * List of taler://pay URIs. + * + * FIXME: There should be more information in this, + * including the provider and amount. + */ payments?: string[]; + + /** + * FIXME: Why is this not a map from provider to payto? + */ policy_payment_requests?: { + /** + * FIXME: This is not a payto URI, right?! + */ payto: string; provider: string; }[]; core_secret?: CoreSecret; - expiration?: Duration; + expiration?: Timestamp; + + upload_fees?: { fee: AmountString }[]; + + // FIXME: The payment secrets and pay URIs should + // probably be consolidated into a single field. + truth_upload_payment_secrets?: Record<string, string>; } export interface AuthMethod { @@ -93,6 +136,9 @@ export interface UserAttributeSpec { type: string; uuid: string; widget: string; + optional?: boolean; + "validation-regex": string | undefined; + "validation-logic": string | undefined; } export interface RecoveryInternalData { @@ -126,8 +172,8 @@ export interface ReducerStateRecovery { identity_attributes?: { [n: string]: string }; - continents?: any; - countries?: any; + continents?: ContinentInfo[]; + countries?: CountryInfo[]; selected_continent?: string; selected_country?: string; @@ -148,6 +194,18 @@ export interface ReducerStateRecovery { selected_challenge_uuid?: string; + /** + * Explicitly selected version by the user. + * FIXME: In the C reducer this is called "version". + */ + selected_version?: number; + + /** + * Explicitly selected provider URL by the user. + * FIXME: In the C reducer this is called "provider_url". + */ + selected_provider_url?: string; + challenge_feedback?: { [uuid: string]: ChallengeFeedback }; /** @@ -161,12 +219,35 @@ export interface ReducerStateRecovery { }; authentication_providers?: { [url: string]: AuthenticationProviderStatus }; - - recovery_error?: any; } -export interface ChallengeFeedback { - state: string; +/** + * Truth data as stored in the reducer. + */ +export interface TruthMetaData { + uuid: string; + + key_share: string; + + policy_index: number; + + pol_method_index: number; + + /** + * Nonce used for encrypting the truth. + */ + nonce: string; + + /** + * Key that the truth (i.e. secret question answer, email address, mobile number, ...) + * is encrypted with when stored at the provider. + */ + truth_key: string; + + /** + * Truth-specific salt. + */ + truth_salt: string; } export interface ReducerStateError { @@ -239,11 +320,16 @@ export interface ReducerStateBackupUserAttributesCollecting authentication_providers: { [url: string]: AuthenticationProviderStatus }; } -export interface ActionArgEnterUserAttributes { +export interface ActionArgsEnterUserAttributes { identity_attributes: Record<string, string>; } -export interface ActionArgAddAuthentication { +export const codecForActionArgsEnterUserAttributes = () => + buildCodecForObject<ActionArgsEnterUserAttributes>() + .property("identity_attributes", codecForAny()) + .build("ActionArgsEnterUserAttributes"); + +export interface ActionArgsAddAuthentication { authentication_method: { type: string; instructions: string; @@ -252,32 +338,134 @@ export interface ActionArgAddAuthentication { }; } -export interface ActionArgDeleteAuthentication { +export interface ActionArgsDeleteAuthentication { authentication_method: number; } -export interface ActionArgDeletePolicy { +export interface ActionArgsDeletePolicy { policy_index: number; } -export interface ActionArgEnterSecretName { +export interface ActionArgsEnterSecretName { name: string; } -export interface ActionArgEnterSecret { +export interface ActionArgsEnterSecret { secret: { value: string; mime?: string; }; - expiration: Duration; + expiration: Timestamp; +} + +export interface ActionArgsSelectContinent { + continent: string; +} + +export const codecForActionArgSelectContinent = () => + buildCodecForObject<ActionArgsSelectContinent>() + .property("continent", codecForString()) + .build("ActionArgSelectContinent"); + +export interface ActionArgsSelectCountry { + country_code: string; + currencies: string[]; } export interface ActionArgsSelectChallenge { uuid: string; } -export type ActionArgsSolveChallengeRequest = SolveChallengeAnswerRequest; - +export type ActionArgsSolveChallengeRequest = + | SolveChallengeAnswerRequest + | SolveChallengePinRequest + | SolveChallengeHashRequest; + +/** + * Answer to a challenge. + * + * For "question" challenges, this is a string with the answer. + * + * For "sms" / "email" / "post" this is a numeric code with optionally + * the "A-" prefix. + */ export interface SolveChallengeAnswerRequest { answer: string; } + +/** + * Answer to a challenge that requires a numeric response. + * + * XXX: Should be deprecated in favor of just "answer". + */ +export interface SolveChallengePinRequest { + pin: number; +} + +/** + * Answer to a challenge by directly providing the hash. + * + * XXX: When / why is this even used? + */ +export interface SolveChallengeHashRequest { + /** + * Base32-crock encoded hash code. + */ + hash: string; +} + +export interface PolicyMember { + authentication_method: number; + provider: string; +} + +export interface ActionArgsAddPolicy { + policy: PolicyMember[]; +} + +export interface ActionArgsUpdateExpiration { + expiration: Timestamp; +} + +export interface ActionArgsChangeVersion { + provider_url: string; + version: number; +} + +export interface ActionArgsUpdatePolicy { + policy_index: number; + policy: PolicyMember[]; +} + +export const codecForActionArgsChangeVersion = () => + buildCodecForObject<ActionArgsChangeVersion>() + .property("provider_url", codecForString()) + .property("version", codecForNumber()) + .build("ActionArgsChangeVersion"); + +export const codecForPolicyMember = () => + buildCodecForObject<PolicyMember>() + .property("authentication_method", codecForNumber()) + .property("provider", codecForString()) + .build("PolicyMember"); + +export const codecForActionArgsAddPolicy = () => + buildCodecForObject<ActionArgsAddPolicy>() + .property("policy", codecForList(codecForPolicyMember())) + .build("ActionArgsAddPolicy"); + +export const codecForActionArgsUpdateExpiration = () => + buildCodecForObject<ActionArgsUpdateExpiration>() + .property("expiration", codecForTimestamp) + .build("ActionArgsUpdateExpiration"); + +export const codecForActionArgsSelectChallenge = () => + buildCodecForObject<ActionArgsSelectChallenge>() + .property("uuid", codecForString()) + .build("ActionArgsSelectChallenge"); + +export const codecForActionArgSelectCountry = () => + buildCodecForObject<ActionArgsSelectCountry>() + .property("country_code", codecForString()) + .property("currencies", codecForList(codecForString())) + .build("ActionArgSelectCountry"); diff --git a/packages/anastasis-core/src/validators.ts b/packages/anastasis-core/src/validators.ts new file mode 100644 index 000000000..1c04bfdb3 --- /dev/null +++ b/packages/anastasis-core/src/validators.ts @@ -0,0 +1,28 @@ +function isPrime(num: number): boolean { + for (let i = 2, s = Math.sqrt(num); i <= s; i++) + if (num % i === 0) return false; + return num > 1; +} + +export function AL_NID_check(s: string): boolean { return true } +export function BE_NRN_check(s: string): boolean { return true } +export function CH_AHV_check(s: string): boolean { return true } +export function CZ_BN_check(s: string): boolean { return true } +export function DE_TIN_check(s: string): boolean { return true } +export function DE_SVN_check(s: string): boolean { return true } +export function ES_DNI_check(s: string): boolean { return true } +export function IN_AADHAR_check(s: string): boolean { return true } +export function IT_CF_check(s: string): boolean { + return true +} + +export function XX_SQUARE_check(s: string): boolean { + const n = parseInt(s, 10) + const r = Math.sqrt(n) + return n === r * r; +} +export function XY_PRIME_check(s: string): boolean { + const n = parseInt(s, 10) + return isPrime(n) +} + diff --git a/packages/anastasis-webui/.storybook/preview.js b/packages/anastasis-webui/.storybook/preview.js index 7cb9405ba..9ab4d9404 100644 --- a/packages/anastasis-webui/.storybook/preview.js +++ b/packages/anastasis-webui/.storybook/preview.js @@ -21,6 +21,12 @@ import { h } from 'preact'; export const parameters = { controls: { expanded: true }, + options: { + storySort: (a, b) => { + return (a[1].args.order ?? 0) - (b[1].args.order ?? 0) + // return a[1].kind === b[1].kind ? 0 : a[1].id.localeCompare(b[1].id, undefined, { numeric: true }) + } + }, } export const globalTypes = { diff --git a/packages/anastasis-webui/package.json b/packages/anastasis-webui/package.json index 57cfdd8d4..96d2d65f9 100644 --- a/packages/anastasis-webui/package.json +++ b/packages/anastasis-webui/package.json @@ -4,9 +4,9 @@ "version": "0.0.0", "license": "MIT", "scripts": { - "build": "preact build", + "build": "preact build --no-sw --no-esm", "serve": "sirv build --port 8080 --cors --single", - "dev": "preact watch", + "dev": "preact watch --no-sw --no-esm", "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", "test": "jest ./tests", "build-storybook": "build-storybook", @@ -25,37 +25,40 @@ "dependencies": { "@gnu-taler/taler-util": "workspace:^0.8.3", "anastasis-core": "workspace:^0.0.1", + "date-fns": "2.25.0", "jed": "1.1.1", - "preact": "^10.3.1", - "preact-render-to-string": "^5.1.4", - "preact-router": "^3.2.1" + "preact": "^10.5.15", + "preact-render-to-string": "^5.1.19", + "preact-router": "^3.2.1", + "qrcode-generator": "^1.4.4" }, "devDependencies": { "@creativebulma/bulma-tooltip": "^1.2.0", - "@storybook/addon-a11y": "^6.2.9", - "@storybook/addon-actions": "^6.2.9", - "@storybook/addon-essentials": "^6.2.9", - "@storybook/addon-links": "^6.2.9", - "@storybook/preact": "^6.2.9", + "@storybook/addon-a11y": "^6.3.12", + "@storybook/addon-actions": "^6.3.12", + "@storybook/addon-essentials": "^6.3.12", + "@storybook/addon-links": "^6.3.12", + "@storybook/preact": "^6.3.12", "@storybook/preset-scss": "^1.0.3", - "@types/enzyme": "^3.10.5", - "@types/jest": "^26.0.8", - "@typescript-eslint/eslint-plugin": "^2.25.0", - "@typescript-eslint/parser": "^2.25.0", + "@types/enzyme": "^3.10.10", + "@types/jest": "^27.0.2", + "@typescript-eslint/eslint-plugin": "^5.3.0", + "@typescript-eslint/parser": "^5.3.0", "bulma": "^0.9.3", "bulma-checkbox": "^1.1.1", "bulma-radio": "^1.1.1", "enzyme": "^3.11.0", - "enzyme-adapter-preact-pure": "^3.1.0", - "eslint": "^6.8.0", - "eslint-config-preact": "^1.1.1", - "jest": "^26.2.2", - "jest-preset-preact": "^4.0.2", - "preact-cli": "^3.2.2", - "sass": "^1.32.13", - "sass-loader": "^10.1.1", - "sirv-cli": "^1.0.0-next.3", - "typescript": "^3.7.5" + "enzyme-adapter-preact-pure": "^3.2.0", + "eslint": "^8.1.0", + "eslint-config-preact": "^1.2.0", + "jest": "^27.3.1", + "jest-preset-preact": "^4.0.5", + "jssha": "^3.2.0", + "preact-cli": "^3.3.1", + "sass": "1.32.13", + "sass-loader": "^10", + "sirv-cli": "^1.0.14", + "typescript": "^4.4.4" }, "jest": { "preset": "jest-preset-preact", diff --git a/packages/anastasis-webui/src/assets/empty.png b/packages/anastasis-webui/src/assets/empty.png Binary files differnew file mode 100644 index 000000000..5120d3138 --- /dev/null +++ b/packages/anastasis-webui/src/assets/empty.png diff --git a/packages/anastasis-webui/src/assets/example/id1.jpg b/packages/anastasis-webui/src/assets/example/id1.jpg Binary files differnew file mode 100644 index 000000000..5d022a379 --- /dev/null +++ b/packages/anastasis-webui/src/assets/example/id1.jpg diff --git a/packages/anastasis-webui/src/assets/icons/auth_method/email.svg b/packages/anastasis-webui/src/assets/icons/auth_method/email.svg new file mode 100644 index 000000000..3e44b8779 --- /dev/null +++ b/packages/anastasis-webui/src/assets/icons/auth_method/email.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6zm-2 0l-8 5-8-5h16zm0 12H4V8l8 5 8-5v10z"/></svg>
\ No newline at end of file diff --git a/packages/anastasis-webui/src/assets/icons/auth_method/postal.svg b/packages/anastasis-webui/src/assets/icons/auth_method/postal.svg new file mode 100644 index 000000000..3787b8350 --- /dev/null +++ b/packages/anastasis-webui/src/assets/icons/auth_method/postal.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M17 15h2v2h-2zM17 11h2v2h-2zM17 7h2v2h-2zM13.74 7l1.26.84V7z"/><path d="M10 3v1.51l2 1.33V5h9v14h-4v2h6V3z"/><path d="M8.17 5.7L15 10.25V21H1V10.48L8.17 5.7zM10 19h3v-7.84L8.17 8.09 3 11.38V19h3v-6h4v6z"/></svg>
\ No newline at end of file diff --git a/packages/anastasis-webui/src/assets/icons/auth_method/question.svg b/packages/anastasis-webui/src/assets/icons/auth_method/question.svg new file mode 100644 index 000000000..a346556b2 --- /dev/null +++ b/packages/anastasis-webui/src/assets/icons/auth_method/question.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M11 23.59v-3.6c-5.01-.26-9-4.42-9-9.49C2 5.26 6.26 1 11.5 1S21 5.26 21 10.5c0 4.95-3.44 9.93-8.57 12.4l-1.43.69zM11.5 3C7.36 3 4 6.36 4 10.5S7.36 18 11.5 18H13v2.3c3.64-2.3 6-6.08 6-9.8C19 6.36 15.64 3 11.5 3zm-1 11.5h2v2h-2zm2-1.5h-2c0-3.25 3-3 3-5 0-1.1-.9-2-2-2s-2 .9-2 2h-2c0-2.21 1.79-4 4-4s4 1.79 4 4c0 2.5-3 2.75-3 5z"/></svg>
\ No newline at end of file diff --git a/packages/anastasis-webui/src/assets/icons/auth_method/sms.svg b/packages/anastasis-webui/src/assets/icons/auth_method/sms.svg new file mode 100644 index 000000000..ed15679bf --- /dev/null +++ b/packages/anastasis-webui/src/assets/icons/auth_method/sms.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M17 1.01L7 1c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></svg>
\ No newline at end of file diff --git a/packages/anastasis-webui/src/assets/icons/auth_method/video.svg b/packages/anastasis-webui/src/assets/icons/auth_method/video.svg new file mode 100644 index 000000000..69de5e0b4 --- /dev/null +++ b/packages/anastasis-webui/src/assets/icons/auth_method/video.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><g><rect fill="none" height="24" width="24"/></g><g><g><path d="M18,10.48V6c0-1.1-0.9-2-2-2H4C2.9,4,2,4.9,2,6v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-4.48l4,3.98v-11L18,10.48z M16,9.69V18H4V6h12V9.69z"/><circle cx="10" cy="10" r="2"/><path d="M14,15.43c0-0.81-0.48-1.53-1.22-1.85C11.93,13.21,10.99,13,10,13c-0.99,0-1.93,0.21-2.78,0.58C6.48,13.9,6,14.62,6,15.43 V16h8V15.43z"/></g></g></svg>
\ No newline at end of file diff --git a/packages/anastasis-webui/src/components/AsyncButton.tsx b/packages/anastasis-webui/src/components/AsyncButton.tsx new file mode 100644 index 000000000..92bef2219 --- /dev/null +++ b/packages/anastasis-webui/src/components/AsyncButton.tsx @@ -0,0 +1,49 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { ComponentChildren, h, VNode } from "preact"; +// import { LoadingModal } from "../modal"; +import { useAsync } from "../hooks/async"; +// import { Translate } from "../../i18n"; + +type Props = { + children: ComponentChildren; + disabled?: boolean; + onClick?: () => Promise<void>; + [rest: string]: any; +}; + +export function AsyncButton({ onClick, disabled, children, ...rest }: Props): VNode { + const { isLoading, request } = useAsync(onClick); + + // if (isSlow) { + // return <LoadingModal onCancel={cancel} />; + // } + if (isLoading) { + return <button class="button">Loading...</button>; + } + + return <span data-tooltip={rest['data-tooltip']} style={{marginLeft: 5}}> + <button {...rest} onClick={request} disabled={disabled}> + {children} + </button> + </span>; +} diff --git a/packages/anastasis-webui/src/components/Notifications.tsx b/packages/anastasis-webui/src/components/Notifications.tsx new file mode 100644 index 000000000..c916020d7 --- /dev/null +++ b/packages/anastasis-webui/src/components/Notifications.tsx @@ -0,0 +1,59 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { h, VNode } from "preact"; + +export interface Notification { + message: string; + description?: string | VNode; + type: MessageType; +} + +export type MessageType = 'INFO' | 'WARN' | 'ERROR' | 'SUCCESS' + +interface Props { + notifications: Notification[]; + removeNotification?: (n: Notification) => void; +} + +function messageStyle(type: MessageType): string { + switch (type) { + case "INFO": return "message is-info"; + case "WARN": return "message is-warning"; + case "ERROR": return "message is-danger"; + case "SUCCESS": return "message is-success"; + default: return "message" + } +} + +export function Notifications({ notifications, removeNotification }: Props): VNode { + return <div class="block"> + {notifications.map((n,i) => <article key={i} class={messageStyle(n.type)}> + <div class="message-header"> + <p>{n.message}</p> + <button class="delete" onClick={() => removeNotification && removeNotification(n)} /> + </div> + {n.description && <div class="message-body"> + {n.description} + </div>} + </article>)} + </div> +}
\ No newline at end of file diff --git a/packages/anastasis-webui/src/components/QR.tsx b/packages/anastasis-webui/src/components/QR.tsx new file mode 100644 index 000000000..48f1a7c12 --- /dev/null +++ b/packages/anastasis-webui/src/components/QR.tsx @@ -0,0 +1,35 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +import { h, VNode } from "preact"; +import { useEffect, useRef } from "preact/hooks"; +import qrcode from "qrcode-generator"; + +export function QR({ text }: { text: string }): VNode { + const divRef = useRef<HTMLDivElement>(null); + useEffect(() => { + const qr = qrcode(0, 'L'); + qr.addData(text); + qr.make(); + if (divRef.current) divRef.current.innerHTML = qr.createSvgTag({ + scalable: true, + }); + }); + + return <div style={{ width: '100%', display: 'flex', flexDirection: 'column', alignItems: 'center' }}> + <div style={{ width: '50%', minWidth: 200, maxWidth: 300 }} ref={divRef} /> + </div>; +} diff --git a/packages/anastasis-webui/src/components/fields/DateInput.tsx b/packages/anastasis-webui/src/components/fields/DateInput.tsx new file mode 100644 index 000000000..3148c953f --- /dev/null +++ b/packages/anastasis-webui/src/components/fields/DateInput.tsx @@ -0,0 +1,74 @@ +import { format, isAfter, parse, sub, subYears } from "date-fns"; +import { h, VNode } from "preact"; +import { useLayoutEffect, useRef, useState } from "preact/hooks"; +import { DatePicker } from "../picker/DatePicker"; + +export interface DateInputProps { + label: string; + grabFocus?: boolean; + tooltip?: string; + error?: string; + years?: Array<number>; + bind: [string, (x: string) => void]; +} + +export function DateInput(props: DateInputProps): VNode { + const inputRef = useRef<HTMLInputElement>(null); + useLayoutEffect(() => { + if (props.grabFocus) { + inputRef.current?.focus(); + } + }, [props.grabFocus]); + const [opened, setOpened] = useState(false) + + const value = props.bind[0] || ""; + const [dirty, setDirty] = useState(false) + const showError = dirty && props.error + + const calendar = subYears(new Date(), 30) + + return <div class="field"> + <label class="label"> + {props.label} + {props.tooltip && <span class="icon has-tooltip-right" data-tooltip={props.tooltip}> + <i class="mdi mdi-information" /> + </span>} + </label> + <div class="control"> + <div class="field has-addons"> + <p class="control"> + <input + type="text" + class={showError ? 'input is-danger' : 'input'} + value={value} + onInput={(e) => { + const text = e.currentTarget.value + setDirty(true) + props.bind[1](text); + }} + ref={inputRef} /> + </p> + <p class="control"> + <a class="button" onClick={() => { setOpened(true) }}> + <span class="icon"><i class="mdi mdi-calendar" /></span> + </a> + </p> + </div> + </div> + <p class="help">Using the format yyyy-mm-dd</p> + {showError && <p class="help is-danger">{props.error}</p>} + <DatePicker + opened={opened} + initialDate={calendar} + years={props.years} + closeFunction={() => setOpened(false)} + dateReceiver={(d) => { + setDirty(true) + const v = format(d, 'yyyy-MM-dd') + props.bind[1](v); + }} + /> + </div> + ; + +} diff --git a/packages/anastasis-webui/src/components/fields/EmailInput.tsx b/packages/anastasis-webui/src/components/fields/EmailInput.tsx new file mode 100644 index 000000000..e21418fea --- /dev/null +++ b/packages/anastasis-webui/src/components/fields/EmailInput.tsx @@ -0,0 +1,44 @@ +import { h, VNode } from "preact"; +import { useLayoutEffect, useRef, useState } from "preact/hooks"; + +export interface TextInputProps { + label: string; + grabFocus?: boolean; + error?: string; + placeholder?: string; + tooltip?: string; + bind: [string, (x: string) => void]; +} + +export function EmailInput(props: TextInputProps): VNode { + const inputRef = useRef<HTMLInputElement>(null); + useLayoutEffect(() => { + if (props.grabFocus) { + inputRef.current?.focus(); + } + }, [props.grabFocus]); + const value = props.bind[0]; + const [dirty, setDirty] = useState(false) + const showError = dirty && props.error + return (<div class="field"> + <label class="label"> + {props.label} + {props.tooltip && <span class="icon has-tooltip-right" data-tooltip={props.tooltip}> + <i class="mdi mdi-information" /> + </span>} + </label> + <div class="control has-icons-right"> + <input + value={value} + required + placeholder={props.placeholder} + type="email" + class={showError ? 'input is-danger' : 'input'} + onInput={(e) => {setDirty(true); props.bind[1]((e.target as HTMLInputElement).value)}} + ref={inputRef} + style={{ display: "block" }} /> + </div> + {showError && <p class="help is-danger">{props.error}</p>} + </div> + ); +} diff --git a/packages/anastasis-webui/src/components/fields/FileInput.tsx b/packages/anastasis-webui/src/components/fields/FileInput.tsx new file mode 100644 index 000000000..8b144ea43 --- /dev/null +++ b/packages/anastasis-webui/src/components/fields/FileInput.tsx @@ -0,0 +1,81 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ +import { h, VNode } from "preact"; +import { useLayoutEffect, useRef, useState } from "preact/hooks"; +import { TextInputProps } from "./TextInput"; + +const MAX_IMAGE_UPLOAD_SIZE = 1024 * 1024 + +export function FileInput(props: TextInputProps): VNode { + const inputRef = useRef<HTMLInputElement>(null); + useLayoutEffect(() => { + if (props.grabFocus) { + inputRef.current?.focus(); + } + }, [props.grabFocus]); + + const value = props.bind[0]; + // const [dirty, setDirty] = useState(false) + const image = useRef<HTMLInputElement>(null) + const [sizeError, setSizeError] = useState(false) + function onChange(v: string): void { + // setDirty(true); + props.bind[1](v); + } + return <div class="field"> + <label class="label"> + <a onClick={() => image.current?.click()}> + {props.label} + </a> + {props.tooltip && <span class="icon has-tooltip-right" data-tooltip={props.tooltip}> + <i class="mdi mdi-information" /> + </span>} + </label> + <div class="control"> + <input + ref={image} style={{ display: 'none' }} + type="file" name={String(name)} + onChange={e => { + const f: FileList | null = e.currentTarget.files + if (!f || f.length != 1) { + return onChange("") + } + if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) { + setSizeError(true) + return onChange("") + } + setSizeError(false) + return f[0].arrayBuffer().then(b => { + const b64 = btoa( + new Uint8Array(b) + .reduce((data, byte) => data + String.fromCharCode(byte), '') + ) + return onChange(`data:${f[0].type};base64,${b64}` as any) + }) + }} /> + {props.error && <p class="help is-danger">{props.error}</p>} + {sizeError && <p class="help is-danger"> + File should be smaller than 1 MB + </p>} + </div> + </div> +} + diff --git a/packages/anastasis-webui/src/components/fields/ImageInput.tsx b/packages/anastasis-webui/src/components/fields/ImageInput.tsx new file mode 100644 index 000000000..d5bf643d4 --- /dev/null +++ b/packages/anastasis-webui/src/components/fields/ImageInput.tsx @@ -0,0 +1,81 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ +import { h, VNode } from "preact"; +import { useLayoutEffect, useRef, useState } from "preact/hooks"; +import emptyImage from "../../assets/empty.png"; +import { TextInputProps } from "./TextInput"; + +const MAX_IMAGE_UPLOAD_SIZE = 1024 * 1024 + +export function ImageInput(props: TextInputProps): VNode { + const inputRef = useRef<HTMLInputElement>(null); + useLayoutEffect(() => { + if (props.grabFocus) { + inputRef.current?.focus(); + } + }, [props.grabFocus]); + + const value = props.bind[0]; + // const [dirty, setDirty] = useState(false) + const image = useRef<HTMLInputElement>(null) + const [sizeError, setSizeError] = useState(false) + function onChange(v: string): void { + // setDirty(true); + props.bind[1](v); + } + return <div class="field"> + <label class="label"> + {props.label} + {props.tooltip && <span class="icon has-tooltip-right" data-tooltip={props.tooltip}> + <i class="mdi mdi-information" /> + </span>} + </label> + <div class="control"> + <img src={!value ? emptyImage : value} style={{ width: 200, height: 200 }} onClick={() => image.current?.click()} /> + <input + ref={image} style={{ display: 'none' }} + type="file" name={String(name)} + onChange={e => { + const f: FileList | null = e.currentTarget.files + if (!f || f.length != 1) { + return onChange(emptyImage) + } + if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) { + setSizeError(true) + return onChange(emptyImage) + } + setSizeError(false) + return f[0].arrayBuffer().then(b => { + const b64 = btoa( + new Uint8Array(b) + .reduce((data, byte) => data + String.fromCharCode(byte), '') + ) + return onChange(`data:${f[0].type};base64,${b64}` as any) + }) + }} /> + {props.error && <p class="help is-danger">{props.error}</p>} + {sizeError && <p class="help is-danger"> + Image should be smaller than 1 MB + </p>} + </div> + </div> +} + diff --git a/packages/anastasis-webui/src/components/fields/NumberInput.tsx b/packages/anastasis-webui/src/components/fields/NumberInput.tsx new file mode 100644 index 000000000..2afb242b8 --- /dev/null +++ b/packages/anastasis-webui/src/components/fields/NumberInput.tsx @@ -0,0 +1,43 @@ +import { h, VNode } from "preact"; +import { useLayoutEffect, useRef, useState } from "preact/hooks"; + +export interface TextInputProps { + label: string; + grabFocus?: boolean; + error?: string; + placeholder?: string; + tooltip?: string; + bind: [string, (x: string) => void]; +} + +export function NumberInput(props: TextInputProps): VNode { + const inputRef = useRef<HTMLInputElement>(null); + useLayoutEffect(() => { + if (props.grabFocus) { + inputRef.current?.focus(); + } + }, [props.grabFocus]); + const value = props.bind[0]; + const [dirty, setDirty] = useState(false) + const showError = dirty && props.error + return (<div class="field"> + <label class="label"> + {props.label} + {props.tooltip && <span class="icon has-tooltip-right" data-tooltip={props.tooltip}> + <i class="mdi mdi-information" /> + </span>} + </label> + <div class="control has-icons-right"> + <input + value={value} + type="number" + placeholder={props.placeholder} + class={showError ? 'input is-danger' : 'input'} + onInput={(e) => {setDirty(true); props.bind[1]((e.target as HTMLInputElement).value)}} + ref={inputRef} + style={{ display: "block" }} /> + </div> + {showError && <p class="help is-danger">{props.error}</p>} + </div> + ); +} diff --git a/packages/anastasis-webui/src/components/fields/TextInput.tsx b/packages/anastasis-webui/src/components/fields/TextInput.tsx new file mode 100644 index 000000000..c093689c5 --- /dev/null +++ b/packages/anastasis-webui/src/components/fields/TextInput.tsx @@ -0,0 +1,42 @@ +import { h, VNode } from "preact"; +import { useLayoutEffect, useRef, useState } from "preact/hooks"; + +export interface TextInputProps { + label: string; + grabFocus?: boolean; + error?: string; + placeholder?: string; + tooltip?: string; + bind: [string, (x: string) => void]; +} + +export function TextInput(props: TextInputProps): VNode { + const inputRef = useRef<HTMLInputElement>(null); + useLayoutEffect(() => { + if (props.grabFocus) { + inputRef.current?.focus(); + } + }, [props.grabFocus]); + const value = props.bind[0]; + const [dirty, setDirty] = useState(false) + const showError = dirty && props.error + return (<div class="field"> + <label class="label"> + {props.label} + {props.tooltip && <span class="icon has-tooltip-right" data-tooltip={props.tooltip}> + <i class="mdi mdi-information" /> + </span>} + </label> + <div class="control has-icons-right"> + <input + value={value} + placeholder={props.placeholder} + class={showError ? 'input is-danger' : 'input'} + onInput={(e) => {setDirty(true); props.bind[1]((e.target as HTMLInputElement).value)}} + ref={inputRef} + style={{ display: "block" }} /> + </div> + {showError && <p class="help is-danger">{props.error}</p>} + </div> + ); +} diff --git a/packages/anastasis-webui/src/components/menu/NavigationBar.tsx b/packages/anastasis-webui/src/components/menu/NavigationBar.tsx index e1bb4c7c0..935951ab9 100644 --- a/packages/anastasis-webui/src/components/menu/NavigationBar.tsx +++ b/packages/anastasis-webui/src/components/menu/NavigationBar.tsx @@ -49,7 +49,7 @@ export function NavigationBar({ onMobileMenu, title }: Props): VNode { </a> <div class="navbar-end"> <div class="navbar-item" style={{ paddingTop: 4, paddingBottom: 4 }}> - <LangSelector /> + {/* <LangSelector /> */} </div> </div> </div> diff --git a/packages/anastasis-webui/src/components/menu/SideBar.tsx b/packages/anastasis-webui/src/components/menu/SideBar.tsx index df582a5d0..72655662f 100644 --- a/packages/anastasis-webui/src/components/menu/SideBar.tsx +++ b/packages/anastasis-webui/src/components/menu/SideBar.tsx @@ -33,14 +33,15 @@ interface Props { export function Sidebar({ mobile }: Props): VNode { // const config = useConfigContext(); const config = { version: 'none' } + // FIXME: add replacement for __VERSION__ with the current version const process = { env: { __VERSION__: '0.0.0' } } const reducer = useAnastasisContext()! return ( <aside class="aside is-placed-left is-expanded"> - {mobile && <div class="footer" onClick={(e) => { return e.stopImmediatePropagation() }}> + {/* {mobile && <div class="footer" onClick={(e) => { return e.stopImmediatePropagation() }}> <LangSelector /> - </div>} + </div>} */} <div class="aside-tools"> <div class="aside-tools-label"> <div><b>Anastasis</b> Reducer</div> @@ -59,97 +60,84 @@ export function Sidebar({ mobile }: Props): VNode { {!reducer.currentReducerState && <li> <div class="ml-4"> - <span class="menu-item-label"><Translate>Start one options</Translate></span> + <span class="menu-item-label"><Translate>Select one option</Translate></span> </div> </li> } {reducer.currentReducerState && reducer.currentReducerState.backup_state ? <Fragment> - <li class={reducer.currentReducerState.backup_state === BackupStates.ContinentSelecting ? 'is-active' : ''}> + <li class={reducer.currentReducerState.backup_state === BackupStates.ContinentSelecting || + reducer.currentReducerState.backup_state === BackupStates.CountrySelecting ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>Continent selection</Translate></span> - </div> - </li> - <li class={reducer.currentReducerState.backup_state === BackupStates.CountrySelecting ? 'is-active' : ''}> - <div class="ml-4"> - <span class="menu-item-label"><Translate>Country selection</Translate></span> + <span class="menu-item-label"><Translate>Location</Translate></span> </div> </li> <li class={reducer.currentReducerState.backup_state === BackupStates.UserAttributesCollecting ? 'is-active' : ''}> <div class="ml-4"> - - <span class="menu-item-label"><Translate>User attributes</Translate></span> + <span class="menu-item-label"><Translate>Personal information</Translate></span> </div> </li> <li class={reducer.currentReducerState.backup_state === BackupStates.AuthenticationsEditing ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>Auth methods</Translate></span> + <span class="menu-item-label"><Translate>Authorization methods</Translate></span> </div> </li> <li class={reducer.currentReducerState.backup_state === BackupStates.PoliciesReviewing ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>PoliciesReviewing</Translate></span> + <span class="menu-item-label"><Translate>Policies</Translate></span> </div> </li> <li class={reducer.currentReducerState.backup_state === BackupStates.SecretEditing ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>SecretEditing</Translate></span> + <span class="menu-item-label"><Translate>Secret input</Translate></span> </div> </li> - <li class={reducer.currentReducerState.backup_state === BackupStates.PoliciesPaying ? 'is-active' : ''}> + {/* <li class={reducer.currentReducerState.backup_state === BackupStates.PoliciesPaying ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>PoliciesPaying</Translate></span> + <span class="menu-item-label"><Translate>Payment (optional)</Translate></span> </div> - </li> + </li> */} <li class={reducer.currentReducerState.backup_state === BackupStates.BackupFinished ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>BackupFinished</Translate></span> + <span class="menu-item-label"><Translate>Backup completed</Translate></span> </div> </li> - <li class={reducer.currentReducerState.backup_state === BackupStates.TruthsPaying ? 'is-active' : ''}> + {/* <li class={reducer.currentReducerState.backup_state === BackupStates.TruthsPaying ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>TruthsPaying</Translate></span> + <span class="menu-item-label"><Translate>Truth Paying</Translate></span> </div> - </li> + </li> */} </Fragment> : (reducer.currentReducerState && reducer.currentReducerState?.recovery_state && <Fragment> - <li class={reducer.currentReducerState.recovery_state === RecoveryStates.ContinentSelecting ? 'is-active' : ''}> + <li class={reducer.currentReducerState.recovery_state === RecoveryStates.ContinentSelecting || + reducer.currentReducerState.recovery_state === RecoveryStates.CountrySelecting ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>TruthsPaying</Translate></span> - </div> - </li> - <li class={reducer.currentReducerState.recovery_state === RecoveryStates.CountrySelecting ? 'is-active' : ''}> - <div class="ml-4"> - <span class="menu-item-label"><Translate>CountrySelecting</Translate></span> + <span class="menu-item-label"><Translate>Location</Translate></span> </div> </li> <li class={reducer.currentReducerState.recovery_state === RecoveryStates.UserAttributesCollecting ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>UserAttributesCollecting</Translate></span> + <span class="menu-item-label"><Translate>Personal information</Translate></span> </div> </li> <li class={reducer.currentReducerState.recovery_state === RecoveryStates.SecretSelecting ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>SecretSelecting</Translate></span> - </div> - </li> - <li class={reducer.currentReducerState.recovery_state === RecoveryStates.ChallengeSelecting ? 'is-active' : ''}> - <div class="ml-4"> - <span class="menu-item-label"><Translate>ChallengeSelecting</Translate></span> + <span class="menu-item-label"><Translate>Secret selection</Translate></span> </div> </li> - <li class={reducer.currentReducerState.recovery_state === RecoveryStates.ChallengeSolving ? 'is-active' : ''}> + <li class={reducer.currentReducerState.recovery_state === RecoveryStates.ChallengeSelecting || + reducer.currentReducerState.recovery_state === RecoveryStates.ChallengeSolving ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>ChallengeSolving</Translate></span> + <span class="menu-item-label"><Translate>Solve Challenges</Translate></span> </div> </li> <li class={reducer.currentReducerState.recovery_state === RecoveryStates.RecoveryFinished ? 'is-active' : ''}> <div class="ml-4"> - <span class="menu-item-label"><Translate>RecoveryFinished</Translate></span> + <span class="menu-item-label"><Translate>Secret recovered</Translate></span> </div> </li> </Fragment>)} diff --git a/packages/anastasis-webui/src/components/picker/DatePicker.tsx b/packages/anastasis-webui/src/components/picker/DatePicker.tsx new file mode 100644 index 000000000..eb5d8145d --- /dev/null +++ b/packages/anastasis-webui/src/components/picker/DatePicker.tsx @@ -0,0 +1,326 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { h, Component } from "preact"; + +interface Props { + closeFunction?: () => void; + dateReceiver?: (d: Date) => void; + initialDate?: Date; + years?: Array<number>; + opened?: boolean; +} +interface State { + displayedMonth: number; + displayedYear: number; + selectYearMode: boolean; + currentDate: Date; +} +const now = new Date() + +const monthArrShortFull = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December' +] + +const monthArrShort = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec' +] + +const dayArr = [ + 'Sun', + 'Mon', + 'Tue', + 'Wed', + 'Thu', + 'Fri', + 'Sat' +] + +const yearArr: number[] = [] + + +// inspired by https://codepen.io/m4r1vs/pen/MOOxyE +export class DatePicker extends Component<Props, State> { + + closeDatePicker() { + this.props.closeFunction && this.props.closeFunction(); // Function gets passed by parent + } + + /** + * Gets fired when a day gets clicked. + * @param {object} e The event thrown by the <span /> element clicked + */ + dayClicked(e: any) { + + const element = e.target; // the actual element clicked + + if (element.innerHTML === '') return false; // don't continue if <span /> empty + + // get date from clicked element (gets attached when rendered) + const date = new Date(element.getAttribute('data-value')); + + // update the state + this.setState({ currentDate: date }); + this.passDateToParent(date) + } + + /** + * returns days in month as array + * @param {number} month the month to display + * @param {number} year the year to display + */ + getDaysByMonth(month: number, year: number) { + + const calendar = []; + + const date = new Date(year, month, 1); // month to display + + const firstDay = new Date(year, month, 1).getDay(); // first weekday of month + const lastDate = new Date(year, month + 1, 0).getDate(); // last date of month + + let day: number | null = 0; + + // the calendar is 7*6 fields big, so 42 loops + for (let i = 0; i < 42; i++) { + + if (i >= firstDay && day !== null) day = day + 1; + if (day !== null && day > lastDate) day = null; + + // append the calendar Array + calendar.push({ + day: (day === 0 || day === null) ? null : day, // null or number + date: (day === 0 || day === null) ? null : new Date(year, month, day), // null or Date() + today: (day === now.getDate() && month === now.getMonth() && year === now.getFullYear()) // boolean + }); + } + + return calendar; + } + + /** + * Display previous month by updating state + */ + displayPrevMonth() { + if (this.state.displayedMonth <= 0) { + this.setState({ + displayedMonth: 11, + displayedYear: this.state.displayedYear - 1 + }); + } + else { + this.setState({ + displayedMonth: this.state.displayedMonth - 1 + }); + } + } + + /** + * Display next month by updating state + */ + displayNextMonth() { + if (this.state.displayedMonth >= 11) { + this.setState({ + displayedMonth: 0, + displayedYear: this.state.displayedYear + 1 + }); + } + else { + this.setState({ + displayedMonth: this.state.displayedMonth + 1 + }); + } + } + + /** + * Display the selected month (gets fired when clicking on the date string) + */ + displaySelectedMonth() { + if (this.state.selectYearMode) { + this.toggleYearSelector(); + } + else { + if (!this.state.currentDate) return false; + this.setState({ + displayedMonth: this.state.currentDate.getMonth(), + displayedYear: this.state.currentDate.getFullYear() + }); + } + } + + toggleYearSelector() { + this.setState({ selectYearMode: !this.state.selectYearMode }); + } + + changeDisplayedYear(e: any) { + const element = e.target; + this.toggleYearSelector(); + this.setState({ displayedYear: parseInt(element.innerHTML, 10), displayedMonth: 0 }); + } + + /** + * Pass the selected date to parent when 'OK' is clicked + */ + passSavedDateDateToParent() { + this.passDateToParent(this.state.currentDate) + } + passDateToParent(date: Date) { + if (typeof this.props.dateReceiver === 'function') this.props.dateReceiver(date); + this.closeDatePicker(); + } + + componentDidUpdate() { + // if (this.state.selectYearMode) { + // document.getElementsByClassName('selected')[0].scrollIntoView(); // works in every browser incl. IE, replace with scrollIntoViewIfNeeded when browsers support it + // } + } + + constructor(props: any) { + super(props); + + this.closeDatePicker = this.closeDatePicker.bind(this); + this.dayClicked = this.dayClicked.bind(this); + this.displayNextMonth = this.displayNextMonth.bind(this); + this.displayPrevMonth = this.displayPrevMonth.bind(this); + this.getDaysByMonth = this.getDaysByMonth.bind(this); + this.changeDisplayedYear = this.changeDisplayedYear.bind(this); + this.passDateToParent = this.passDateToParent.bind(this); + this.toggleYearSelector = this.toggleYearSelector.bind(this); + this.displaySelectedMonth = this.displaySelectedMonth.bind(this); + + const initial = props.initialDate || now; + + this.state = { + currentDate: initial, + displayedMonth: initial.getMonth(), + displayedYear: initial.getFullYear(), + selectYearMode: false + } + } + + render() { + + const { currentDate, displayedMonth, displayedYear, selectYearMode } = this.state; + + return ( + <div> + <div class={`datePicker ${ this.props.opened && "datePicker--opened"}`}> + + <div class="datePicker--titles"> + <h3 style={{ + color: selectYearMode ? 'rgba(255,255,255,.87)' : 'rgba(255,255,255,.57)' + }} onClick={this.toggleYearSelector}>{currentDate.getFullYear()}</h3> + <h2 style={{ + color: !selectYearMode ? 'rgba(255,255,255,.87)' : 'rgba(255,255,255,.57)' + }} onClick={this.displaySelectedMonth}> + {dayArr[currentDate.getDay()]}, {monthArrShort[currentDate.getMonth()]} {currentDate.getDate()} + </h2> + </div> + + {!selectYearMode && <nav> + <span onClick={this.displayPrevMonth} class="icon"><i style={{ transform: 'rotate(180deg)' }} class="mdi mdi-forward" /></span> + <h4>{monthArrShortFull[displayedMonth]} {displayedYear}</h4> + <span onClick={this.displayNextMonth} class="icon"><i class="mdi mdi-forward" /></span> + </nav>} + + <div class="datePicker--scroll"> + + {!selectYearMode && <div class="datePicker--calendar" > + + <div class="datePicker--dayNames"> + {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((day,i) => <span key={i}>{day}</span>)} + </div> + + <div onClick={this.dayClicked} class="datePicker--days"> + + {/* + Loop through the calendar object returned by getDaysByMonth(). + */} + + {this.getDaysByMonth(this.state.displayedMonth, this.state.displayedYear) + .map( + day => { + let selected = false; + + if (currentDate && day.date) selected = (currentDate.toLocaleDateString() === day.date.toLocaleDateString()); + + return (<span key={day.day} + class={(day.today ? 'datePicker--today ' : '') + (selected ? 'datePicker--selected' : '')} + disabled={!day.date} + data-value={day.date} + > + {day.day} + </span>) + } + ) + } + + </div> + + </div>} + + {selectYearMode && <div class="datePicker--selectYear"> + {(this.props.years || yearArr).map(year => ( + <span key={year} class={(year === displayedYear) ? 'selected' : ''} onClick={this.changeDisplayedYear}> + {year} + </span> + ))} + + </div>} + + </div> + </div> + + <div class="datePicker--background" onClick={this.closeDatePicker} style={{ + display: this.props.opened ? 'block' : 'none', + }} + /> + + </div> + ) + } +} + + +for (let i = 2010; i <= now.getFullYear() + 10; i++) { + yearArr.push(i); +} diff --git a/packages/anastasis-webui/src/components/picker/DurationPicker.stories.tsx b/packages/anastasis-webui/src/components/picker/DurationPicker.stories.tsx new file mode 100644 index 000000000..275c80fa6 --- /dev/null +++ b/packages/anastasis-webui/src/components/picker/DurationPicker.stories.tsx @@ -0,0 +1,50 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { h, FunctionalComponent } from 'preact'; +import { useState } from 'preact/hooks'; +import { DurationPicker as TestedComponent } from './DurationPicker'; + + +export default { + title: 'Components/Picker/Duration', + component: TestedComponent, + argTypes: { + onCreate: { action: 'onCreate' }, + goBack: { action: 'goBack' }, + } +}; + +function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) { + const r = (args: any) => <Component {...args} /> + r.args = props + return r +} + +export const Example = createExample(TestedComponent, { + days: true, minutes: true, hours: true, seconds: true, + value: 10000000 +}); + +export const WithState = () => { + const [v,s] = useState<number>(1000000) + return <TestedComponent value={v} onChange={s} days minutes hours seconds /> +} diff --git a/packages/anastasis-webui/src/components/picker/DurationPicker.tsx b/packages/anastasis-webui/src/components/picker/DurationPicker.tsx new file mode 100644 index 000000000..235a63e2d --- /dev/null +++ b/packages/anastasis-webui/src/components/picker/DurationPicker.tsx @@ -0,0 +1,154 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { h, VNode } from "preact"; +import { useState } from "preact/hooks"; +import { useTranslator } from "../../i18n"; +import "../../scss/DurationPicker.scss"; + +export interface Props { + hours?: boolean; + minutes?: boolean; + seconds?: boolean; + days?: boolean; + onChange: (value: number) => void; + value: number +} + +// inspiration taken from https://github.com/flurmbo/react-duration-picker +export function DurationPicker({ days, hours, minutes, seconds, onChange, value }: Props): VNode { + const ss = 1000 + const ms = ss * 60 + const hs = ms * 60 + const ds = hs * 24 + const i18n = useTranslator() + + return <div class="rdp-picker"> + {days && <DurationColumn unit={i18n`days`} max={99} + value={Math.floor(value / ds)} + onDecrease={value >= ds ? () => onChange(value - ds) : undefined} + onIncrease={value < 99 * ds ? () => onChange(value + ds) : undefined} + onChange={diff => onChange(value + diff * ds)} + />} + {hours && <DurationColumn unit={i18n`hours`} max={23} min={1} + value={Math.floor(value / hs) % 24} + onDecrease={value >= hs ? () => onChange(value - hs) : undefined} + onIncrease={value < 99 * ds ? () => onChange(value + hs) : undefined} + onChange={diff => onChange(value + diff * hs)} + />} + {minutes && <DurationColumn unit={i18n`minutes`} max={59} min={1} + value={Math.floor(value / ms) % 60} + onDecrease={value >= ms ? () => onChange(value - ms) : undefined} + onIncrease={value < 99 * ds ? () => onChange(value + ms) : undefined} + onChange={diff => onChange(value + diff * ms)} + />} + {seconds && <DurationColumn unit={i18n`seconds`} max={59} + value={Math.floor(value / ss) % 60} + onDecrease={value >= ss ? () => onChange(value - ss) : undefined} + onIncrease={value < 99 * ds ? () => onChange(value + ss) : undefined} + onChange={diff => onChange(value + diff * ss)} + />} + </div> +} + +interface ColProps { + unit: string, + min?: number, + max: number, + value: number, + onIncrease?: () => void; + onDecrease?: () => void; + onChange?: (diff: number) => void; +} + +function InputNumber({ initial, onChange }: { initial: number, onChange: (n: number) => void }) { + const [value, handler] = useState<{v:string}>({ + v: toTwoDigitString(initial) + }) + + return <input + value={value.v} + onBlur={(e) => onChange(parseInt(value.v, 10))} + onInput={(e) => { + e.preventDefault() + const n = Number.parseInt(e.currentTarget.value, 10); + if (isNaN(n)) return handler({v:toTwoDigitString(initial)}) + return handler({v:toTwoDigitString(n)}) + }} + style={{ width: 50, border: 'none', fontSize: 'inherit', background: 'inherit' }} /> +} + +function DurationColumn({ unit, min = 0, max, value, onIncrease, onDecrease, onChange }: ColProps): VNode { + + const cellHeight = 35 + return ( + <div class="rdp-column-container"> + <div class="rdp-masked-div"> + <hr class="rdp-reticule" style={{ top: cellHeight * 2 - 1 }} /> + <hr class="rdp-reticule" style={{ top: cellHeight * 3 - 1 }} /> + + <div class="rdp-column" style={{ top: 0 }}> + + <div class="rdp-cell" key={value - 2}> + {onDecrease && <button style={{ width: '100%', textAlign: 'center', margin: 5 }} + onClick={onDecrease}> + <span class="icon"> + <i class="mdi mdi-chevron-up" /> + </span> + </button>} + </div> + <div class="rdp-cell" key={value - 1}> + {value > min ? toTwoDigitString(value - 1) : ''} + </div> + <div class="rdp-cell rdp-center" key={value}> + {onChange ? + <InputNumber initial={value} onChange={(n) => onChange(n - value)} /> : + toTwoDigitString(value) + } + <div>{unit}</div> + </div> + + <div class="rdp-cell" key={value + 1}> + {value < max ? toTwoDigitString(value + 1) : ''} + </div> + + <div class="rdp-cell" key={value + 2}> + {onIncrease && <button style={{ width: '100%', textAlign: 'center', margin: 5 }} + onClick={onIncrease}> + <span class="icon"> + <i class="mdi mdi-chevron-down" /> + </span> + </button>} + </div> + + </div> + </div> + </div> + ); +} + + +function toTwoDigitString(n: number) { + if (n < 10) { + return `0${n}`; + } + return `${n}`; +}
\ No newline at end of file diff --git a/packages/anastasis-webui/src/declaration.d.ts b/packages/anastasis-webui/src/declaration.d.ts index b32fb70fc..2c4b7cb3a 100644 --- a/packages/anastasis-webui/src/declaration.d.ts +++ b/packages/anastasis-webui/src/declaration.d.ts @@ -10,8 +10,11 @@ declare module '*.jpeg' { const content: any; export default content; } +declare module '*.png' { + const content: any; + export default content; +} declare module 'jed' { const x: any; export = x; - } -
\ No newline at end of file +} diff --git a/packages/anastasis-webui/src/hooks/async.ts b/packages/anastasis-webui/src/hooks/async.ts new file mode 100644 index 000000000..ea3ff6acf --- /dev/null +++ b/packages/anastasis-webui/src/hooks/async.ts @@ -0,0 +1,77 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ +import { useState } from "preact/hooks"; +// import { cancelPendingRequest } from "./backend"; + +export interface Options { + slowTolerance: number; +} + +export interface AsyncOperationApi<T> { + request: (...a: any) => void; + cancel: () => void; + data: T | undefined; + isSlow: boolean; + isLoading: boolean; + error: string | undefined; +} + +export function useAsync<T>(fn?: (...args: any) => Promise<T>, { slowTolerance: tooLong }: Options = { slowTolerance: 1000 }): AsyncOperationApi<T> { + const [data, setData] = useState<T | undefined>(undefined); + const [isLoading, setLoading] = useState<boolean>(false); + const [error, setError] = useState<any>(undefined); + const [isSlow, setSlow] = useState(false) + + const request = async (...args: any) => { + if (!fn) return; + setLoading(true); + const handler = setTimeout(() => { + setSlow(true) + }, tooLong) + + try { + console.log("calling async", args) + const result = await fn(...args); + console.log("async back", result) + setData(result); + } catch (error) { + setError(error); + } + setLoading(false); + setSlow(false) + clearTimeout(handler) + }; + + function cancel() { + // cancelPendingRequest() + setLoading(false); + setSlow(false) + } + + return { + request, + cancel, + data, + isSlow, + isLoading, + error + }; +} diff --git a/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts b/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts index 72594749d..1ef28a168 100644 --- a/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts +++ b/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts @@ -1,5 +1,12 @@ import { TalerErrorCode } from "@gnu-taler/taler-util"; -import { BackupStates, getBackupStartState, getRecoveryStartState, RecoveryStates, reduceAction, ReducerState } from "anastasis-core"; +import { + BackupStates, + getBackupStartState, + getRecoveryStartState, + RecoveryStates, + reduceAction, + ReducerState, +} from "anastasis-core"; import { useState } from "preact/hooks"; const reducerBaseUrl = "http://localhost:5000/"; @@ -98,13 +105,15 @@ export interface AnastasisReducerApi { startBackup: () => void; startRecover: () => void; reset: () => void; - back: () => void; - transition(action: string, args: any): void; + back: () => Promise<void>; + transition(action: string, args: any): Promise<void>; /** * Run multiple reducer steps in a transaction without * affecting the UI-visible transition state in-between. */ - runTransaction(f: (h: ReducerTransactionHandle) => Promise<void>): void; + runTransaction( + f: (h: ReducerTransactionHandle) => Promise<void>, + ): Promise<void>; } function storageGet(key: string): string | null { @@ -222,9 +231,9 @@ export function useAnastasisReducer(): AnastasisReducerApi { } }, transition(action: string, args: any) { - doTransition(action, args); + return doTransition(action, args); }, - back() { + async back() { const reducerState = anastasisState.reducerState; if (!reducerState) { return; @@ -239,7 +248,7 @@ export function useAnastasisReducer(): AnastasisReducerApi { reducerState: undefined, }); } else { - doTransition("back", {}); + await doTransition("back", {}); } }, dismissError() { @@ -252,30 +261,27 @@ export function useAnastasisReducer(): AnastasisReducerApi { reducerState: undefined, }); }, - runTransaction(f) { - async function run() { - const txHandle = new ReducerTxImpl(anastasisState.reducerState!); - try { - await f(txHandle); - } catch (e) { - console.log("exception during reducer transaction", e); - } - const s = txHandle.transactionState; - console.log("transaction finished, new state", s); - if (s.code !== undefined) { - setAnastasisState({ - ...anastasisState, - currentError: txHandle.transactionState, - }); - } else { - setAnastasisState({ - ...anastasisState, - reducerState: txHandle.transactionState, - currentError: undefined, - }); - } + async runTransaction(f) { + const txHandle = new ReducerTxImpl(anastasisState.reducerState!); + try { + await f(txHandle); + } catch (e) { + console.log("exception during reducer transaction", e); + } + const s = txHandle.transactionState; + console.log("transaction finished, new state", s); + if (s.code !== undefined) { + setAnastasisState({ + ...anastasisState, + currentError: txHandle.transactionState, + }); + } else { + setAnastasisState({ + ...anastasisState, + reducerState: txHandle.transactionState, + currentError: undefined, + }); } - run(); }, }; } diff --git a/packages/anastasis-webui/src/pages/home/AddingProviderScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/AddingProviderScreen.stories.tsx new file mode 100644 index 000000000..43807fefe --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/AddingProviderScreen.stories.tsx @@ -0,0 +1,50 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { ReducerState } from 'anastasis-core'; +import { createExample, reducerStatesExample } from '../../utils'; +import { AddingProviderScreen as TestedComponent } from './AddingProviderScreen'; + + +export default { + title: 'Pages/backup/AddingProviderScreen', + component: TestedComponent, + args: { + order: 4, + }, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +export const NewProvider = createExample(TestedComponent, { + ...reducerStatesExample.authEditing, +} as ReducerState); + +export const NewSMSProvider = createExample(TestedComponent, { + ...reducerStatesExample.authEditing, +} as ReducerState, { providerType: 'sms'}); + +export const NewIBANProvider = createExample(TestedComponent, { + ...reducerStatesExample.authEditing, +} as ReducerState, { providerType: 'iban' }); diff --git a/packages/anastasis-webui/src/pages/home/AddingProviderScreen.tsx b/packages/anastasis-webui/src/pages/home/AddingProviderScreen.tsx new file mode 100644 index 000000000..9c83da49e --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/AddingProviderScreen.tsx @@ -0,0 +1,101 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { + encodeCrock, + stringToBytes +} from "@gnu-taler/taler-util"; +import { h, VNode } from "preact"; +import { useLayoutEffect, useRef, useState } from "preact/hooks"; +import { TextInput } from "../../components/fields/TextInput"; +import { authMethods, KnownAuthMethods } from "./authMethod"; +import { AnastasisClientFrame } from "./index"; + +interface Props { + providerType?: KnownAuthMethods; + cancel: () => void; +} +export function AddingProviderScreen({ providerType, cancel }: Props): VNode { + const [providerURL, setProviderURL] = useState(""); + const [error, setError] = useState<string | undefined>() + const providerLabel = providerType ? authMethods[providerType].label : undefined + + function testProvider(): void { + setError(undefined) + + fetch(`${providerURL}/config`) + .then(r => r.json().catch(d => ({}))) + .then(r => { + if (!("methods" in r) || !Array.isArray(r.methods)) { + setError("This provider doesn't have authentication method. Check the provider URL") + return; + } + if (!providerLabel) { + setError("") + return + } + let found = false + for (let i = 0; i < r.methods.length && !found; i++) { + found = r.methods[i].type !== providerType + } + if (!found) { + setError(`This provider does not support authentication method ${providerLabel}`) + } + }) + .catch(e => { + setError(`There was an error testing this provider, try another one. ${e.message}`) + }) + + } + function addProvider(): void { + // addAuthMethod({ + // authentication_method: { + // type: "sms", + // instructions: `SMS to ${providerURL}`, + // challenge: encodeCrock(stringToBytes(providerURL)), + // }, + // }); + } + const inputRef = useRef<HTMLInputElement>(null); + useLayoutEffect(() => { + inputRef.current?.focus(); + }, []); + + let errors = !providerURL ? 'Add provider URL' : undefined + try { + new URL(providerURL) + } catch { + errors = 'Check the URL' + } + if (!!error && !errors) { + errors = error + } + + return ( + <AnastasisClientFrame hideNav + title={!providerLabel ? `Backup: Adding a provider` : `Backup: Adding a ${providerLabel} provider`} + hideNext={errors}> + <div> + <p> + Add a provider url {errors} + </p> + <div class="container"> + <TextInput + label="Provider URL" + placeholder="https://provider.com" + grabFocus + bind={[providerURL, setProviderURL]} /> + </div> + {!!error && <p class="block has-text-danger">{error}</p>} + {error === "" && <p class="block has-text-success">This provider worked!</p>} + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={testProvider}>TEST</button> + </div> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <span data-tooltip={errors}> + <button class="button is-info" disabled={errors !== undefined} onClick={addProvider}>Add</button> + </span> + </div> + </div> + </AnastasisClientFrame> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.stories.tsx index d28a6df43..549686616 100644 --- a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.stories.tsx @@ -28,36 +28,103 @@ import { AttributeEntryScreen as TestedComponent } from './AttributeEntryScreen' export default { title: 'Pages/AttributeEntryScreen', component: TestedComponent, + args: { + order: 4, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, }, }; -export const WithSomeAttributes = createExample(TestedComponent, { - ...reducerStatesExample.attributeEditing, +export const Backup = createExample(TestedComponent, { + ...reducerStatesExample.backupAttributeEditing, + required_attributes: [{ + name: 'first name', + label: 'first', + type: 'string', + uuid: 'asdasdsa1', + widget: 'wid', + }, { + name: 'last name', + label: 'second', + type: 'string', + uuid: 'asdasdsa2', + widget: 'wid', + }, { + name: 'birthdate', + label: 'birthdate', + type: 'date', + uuid: 'asdasdsa3', + widget: 'calendar', + }] +} as ReducerState); + +export const Recovery = createExample(TestedComponent, { + ...reducerStatesExample.recoveryAttributeEditing, required_attributes: [{ name: 'first', label: 'first', - type: 'type', + type: 'string', uuid: 'asdasdsa1', widget: 'wid', }, { name: 'pepe', label: 'second', - type: 'type', + type: 'string', uuid: 'asdasdsa2', widget: 'wid', }, { name: 'pepe2', label: 'third', - type: 'type', + type: 'date', uuid: 'asdasdsa3', widget: 'calendar', }] } as ReducerState); -export const Empty = createExample(TestedComponent, { - ...reducerStatesExample.attributeEditing, +export const WithNoRequiredAttribute = createExample(TestedComponent, { + ...reducerStatesExample.backupAttributeEditing, required_attributes: undefined } as ReducerState); + +const allWidgets = [ + "anastasis_gtk_ia_aadhar_in", + "anastasis_gtk_ia_ahv", + "anastasis_gtk_ia_birthdate", + "anastasis_gtk_ia_birthnumber_cz", + "anastasis_gtk_ia_birthnumber_sk", + "anastasis_gtk_ia_birthplace", + "anastasis_gtk_ia_cf_it", + "anastasis_gtk_ia_cpr_dk", + "anastasis_gtk_ia_es_dni", + "anastasis_gtk_ia_es_ssn", + "anastasis_gtk_ia_full_name", + "anastasis_gtk_ia_my_jp", + "anastasis_gtk_ia_nid_al", + "anastasis_gtk_ia_nid_be", + "anastasis_gtk_ia_ssn_de", + "anastasis_gtk_ia_ssn_us", + "anastasis_gtk_ia_tax_de", + "anastasis_gtk_xx_prime", + "anastasis_gtk_xx_square", +] + +function typeForWidget(name: string): string { + if (["anastasis_gtk_xx_prime", + "anastasis_gtk_xx_square", + ].includes(name)) return "number"; + if (["anastasis_gtk_ia_birthdate"].includes(name)) return "date" + return "string"; +} + +export const WithAllPosibleWidget = createExample(TestedComponent, { + ...reducerStatesExample.backupAttributeEditing, + required_attributes: allWidgets.map(w => ({ + name: w, + label: `widget: ${w}`, + type: typeForWidget(w), + uuid: `uuid-${w}`, + widget: w + })) +} as ReducerState); diff --git a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx index 2f804f940..f86994c97 100644 --- a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx @@ -1,10 +1,13 @@ /* eslint-disable @typescript-eslint/camelcase */ -import { h, VNode } from "preact"; +import { UserAttributeSpec, validators } from "anastasis-core"; +import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; -import { ReducerStateRecovery, ReducerStateBackup, UserAttributeSpec } from "anastasis-core/lib"; import { useAnastasisContext } from "../../context/anastasis"; -import { AnastasisReducerApi } from "../../hooks/use-anastasis-reducer"; -import { AnastasisClientFrame, withProcessLabel, LabeledInput } from "./index"; +import { AnastasisClientFrame, withProcessLabel } from "./index"; +import { TextInput } from "../../components/fields/TextInput"; +import { DateInput } from "../../components/fields/DateInput"; +import { NumberInput } from "../../components/fields/NumberInput"; +import { isAfter, parse } from "date-fns"; export function AttributeEntryScreen(): VNode { const reducer = useAnastasisContext() @@ -18,48 +21,139 @@ export function AttributeEntryScreen(): VNode { if (!reducer.currentReducerState || !("required_attributes" in reducer.currentReducerState)) { return <div>invalid state</div> } - + const reqAttr = reducer.currentReducerState.required_attributes || [] + let hasErrors = false; + + const fieldList: VNode[] = reqAttr.map((spec, i: number) => { + const value = attrs[spec.name] + const error = checkIfValid(value, spec) + hasErrors = hasErrors || error !== undefined + return ( + <AttributeEntryField + key={i} + isFirst={i == 0} + setValue={(v: string) => setAttrs({ ...attrs, [spec.name]: v })} + spec={spec} + errorMessage={error} + value={value} /> + ); + }) + return ( <AnastasisClientFrame - title={withProcessLabel(reducer, "Select Country")} + title={withProcessLabel(reducer, "Who are you?")} + hideNext={hasErrors ? "Complete the form." : undefined} onNext={() => reducer.transition("enter_user_attributes", { identity_attributes: attrs, })} > - {reducer.currentReducerState.required_attributes?.map((x, i: number) => { - return ( - <AttributeEntryField - key={i} - isFirst={i == 0} - setValue={(v: string) => setAttrs({ ...attrs, [x.name]: v })} - spec={x} - value={attrs[x.name]} /> - ); - })} + <div class="columns" style={{ maxWidth: 'unset' }}> + <div class="column is-half"> + {fieldList} + </div> + <div class="column is-is-half" > + <p>This personal information will help to locate your secret.</p> + <h1 class="title">This stays private</h1> + <p>The information you have entered here:</p> + <ul> + <li> + <span class="icon is-right"> + <i class="mdi mdi-circle-small" /> + </span> + Will be hashed, and therefore unreadable + </li> + <li><span class="icon is-right"> + <i class="mdi mdi-circle-small" /> + </span>The non-hashed version is not shared</li> + </ul> + </div> + </div> </AnastasisClientFrame> ); } -interface AttributeEntryProps { - reducer: AnastasisReducerApi; - reducerState: ReducerStateRecovery | ReducerStateBackup; -} - -export interface AttributeEntryFieldProps { +interface AttributeEntryFieldProps { isFirst: boolean; value: string; setValue: (newValue: string) => void; spec: UserAttributeSpec; + errorMessage: string | undefined; +} +const possibleBirthdayYear: Array<number> = [] +for (let i = 0; i < 100; i++) { + possibleBirthdayYear.push(2020 - i) } +function AttributeEntryField(props: AttributeEntryFieldProps): VNode { -export function AttributeEntryField(props: AttributeEntryFieldProps): VNode { return ( <div> - <LabeledInput - grabFocus={props.isFirst} - label={props.spec.label} - bind={[props.value, props.setValue]} - /> + {props.spec.type === 'date' && + <DateInput + grabFocus={props.isFirst} + label={props.spec.label} + years={possibleBirthdayYear} + error={props.errorMessage} + bind={[props.value, props.setValue]} + />} + {props.spec.type === 'number' && + <NumberInput + grabFocus={props.isFirst} + label={props.spec.label} + error={props.errorMessage} + bind={[props.value, props.setValue]} + /> + } + {props.spec.type === 'string' && + <TextInput + grabFocus={props.isFirst} + label={props.spec.label} + error={props.errorMessage} + bind={[props.value, props.setValue]} + /> + } + <div class="block"> + This stays private + <span class="icon is-right"> + <i class="mdi mdi-eye-off" /> + </span> + </div> </div> ); } +const YEAR_REGEX = /^[0-9]+-[0-9]+-[0-9]+$/ + + +function checkIfValid(value: string, spec: UserAttributeSpec): string | undefined { + const pattern = spec['validation-regex'] + if (pattern) { + const re = new RegExp(pattern) + if (!re.test(value)) return 'The value is invalid' + } + const logic = spec['validation-logic'] + if (logic) { + const func = (validators as any)[logic]; + if (func && typeof func === 'function' && !func(value)) return 'Please check the value' + } + const optional = spec.optional + if (!optional && !value) { + return 'This value is required' + } + if ("date" === spec.type) { + if (!YEAR_REGEX.test(value)) { + return "The date doesn't follow the format" + } + + try { + const v = parse(value, 'yyyy-MM-dd', new Date()); + if (Number.isNaN(v.getTime())) { + return "Some numeric values seems out of range for a date" + } + if ("birthdate" === spec.name && isAfter(v, new Date())) { + return "A birthdate cannot be in the future" + } + } catch (e) { + return "Could not parse the date" + } + } + return undefined +} diff --git a/packages/anastasis-webui/src/pages/home/AuthMethodEmailSetup.tsx b/packages/anastasis-webui/src/pages/home/AuthMethodEmailSetup.tsx deleted file mode 100644 index 9567e0ef7..000000000 --- a/packages/anastasis-webui/src/pages/home/AuthMethodEmailSetup.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -import { - encodeCrock, - stringToBytes -} from "@gnu-taler/taler-util"; -import { h, VNode } from "preact"; -import { useState } from "preact/hooks"; -import { AuthMethodSetupProps } from "./AuthenticationEditorScreen"; -import { AnastasisClientFrame, LabeledInput } from "./index"; - -export function AuthMethodEmailSetup(props: AuthMethodSetupProps): VNode { - const [email, setEmail] = useState(""); - return ( - <AnastasisClientFrame hideNav title="Add email authentication"> - <p> - For email authentication, you need to provide an email address. When - recovering your secret, you will need to enter the code you receive by - email. - </p> - <div> - <LabeledInput - label="Email address" - grabFocus - bind={[email, setEmail]} /> - </div> - <div> - <button onClick={() => props.cancel()}>Cancel</button> - <button - onClick={() => props.addAuthMethod({ - authentication_method: { - type: "email", - instructions: `Email to ${email}`, - challenge: encodeCrock(stringToBytes(email)), - }, - })} - > - Add - </button> - </div> - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/AuthMethodPostSetup.tsx b/packages/anastasis-webui/src/pages/home/AuthMethodPostSetup.tsx deleted file mode 100644 index 55e37a968..000000000 --- a/packages/anastasis-webui/src/pages/home/AuthMethodPostSetup.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -import { - canonicalJson, encodeCrock, - stringToBytes -} from "@gnu-taler/taler-util"; -import { h, VNode } from "preact"; -import { useState } from "preact/hooks"; -import { AuthMethodSetupProps } from "./AuthenticationEditorScreen"; -import { LabeledInput } from "./index"; - -export function AuthMethodPostSetup(props: AuthMethodSetupProps): VNode { - const [fullName, setFullName] = useState(""); - const [street, setStreet] = useState(""); - const [city, setCity] = useState(""); - const [postcode, setPostcode] = useState(""); - const [country, setCountry] = useState(""); - - const addPostAuth = () => { - const challengeJson = { - full_name: fullName, - street, - city, - postcode, - country, - }; - props.addAuthMethod({ - authentication_method: { - type: "email", - instructions: `Letter to address in postal code ${postcode}`, - challenge: encodeCrock(stringToBytes(canonicalJson(challengeJson))), - }, - }); - }; - - return ( - <div class="home"> - <h1>Add {props.method} authentication</h1> - <div> - <p> - For postal letter authentication, you need to provide a postal - address. When recovering your secret, you will be asked to enter a - code that you will receive in a letter to that address. - </p> - <div> - <LabeledInput - grabFocus - label="Full Name" - bind={[fullName, setFullName]} /> - </div> - <div> - <LabeledInput label="Street" bind={[street, setStreet]} /> - </div> - <div> - <LabeledInput label="City" bind={[city, setCity]} /> - </div> - <div> - <LabeledInput label="Postal Code" bind={[postcode, setPostcode]} /> - </div> - <div> - <LabeledInput label="Country" bind={[country, setCountry]} /> - </div> - <div> - <button onClick={() => props.cancel()}>Cancel</button> - <button onClick={() => addPostAuth()}>Add</button> - </div> - </div> - </div> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/AuthMethodQuestionSetup.tsx b/packages/anastasis-webui/src/pages/home/AuthMethodQuestionSetup.tsx deleted file mode 100644 index 7699cdf34..000000000 --- a/packages/anastasis-webui/src/pages/home/AuthMethodQuestionSetup.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -import { - encodeCrock, - stringToBytes -} from "@gnu-taler/taler-util"; -import { h, VNode } from "preact"; -import { useState } from "preact/hooks"; -import { AuthMethodSetupProps } from "./AuthenticationEditorScreen"; -import { AnastasisClientFrame, LabeledInput } from "./index"; - -export function AuthMethodQuestionSetup(props: AuthMethodSetupProps): VNode { - const [questionText, setQuestionText] = useState(""); - const [answerText, setAnswerText] = useState(""); - const addQuestionAuth = (): void => props.addAuthMethod({ - authentication_method: { - type: "question", - instructions: questionText, - challenge: encodeCrock(stringToBytes(answerText)), - }, - }); - return ( - <AnastasisClientFrame hideNav title="Add Security Question"> - <div> - <p> - For security question authentication, you need to provide a question - and its answer. When recovering your secret, you will be shown the - question and you will need to type the answer exactly as you typed it - here. - </p> - <div> - <LabeledInput - label="Security question" - grabFocus - bind={[questionText, setQuestionText]} /> - </div> - <div> - <LabeledInput label="Answer" bind={[answerText, setAnswerText]} /> - </div> - <div> - <button onClick={() => props.cancel()}>Cancel</button> - <button onClick={() => addQuestionAuth()}>Add</button> - </div> - </div> - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/AuthMethodSmsSetup.tsx b/packages/anastasis-webui/src/pages/home/AuthMethodSmsSetup.tsx deleted file mode 100644 index 6f4797275..000000000 --- a/packages/anastasis-webui/src/pages/home/AuthMethodSmsSetup.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -import { - encodeCrock, - stringToBytes -} from "@gnu-taler/taler-util"; -import { h, VNode } from "preact"; -import { useState, useRef, useLayoutEffect } from "preact/hooks"; -import { AuthMethodSetupProps } from "./AuthenticationEditorScreen"; -import { AnastasisClientFrame } from "./index"; - -export function AuthMethodSmsSetup(props: AuthMethodSetupProps): VNode { - const [mobileNumber, setMobileNumber] = useState(""); - const addSmsAuth = (): void => { - props.addAuthMethod({ - authentication_method: { - type: "sms", - instructions: `SMS to ${mobileNumber}`, - challenge: encodeCrock(stringToBytes(mobileNumber)), - }, - }); - }; - const inputRef = useRef<HTMLInputElement>(null); - useLayoutEffect(() => { - inputRef.current?.focus(); - }, []); - return ( - <AnastasisClientFrame hideNav title="Add SMS authentication"> - <div> - <p> - For SMS authentication, you need to provide a mobile number. When - recovering your secret, you will be asked to enter the code you - receive via SMS. - </p> - <label> - Mobile number:{" "} - <input - value={mobileNumber} - ref={inputRef} - style={{ display: "block" }} - autoFocus - onChange={(e) => setMobileNumber((e.target as any).value)} - type="text" /> - </label> - <div> - <button onClick={() => props.cancel()}>Cancel</button> - <button onClick={() => addSmsAuth()}>Add</button> - </div> - </div> - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.stories.tsx index 44d3795b2..5077c3eb0 100644 --- a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.stories.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/camelcase */ /* This file is part of GNU Taler (C) 2021 Taler Systems S.A. @@ -19,13 +20,17 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { ReducerState } from 'anastasis-core'; import { createExample, reducerStatesExample } from '../../utils'; import { AuthenticationEditorScreen as TestedComponent } from './AuthenticationEditorScreen'; export default { - title: 'Pages/AuthenticationEditorScreen', + title: 'Pages/backup/AuthenticationEditorScreen', component: TestedComponent, + args: { + order: 5, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, @@ -33,3 +38,56 @@ export default { }; export const Example = createExample(TestedComponent, reducerStatesExample.authEditing); +export const OneAuthMethodConfigured = createExample(TestedComponent, { + ...reducerStatesExample.authEditing, + authentication_methods: [{ + type: 'question', + instructions: 'what time is it?', + challenge: 'asd', + }] +} as ReducerState); + + +export const SomeMoreAuthMethodConfigured = createExample(TestedComponent, { + ...reducerStatesExample.authEditing, + authentication_methods: [{ + type: 'question', + instructions: 'what time is it?', + challenge: 'asd', + },{ + type: 'question', + instructions: 'what time is it?', + challenge: 'qwe', + },{ + type: 'sms', + instructions: 'what time is it?', + challenge: 'asd', + },{ + type: 'email', + instructions: 'what time is it?', + challenge: 'asd', + },{ + type: 'email', + instructions: 'what time is it?', + challenge: 'asd', + },{ + type: 'email', + instructions: 'what time is it?', + challenge: 'asd', + },{ + type: 'email', + instructions: 'what time is it?', + challenge: 'asd', + }] +} as ReducerState); + +export const NoAuthMethodProvided = createExample(TestedComponent, { + ...reducerStatesExample.authEditing, + authentication_providers: {}, + authentication_methods: [] +} as ReducerState); + + // type: string; + // instructions: string; + // challenge: string; + // mime_type?: string; diff --git a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx index e9ffccbac..93ca81194 100644 --- a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx @@ -1,19 +1,21 @@ /* eslint-disable @typescript-eslint/camelcase */ -import { AuthMethod, ReducerStateBackup } from "anastasis-core"; -import { h, VNode } from "preact"; +import { AuthMethod } from "anastasis-core"; +import { ComponentChildren, Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; +import { TextInput } from "../../components/fields/TextInput"; import { useAnastasisContext } from "../../context/anastasis"; -import { AnastasisReducerApi } from "../../hooks/use-anastasis-reducer"; -import { AuthMethodEmailSetup } from "./AuthMethodEmailSetup"; -import { AuthMethodPostSetup } from "./AuthMethodPostSetup"; -import { AuthMethodQuestionSetup } from "./AuthMethodQuestionSetup"; -import { AuthMethodSmsSetup } from "./AuthMethodSmsSetup"; +import { authMethods, KnownAuthMethods } from "./authMethod"; import { AnastasisClientFrame } from "./index"; + + +const getKeys = Object.keys as <T extends object>(obj: T) => Array<keyof T> + export function AuthenticationEditorScreen(): VNode { - const [selectedMethod, setSelectedMethod] = useState<string | undefined>( - undefined - ); + const [noProvidersAck, setNoProvidersAck] = useState(false) + const [selectedMethod, setSelectedMethod] = useState<KnownAuthMethods | undefined>(undefined); + const [addingProvider, setAddingProvider] = useState<string | undefined>(undefined) + const reducer = useAnastasisContext() if (!reducer) { return <div>no reducer in context</div> @@ -21,7 +23,29 @@ export function AuthenticationEditorScreen(): VNode { if (!reducer.currentReducerState || reducer.currentReducerState.backup_state === undefined) { return <div>invalid state</div> } + const configuredAuthMethods: AuthMethod[] = reducer.currentReducerState.authentication_methods ?? []; + const haveMethodsConfigured = configuredAuthMethods.length > 0; + + function removeByIndex(index: number): void { + if (reducer) reducer.transition("delete_authentication", { + authentication_method: index, + }) + } + + const camByType: { [s: string]: AuthMethodWithRemove[] } = {} + for (let index = 0; index < configuredAuthMethods.length; index++) { + const cam = { + ...configuredAuthMethods[index], + remove: () => removeByIndex(index) + } + const prevValue = camByType[cam.type] || [] + prevValue.push(cam) + camByType[cam.type] = prevValue; + } + + const providers = reducer.currentReducerState.authentication_providers!; + const authAvailableSet = new Set<string>(); for (const provKey of Object.keys(providers)) { const p = providers[provKey]; @@ -31,79 +55,125 @@ export function AuthenticationEditorScreen(): VNode { } } } + if (selectedMethod) { const cancel = (): void => setSelectedMethod(undefined); const addMethod = (args: any): void => { reducer.transition("add_authentication", args); setSelectedMethod(undefined); }; - const methodMap: Record< - string, (props: AuthMethodSetupProps) => h.JSX.Element - > = { - sms: AuthMethodSmsSetup, - question: AuthMethodQuestionSetup, - email: AuthMethodEmailSetup, - post: AuthMethodPostSetup, - }; - const AuthSetup = methodMap[selectedMethod] ?? AuthMethodNotImplemented; - return ( + + const AuthSetup = authMethods[selectedMethod].screen ?? AuthMethodNotImplemented; + return (<Fragment> <AuthSetup cancel={cancel} + configured={camByType[selectedMethod] || []} addAuthMethod={addMethod} method={selectedMethod} /> + + {!authAvailableSet.has(selectedMethod) && <ConfirmModal active + onCancel={cancel} description="No providers founds" label="Add a provider manually" + onConfirm={() => { + null + }} + > + We have found no trusted cloud providers for your recovery secret. You can add a provider manually. + To add a provider you must know the provider URL (e.g. https://provider.com) + <p> + <a>More about cloud providers</a> + </p> + </ConfirmModal>} + + </Fragment> ); } - function MethodButton(props: { method: string; label: string }): VNode { + + if (addingProvider !== undefined) { + return <div /> + } + + function MethodButton(props: { method: KnownAuthMethods }): VNode { + if (authMethods[props.method].skip) return <div /> + return ( - <button - disabled={!authAvailableSet.has(props.method)} - onClick={() => { - setSelectedMethod(props.method); - if (reducer) reducer.dismissError(); - }} - > - {props.label} - </button> + <div class="block"> + <button + style={{ justifyContent: 'space-between' }} + class="button is-fullwidth" + onClick={() => { + setSelectedMethod(props.method); + }} + > + <div style={{ display: 'flex' }}> + <span class="icon "> + {authMethods[props.method].icon} + </span> + {authAvailableSet.has(props.method) ? + <span> + Add a {authMethods[props.method].label} challenge + </span> : + <span> + Add a {authMethods[props.method].label} provider + </span> + } + </div> + {!authAvailableSet.has(props.method) && + <span class="icon has-text-danger" > + <i class="mdi mdi-exclamation-thick" /> + </span> + } + {camByType[props.method] && + <span class="tag is-info" > + {camByType[props.method].length} + </span> + } + </button> + </div> ); } - const configuredAuthMethods: AuthMethod[] = reducer.currentReducerState.authentication_methods ?? []; - const haveMethodsConfigured = configuredAuthMethods.length; + const errors = !haveMethodsConfigured ? "There is not enough authentication methods." : undefined; return ( - <AnastasisClientFrame title="Backup: Configure Authentication Methods"> - <div> - <MethodButton method="sms" label="SMS" /> - <MethodButton method="email" label="Email" /> - <MethodButton method="question" label="Question" /> - <MethodButton method="post" label="Physical Mail" /> - <MethodButton method="totp" label="TOTP" /> - <MethodButton method="iban" label="IBAN" /> - </div> - <h2>Configured authentication methods</h2> - {haveMethodsConfigured ? ( - configuredAuthMethods.map((x, i) => { - return ( - <p key={i}> - {x.type} ({x.instructions}){" "} - <button - onClick={() => reducer.transition("delete_authentication", { - authentication_method: i, - })} - > - Delete - </button> + <AnastasisClientFrame title="Backup: Configure Authentication Methods" hideNext={errors}> + <div class="columns"> + <div class="column is-half"> + <div> + {getKeys(authMethods).map(method => <MethodButton key={method} method={method} />)} + </div> + {authAvailableSet.size === 0 && <ConfirmModal active={!noProvidersAck} + onCancel={() => setNoProvidersAck(true)} description="No providers founds" label="Add a provider manually" + onConfirm={() => { + null + }} + > + We have found no trusted cloud providers for your recovery secret. You can add a provider manually. + To add a provider you must know the provider URL (e.g. https://provider.com) + <p> + <a>More about cloud providers</a> </p> - ); - }) - ) : ( - <p>No authentication methods configured yet.</p> - )} + </ConfirmModal>} + </div> + <div class="column is-half"> + <p class="block"> + When recovering your wallet, you will be asked to verify your identity via the methods you configure here. + The list of authentication method is defined by the backup provider list. + </p> + <p class="block"> + <button class="button is-info">Manage the backup provider's list</button> + </p> + {authAvailableSet.size > 0 && <p class="block"> + We couldn't find provider for some of the authentication methods. + </p>} + </div> + </div> </AnastasisClientFrame> ); } +type AuthMethodWithRemove = AuthMethod & { remove: () => void } export interface AuthMethodSetupProps { method: string; addAuthMethod: (x: any) => void; + configured: AuthMethodWithRemove[]; cancel: () => void; } @@ -116,8 +186,36 @@ function AuthMethodNotImplemented(props: AuthMethodSetupProps): VNode { ); } -interface AuthenticationEditorProps { - reducer: AnastasisReducerApi; - backupState: ReducerStateBackup; + +function ConfirmModal({ active, description, onCancel, onConfirm, children, danger, disabled, label = 'Confirm' }: Props): VNode { + return <div class={active ? "modal is-active" : "modal"}> + <div class="modal-background " onClick={onCancel} /> + <div class="modal-card" style={{ maxWidth: 700 }}> + <header class="modal-card-head"> + {!description ? null : <p class="modal-card-title"><b>{description}</b></p>} + <button class="delete " aria-label="close" onClick={onCancel} /> + </header> + <section class="modal-card-body"> + {children} + </section> + <footer class="modal-card-foot"> + <button class="button" onClick={onCancel} >Dismiss</button> + <div class="buttons is-right" style={{ width: '100%' }}> + <button class={danger ? "button is-danger " : "button is-info "} disabled={disabled} onClick={onConfirm} >{label}</button> + </div> + </footer> + </div> + <button class="modal-close is-large " aria-label="close" onClick={onCancel} /> + </div> } +interface Props { + active?: boolean; + description?: string; + onCancel?: () => void; + onConfirm?: () => void; + label?: string; + children?: ComponentChildren; + danger?: boolean; + disabled?: boolean; +} diff --git a/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.stories.tsx index 65a2b7e13..b71a79727 100644 --- a/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.stories.tsx @@ -26,15 +26,18 @@ import { BackupFinishedScreen as TestedComponent } from './BackupFinishedScreen' export default { - title: 'Pages/BackupFinishedScreen', + title: 'Pages/backup/FinishedScreen', component: TestedComponent, + args: { + order: 9, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, }, }; -export const Simple = createExample(TestedComponent, reducerStatesExample.backupFinished); +export const WithoutName = createExample(TestedComponent, reducerStatesExample.backupFinished); export const WithName = createExample(TestedComponent, {...reducerStatesExample.backupFinished, secret_name: 'super_secret', diff --git a/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx b/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx index 218f1d1fd..7938baca4 100644 --- a/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx @@ -1,3 +1,4 @@ +import { format } from "date-fns"; import { h, VNode } from "preact"; import { useAnastasisContext } from "../../context/anastasis"; import { AnastasisClientFrame } from "./index"; @@ -11,23 +12,33 @@ export function BackupFinishedScreen(): VNode { return <div>invalid state</div> } const details = reducer.currentReducerState.success_details - return (<AnastasisClientFrame hideNext title="Backup finished"> - <p> - Your backup of secret "{reducer.currentReducerState.secret_name ?? "??"}" was + + return (<AnastasisClientFrame hideNav title="Backup finished"> + {reducer.currentReducerState.secret_name ? <p> + Your backup of secret <b>"{reducer.currentReducerState.secret_name}"</b> was successful. - </p> - <p>The backup is stored by the following providers:</p> + </p> : + <p> + Your secret was successfully backed up. + </p>} - {details && <ul> + {details && <div class="block"> + <p>The backup is stored by the following providers:</p> {Object.keys(details).map((x, i) => { const sd = details[x]; return ( - <li key={i}> - {x} (Policy version {sd.policy_version}) - </li> + <div key={i} class="box"> + {x} + <p> + version {sd.policy_version} + {sd.policy_expiration.t_ms !== 'never' ? ` expires at: ${format(sd.policy_expiration.t_ms, 'dd-MM-yyyy')}` : ' without expiration date'} + </p> + </div> ); })} - </ul>} - <button onClick={() => reducer.reset()}>Back to start</button> + </div>} + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={() => reducer.back()}>Back</button> + </div> </AnastasisClientFrame>); } diff --git a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.stories.tsx index 4f186c031..48115c798 100644 --- a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.stories.tsx @@ -16,68 +16,201 @@ */ /** -* -* @author Sebastian Javier Marchano (sebasjm) -*/ - -import { ReducerState } from 'anastasis-core'; -import { createExample, reducerStatesExample } from '../../utils'; -import { ChallengeOverviewScreen as TestedComponent } from './ChallengeOverviewScreen'; + * + * @author Sebastian Javier Marchano (sebasjm) + */ +import { RecoveryStates, ReducerState } from "anastasis-core"; +import { createExample, reducerStatesExample } from "../../utils"; +import { ChallengeOverviewScreen as TestedComponent } from "./ChallengeOverviewScreen"; export default { - title: 'Pages/ChallengeOverviewScreen', + title: "Pages/recovery/ChallengeOverviewScreen", component: TestedComponent, + args: { + order: 5, + }, argTypes: { - onUpdate: { action: 'onUpdate' }, - onBack: { action: 'onBack' }, + onUpdate: { action: "onUpdate" }, + onBack: { action: "onBack" }, }, }; -export const OneChallenge = createExample(TestedComponent, {...reducerStatesExample.challengeSelecting, +export const OneUnsolvedPolicy = createExample(TestedComponent, { + ...reducerStatesExample.challengeSelecting, + recovery_information: { + policies: [[{ uuid: "1" }]], + challenges: [ + { + cost: "USD:1", + instructions: "just go for it", + type: "question", + uuid: "1", + }, + ], + }, +} as ReducerState); + +export const SomePoliciesOneSolved = createExample(TestedComponent, { + ...reducerStatesExample.challengeSelecting, recovery_information: { - policies: [[{uuid:'1'}]], - challenges: [{ - cost: 'USD:1', - instructions: 'just go for it', - type: 'question', - uuid: '1', - }] + policies: [[{ uuid: "1" }, { uuid: "2" }], [{ uuid: "uuid-3" }]], + challenges: [ + { + cost: "USD:1", + instructions: "this question cost 1 USD", + type: "question", + uuid: "1", + }, + { + cost: "USD:0", + instructions: "answering this question is free", + type: "question", + uuid: "2", + }, + { + cost: "USD:1", + instructions: "this question is already answered", + type: "question", + uuid: "uuid-3", + }, + ], + }, + challenge_feedback: { + "uuid-3": { + state: "solved", + }, }, } as ReducerState); -export const MoreChallenges = createExample(TestedComponent, {...reducerStatesExample.challengeSelecting, +export const OneBadConfiguredPolicy = createExample(TestedComponent, { + ...reducerStatesExample.challengeSelecting, recovery_information: { - policies: [[{uuid:'1'}, {uuid:'2'}],[{uuid:'3'}]], - challenges: [{ - cost: 'USD:1', - instructions: 'just go for it', - type: 'question', - uuid: '1', - },{ - cost: 'USD:1', - instructions: 'just go for it', - type: 'question', - uuid: '2', - },{ - cost: 'USD:1', - instructions: 'just go for it', - type: 'question', - uuid: '3', - }] + policies: [[{ uuid: "1" }, { uuid: "2" }]], + challenges: [ + { + cost: "USD:1", + instructions: "this policy has a missing uuid (the other auth method)", + type: "totp", + uuid: "1", + }, + ], }, } as ReducerState); -export const OneBadConfiguredPolicy = createExample(TestedComponent, {...reducerStatesExample.challengeSelecting, +export const OnePolicyWithAllTheChallenges = createExample(TestedComponent, { + ...reducerStatesExample.challengeSelecting, recovery_information: { - policies: [[{uuid:'2'}]], - challenges: [{ - cost: 'USD:1', - instructions: 'just go for it', - type: 'sasd', - uuid: '1', - }] + policies: [ + [ + { uuid: "1" }, + { uuid: "2" }, + { uuid: "3" }, + { uuid: "4" }, + { uuid: "5" }, + { uuid: "6" }, + { uuid: "7" }, + { uuid: "8" }, + ], + ], + challenges: [ + { + cost: "USD:1", + instructions: "Does P equals NP?", + type: "question", + uuid: "1", + }, + { + cost: "USD:1", + instructions: "SMS to 555-555", + type: "sms", + uuid: "2", + }, + { + cost: "USD:1", + instructions: "Email to qwe@asd.com", + type: "email", + uuid: "3", + }, + { + cost: "USD:1", + instructions: 'Enter 8 digits code for "Anastasis"', + type: "totp", + uuid: "4", + }, + { + // + cost: "USD:0", + instructions: "Wire transfer from ASDXCVQWE123123 with holder Florian", + type: "iban", + uuid: "5", + }, + { + cost: "USD:1", + instructions: "Join a video call", + type: "video", //Enter 8 digits code for "Anastasis" + uuid: "7", + }, + {}, + { + cost: "USD:1", + instructions: "Letter to address in postal code DE123123", + type: "post", //Enter 8 digits code for "Anastasis" + uuid: "8", + }, + { + cost: "USD:1", + instructions: "instruction for an unknown type of challenge", + type: "new-type-of-challenge", + uuid: "6", + }, + ], }, } as ReducerState); -export const NoPolicies = createExample(TestedComponent, reducerStatesExample.challengeSelecting); +export const OnePolicyWithAllTheChallengesInDifferentState = createExample( + TestedComponent, + { + ...reducerStatesExample.challengeSelecting, + recovery_state: RecoveryStates.ChallengeSelecting, + recovery_information: { + policies: [ + [ + { uuid: "1" }, + { uuid: "2" }, + { uuid: "3" }, + { uuid: "4" }, + { uuid: "5" }, + { uuid: "6" }, + { uuid: "7" }, + { uuid: "8" }, + { uuid: "9" }, + { uuid: "10" }, + ], + ], + challenges: [ + { + cost: "USD:1", + instructions: 'in state "solved"', + type: "question", + uuid: "1", + }, + { + cost: "USD:1", + instructions: 'in state "message"', + type: "question", + uuid: "2", + }, + ], + }, + challenge_feedback: { + 1: { state: "solved" }, + 2: { state: "message", message: "Security question was not solved correctly" }, + // FIXME: add missing feedback states here! + }, + } as ReducerState, +); +export const NoPolicies = createExample( + TestedComponent, + reducerStatesExample.challengeSelecting, +); diff --git a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx index c9b52e91b..ed34bbde2 100644 --- a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx @@ -1,77 +1,184 @@ +import { ChallengeFeedback, ChallengeFeedbackStatus } from "anastasis-core"; import { h, VNode } from "preact"; import { useAnastasisContext } from "../../context/anastasis"; import { AnastasisClientFrame } from "./index"; +import { authMethods, KnownAuthMethods } from "./authMethod"; + +function OverviewFeedbackDisplay(props: { feedback?: ChallengeFeedback }) { + const { feedback } = props; + if (!feedback) { + return null; + } + switch (feedback.state) { + case ChallengeFeedbackStatus.Message: + return ( + <div> + <p>{feedback.message}</p> + </div> + ); + case ChallengeFeedbackStatus.Pending: + case ChallengeFeedbackStatus.AuthIban: + return null; + case ChallengeFeedbackStatus.RateLimitExceeded: + return <div>Rate limit exceeded.</div>; + case ChallengeFeedbackStatus.Redirect: + return <div>Redirect (FIXME: not supported)</div>; + case ChallengeFeedbackStatus.Unsupported: + return <div>Challenge not supported by client.</div>; + case ChallengeFeedbackStatus.TruthUnknown: + return <div>Truth unknown</div>; + default: + return ( + <div> + <pre>{JSON.stringify(feedback)}</pre> + </div> + ); + } +} export function ChallengeOverviewScreen(): VNode { - const reducer = useAnastasisContext() + const reducer = useAnastasisContext(); if (!reducer) { - return <div>no reducer in context</div> + return <div>no reducer in context</div>; } - if (!reducer.currentReducerState || reducer.currentReducerState.recovery_state === undefined) { - return <div>invalid state</div> + if ( + !reducer.currentReducerState || + reducer.currentReducerState.recovery_state === undefined + ) { + return <div>invalid state</div>; } - const policies = reducer.currentReducerState.recovery_information?.policies ?? []; - const chArr = reducer.currentReducerState.recovery_information?.challenges ?? []; - const challengeFeedback = reducer.currentReducerState?.challenge_feedback; + const policies = + reducer.currentReducerState.recovery_information?.policies ?? []; + const knownChallengesArray = + reducer.currentReducerState.recovery_information?.challenges ?? []; + const challengeFeedback = + reducer.currentReducerState?.challenge_feedback ?? {}; - const challenges: { + const knownChallengesMap: { [uuid: string]: { type: string; instructions: string; cost: string; + feedback: ChallengeFeedback | undefined; }; } = {}; - for (const ch of chArr) { - challenges[ch.uuid] = { + for (const ch of knownChallengesArray) { + knownChallengesMap[ch.uuid] = { type: ch.type, cost: ch.cost, instructions: ch.instructions, + feedback: challengeFeedback[ch.uuid], }; } + const policiesWithInfo = policies.map((row) => { + let isPolicySolved = true; + const challenges = row + .map(({ uuid }) => { + const info = knownChallengesMap[uuid]; + const isChallengeSolved = info?.feedback?.state === "solved"; + isPolicySolved = isPolicySolved && isChallengeSolved; + return { info, uuid, isChallengeSolved }; + }) + .filter((ch) => ch.info !== undefined); + + return { isPolicySolved, challenges }; + }); + + const atLeastThereIsOnePolicySolved = + policiesWithInfo.find((p) => p.isPolicySolved) !== undefined; + + const errors = !atLeastThereIsOnePolicySolved + ? "Solve one policy before proceeding" + : undefined; return ( - <AnastasisClientFrame title="Recovery: Solve challenges"> - <h2>Policies</h2> - {!policies.length && <p> - No policies found - </p>} - {policies.map((row, i) => { - return ( - <div key={i}> - <h3>Policy #{i + 1}</h3> - {row.map(column => { - const ch = challenges[column.uuid]; - if (!ch) return <div> - There is no challenge for this policy - </div> - const feedback = challengeFeedback?.[column.uuid]; - return ( - <div key={column.uuid} - style={{ - borderLeft: "2px solid gray", - paddingLeft: "0.5em", - borderRadius: "0.5em", - marginTop: "0.5em", - marginBottom: "0.5em", - }} - > - <h4> - {ch.type} ({ch.instructions}) - </h4> - <p>Status: {feedback?.state ?? "unknown"}</p> - {feedback?.state !== "solved" ? ( - <button - onClick={() => reducer.transition("select_challenge", { - uuid: column.uuid, - })} - > - Solve - </button> - ) : null} + <AnastasisClientFrame hideNext={errors} title="Recovery: Solve challenges"> + {!policies.length ? ( + <p class="block"> + No policies found, try with another version of the secret + </p> + ) : policies.length === 1 ? ( + <p class="block"> + One policy found for this secret. You need to solve all the challenges + in order to recover your secret. + </p> + ) : ( + <p class="block"> + We have found {policies.length} polices. You need to solve all the + challenges from one policy in order to recover your secret. + </p> + )} + {policiesWithInfo.map((policy, policy_index) => { + const tableBody = policy.challenges.map(({ info, uuid }) => { + const isFree = !info.cost || info.cost.endsWith(":0"); + const method = authMethods[info.type as KnownAuthMethods]; + return ( + <div + key={uuid} + class="block" + style={{ display: "flex", justifyContent: "space-between" }} + > + <div + style={{ + display: "flex", + flexDirection: "column", + }} + > + <div style={{ display: "flex", alignItems: "center" }}> + <span class="icon">{method?.icon}</span> + <span>{info.instructions}</span> </div> - ); - })} + <OverviewFeedbackDisplay feedback={info.feedback} /> + </div> + <div> + {method && info.feedback?.state !== "solved" ? ( + <a + class="button" + onClick={() => + reducer.transition("select_challenge", { uuid }) + } + > + {isFree ? "Solve" : `Pay and Solve`} + </a> + ) : null} + {info.feedback?.state === "solved" ? ( + <a class="button is-success"> Solved </a> + ) : null} + </div> + </div> + ); + }); + + const policyName = policy.challenges + .map((x) => x.info.type) + .join(" + "); + const opa = !atLeastThereIsOnePolicySolved + ? undefined + : policy.isPolicySolved + ? undefined + : "0.6"; + return ( + <div + key={policy_index} + class="box" + style={{ + opacity: opa, + }} + > + <h3 class="subtitle"> + Policy #{policy_index + 1}: {policyName} + </h3> + {policy.challenges.length === 0 && ( + <p>This policy doesn't have challenges.</p> + )} + {policy.challenges.length === 1 && ( + <p>This policy just have one challenge.</p> + )} + {policy.challenges.length > 1 && ( + <p>This policy have {policy.challenges.length} challenges.</p> + )} + {tableBody} </div> ); })} diff --git a/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/ChallengePayingScreen.stories.tsx index adf36980f..e5fe09e99 100644 --- a/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/ChallengePayingScreen.stories.tsx @@ -20,17 +20,19 @@ */ import { createExample, reducerStatesExample } from '../../utils'; -import { CountrySelectionScreen as TestedComponent } from './CountrySelectionScreen'; +import { ChallengePayingScreen as TestedComponent } from './ChallengePayingScreen'; export default { - title: 'Pages/CountrySelectionScreen', + title: 'Pages/recovery/__ChallengePayingScreen', component: TestedComponent, + args: { + order: 10, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, }, }; -export const Backup = createExample(TestedComponent, reducerStatesExample.backupSelectCountry); -export const Recovery = createExample(TestedComponent, reducerStatesExample.recoverySelectCountry); +export const Example = createExample(TestedComponent, reducerStatesExample.challengePaying); diff --git a/packages/anastasis-webui/src/pages/home/ChallengePayingScreen.tsx b/packages/anastasis-webui/src/pages/home/ChallengePayingScreen.tsx new file mode 100644 index 000000000..84896a2ec --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/ChallengePayingScreen.tsx @@ -0,0 +1,33 @@ +import { h, VNode } from "preact"; +import { useAnastasisContext } from "../../context/anastasis"; +import { AnastasisClientFrame } from "./index"; + +export function ChallengePayingScreen(): VNode { + const reducer = useAnastasisContext() + if (!reducer) { + return <div>no reducer in context</div> + } + if (!reducer.currentReducerState || reducer.currentReducerState.recovery_state === undefined) { + return <div>invalid state</div> + } + const payments = ['']; //reducer.currentReducerState.payments ?? + return ( + <AnastasisClientFrame + hideNav + title="Recovery: Challenge Paying" + > + <p> + Some of the providers require a payment to store the encrypted + authentication information. + </p> + <ul> + {payments.map((x, i) => { + return <li key={i}>{x}</li>; + })} + </ul> + <button onClick={() => reducer.transition("pay", {})}> + Check payment status now + </button> + </AnastasisClientFrame> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.stories.tsx index aad37cd7f..6bdb3515d 100644 --- a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.stories.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/camelcase */ /* This file is part of GNU Taler (C) 2021 Taler Systems S.A. @@ -19,18 +20,33 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { ReducerState } from 'anastasis-core'; import { createExample, reducerStatesExample } from '../../utils'; import { ContinentSelectionScreen as TestedComponent } from './ContinentSelectionScreen'; export default { - title: 'Pages/ContinentSelectionScreen', + title: 'Pages/Location', component: TestedComponent, + args: { + order: 2, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, }, }; -export const Backup = createExample(TestedComponent, reducerStatesExample.backupSelectCountry); -export const Recovery = createExample(TestedComponent, reducerStatesExample.recoverySelectCountry); +export const BackupSelectContinent = createExample(TestedComponent, reducerStatesExample.backupSelectContinent); + +export const BackupSelectCountry = createExample(TestedComponent, { + ...reducerStatesExample.backupSelectContinent, + selected_continent: 'Testcontinent', +} as ReducerState); + +export const RecoverySelectContinent = createExample(TestedComponent, reducerStatesExample.recoverySelectContinent); + +export const RecoverySelectCountry = createExample(TestedComponent, { + ...reducerStatesExample.recoverySelectContinent, + selected_continent: 'Testcontinent', +} as ReducerState); diff --git a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx index ad529a4a7..0e43f982d 100644 --- a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx @@ -1,20 +1,104 @@ +/* eslint-disable @typescript-eslint/camelcase */ import { h, VNode } from "preact"; +import { useState } from "preact/hooks"; import { useAnastasisContext } from "../../context/anastasis"; import { AnastasisClientFrame, withProcessLabel } from "./index"; export function ContinentSelectionScreen(): VNode { const reducer = useAnastasisContext() + + //FIXME: remove this when #7056 is fixed + const countryFromReducer = (reducer?.currentReducerState as any).selected_country || "" + const [countryCode, setCountryCode] = useState( countryFromReducer ) + if (!reducer || !reducer.currentReducerState || !("continents" in reducer.currentReducerState)) { return <div /> } - const sel = (x: string): void => reducer.transition("select_continent", { continent: x }); + const selectContinent = (continent: string): void => { + reducer.transition("select_continent", { continent }) + }; + const selectCountry = (country: string): void => { + setCountryCode(country) + }; + + + const continentList = reducer.currentReducerState.continents || []; + const countryList = reducer.currentReducerState.countries || []; + const theContinent = reducer.currentReducerState.selected_continent || "" + // const cc = reducer.currentReducerState.selected_country || ""; + const theCountry = countryList.find(c => c.code === countryCode) + const selectCountryAction = () => { + //selection should be when the select box changes it value + if (!theCountry) return; + reducer.transition("select_country", { + country_code: countryCode, + currencies: [theCountry.currency], + }) + } + + // const step1 = reducer.currentReducerState.backup_state === BackupStates.ContinentSelecting || + // reducer.currentReducerState.recovery_state === RecoveryStates.ContinentSelecting; + + const errors = !theCountry ? "Select a country" : undefined + return ( - <AnastasisClientFrame hideNext title={withProcessLabel(reducer, "Select Continent")}> - {reducer.currentReducerState.continents.map((x: any) => ( - <button onClick={() => sel(x.name)} key={x.name}> - {x.name} - </button> - ))} + <AnastasisClientFrame hideNext={errors} title={withProcessLabel(reducer, "Where do you live?")} onNext={selectCountryAction}> + + <div class="columns" > + <div class="column is-one-third"> + <div class="field"> + <label class="label">Continent</label> + <div class="control is-expanded has-icons-left"> + <div class="select is-fullwidth" > + <select onChange={(e) => selectContinent(e.currentTarget.value)} value={theContinent} > + <option key="none" disabled selected value=""> Choose a continent </option> + {continentList.map(prov => ( + <option key={prov.name} value={prov.name}> + {prov.name} + </option> + ))} + </select> + <div class="icon is-small is-left"> + <i class="mdi mdi-earth" /> + </div> + </div> + </div> + </div> + + <div class="field"> + <label class="label">Country</label> + <div class="control is-expanded has-icons-left"> + <div class="select is-fullwidth" > + <select onChange={(e) => selectCountry((e.target as any).value)} disabled={!theContinent} value={theCountry?.code || ""}> + <option key="none" disabled selected value=""> Choose a country </option> + {countryList.map(prov => ( + <option key={prov.name} value={prov.code}> + {prov.name} + </option> + ))} + </select> + <div class="icon is-small is-left"> + <i class="mdi mdi-earth" /> + </div> + </div> + </div> + </div> + + {/* {theCountry && <div class="field"> + <label class="label">Available currencies:</label> + <div class="control"> + <input class="input is-small" type="text" readonly value={theCountry.currency} /> + </div> + </div>} */} + </div> + <div class="column is-two-third"> + <p> + Your location will help us to determine which personal information + ask you for the next step. + </p> + </div> + </div> + </AnastasisClientFrame> ); } diff --git a/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.tsx b/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.tsx deleted file mode 100644 index 555622c1d..000000000 --- a/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.tsx +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -import { h, VNode } from "preact"; -import { useAnastasisContext } from "../../context/anastasis"; -import { AnastasisClientFrame, withProcessLabel } from "./index"; - -export function CountrySelectionScreen(): VNode { - const reducer = useAnastasisContext() - if (!reducer) { - return <div>no reducer in context</div> - } - if (!reducer.currentReducerState || !("countries" in reducer.currentReducerState)) { - return <div>invalid state</div> - } - const sel = (x: any): void => reducer.transition("select_country", { - country_code: x.code, - currencies: [x.currency], - }); - return ( - <AnastasisClientFrame hideNext title={withProcessLabel(reducer, "Select Country")} > - {reducer.currentReducerState.countries.map((x: any) => ( - <button onClick={() => sel(x)} key={x.name}> - {x.name} ({x.currency}) - </button> - ))} - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/EditPoliciesScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/EditPoliciesScreen.stories.tsx new file mode 100644 index 000000000..fc339e48e --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/EditPoliciesScreen.stories.tsx @@ -0,0 +1,109 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { ReducerState } from 'anastasis-core'; +import { createExample, reducerStatesExample } from '../../utils'; +import { EditPoliciesScreen as TestedComponent } from './EditPoliciesScreen'; + + +export default { + title: 'Pages/backup/ReviewPoliciesScreen/EditPoliciesScreen', + args: { + order: 6, + }, + component: TestedComponent, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +export const EditingAPolicy = createExample(TestedComponent, { + ...reducerStatesExample.policyReview, + policies: [{ + methods: [{ + authentication_method: 1, + provider: 'https://anastasis.demo.taler.net/' + }, { + authentication_method: 2, + provider: 'http://localhost:8086/' + }] + }, { + methods: [{ + authentication_method: 1, + provider: 'http://localhost:8086/' + }] + }], + authentication_methods: [{ + type: "email", + instructions: "Email to qwe@asd.com", + challenge: "E5VPA" + }, { + type: "totp", + instructions: "Response code for 'Anastasis'", + challenge: "E5VPA" + }, { + type: "sms", + instructions: "SMS to 6666-6666", + challenge: "" + }, { + type: "question", + instructions: "How did the chicken cross the road?", + challenge: "C5SP8" + }] +} as ReducerState, { index : 0}); + +export const CreatingAPolicy = createExample(TestedComponent, { + ...reducerStatesExample.policyReview, + policies: [{ + methods: [{ + authentication_method: 1, + provider: 'https://anastasis.demo.taler.net/' + }, { + authentication_method: 2, + provider: 'http://localhost:8086/' + }] + }, { + methods: [{ + authentication_method: 1, + provider: 'http://localhost:8086/' + }] + }], + authentication_methods: [{ + type: "email", + instructions: "Email to qwe@asd.com", + challenge: "E5VPA" + }, { + type: "totp", + instructions: "Response code for 'Anastasis'", + challenge: "E5VPA" + }, { + type: "sms", + instructions: "SMS to 6666-6666", + challenge: "" + }, { + type: "question", + instructions: "How did the chicken cross the road?", + challenge: "C5SP8" + }] +} as ReducerState, { index : 3}); + diff --git a/packages/anastasis-webui/src/pages/home/EditPoliciesScreen.tsx b/packages/anastasis-webui/src/pages/home/EditPoliciesScreen.tsx new file mode 100644 index 000000000..85cc96c46 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/EditPoliciesScreen.tsx @@ -0,0 +1,133 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { AuthMethod, Policy } from "anastasis-core"; +import { h, VNode } from "preact"; +import { useState } from "preact/hooks"; +import { useAnastasisContext } from "../../context/anastasis"; +import { authMethods, KnownAuthMethods } from "./authMethod"; +import { AnastasisClientFrame } from "./index"; + +export interface ProviderInfo { + url: string; + cost: string; + isFree: boolean; +} + +export type ProviderInfoByType = { + [type in KnownAuthMethods]?: ProviderInfo[]; +}; + +interface Props { + index: number; + cancel: () => void; + confirm: (changes: MethodProvider[]) => void; + +} + +export interface MethodProvider { + authentication_method: number; + provider: string; +} + +export function EditPoliciesScreen({ index: policy_index, cancel, confirm }: Props): VNode { + const [changedProvider, setChangedProvider] = useState<Array<string>>([]) + + const reducer = useAnastasisContext() + if (!reducer) { + return <div>no reducer in context</div> + } + if (!reducer.currentReducerState || reducer.currentReducerState.backup_state === undefined) { + return <div>invalid state</div> + } + + const selectableProviders: ProviderInfoByType = {} + const allProviders = Object.entries(reducer.currentReducerState.authentication_providers || {}) + for (let index = 0; index < allProviders.length; index++) { + const [url, status] = allProviders[index] + if ("methods" in status) { + status.methods.map(m => { + const type: KnownAuthMethods = m.type as KnownAuthMethods + const values = selectableProviders[type] || [] + const isFree = !m.usage_fee || m.usage_fee.endsWith(":0") + values.push({ url, cost: m.usage_fee, isFree }) + selectableProviders[type] = values + }) + } + } + + const allAuthMethods = reducer.currentReducerState.authentication_methods ?? []; + const policies = reducer.currentReducerState.policies ?? []; + const policy = policies[policy_index] + + for(let method_index = 0; method_index < allAuthMethods.length; method_index++ ) { + policy?.methods.find(m => m.authentication_method === method_index)?.provider + } + + function sendChanges(): void { + const newMethods: MethodProvider[] = [] + allAuthMethods.forEach((method, index) => { + const oldValue = policy?.methods.find(m => m.authentication_method === index) + if (changedProvider[index] === undefined && oldValue !== undefined) { + newMethods.push(oldValue) + } + if (changedProvider[index] !== undefined && changedProvider[index] !== "") { + newMethods.push({ + authentication_method: index, + provider: changedProvider[index] + }) + } + }) + confirm(newMethods) + } + + return <AnastasisClientFrame hideNav title={!policy ? "Backup: New Policy" : "Backup: Edit Policy"}> + <section class="section"> + {!policy ? <p> + Creating a new policy #{policy_index} + </p> : <p> + Editing policy #{policy_index} + </p>} + {allAuthMethods.map((method, index) => { + //take the url from the updated change or from the policy + const providerURL = changedProvider[index] === undefined ? + policy?.methods.find(m => m.authentication_method === index)?.provider : + changedProvider[index]; + + const type: KnownAuthMethods = method.type as KnownAuthMethods + function changeProviderTo(url: string): void { + const copy = [...changedProvider] + copy[index] = url + setChangedProvider(copy) + } + return ( + <div key={index} class="block" style={{ display: 'flex', alignItems: 'center' }}> + <span class="icon"> + {authMethods[type]?.icon} + </span> + <span> + {method.instructions} + </span> + <span> + <span class="select " > + <select onChange={(e) => changeProviderTo(e.currentTarget.value)} value={providerURL ?? ""}> + <option key="none" value=""> << off >> </option> + {selectableProviders[type]?.map(prov => ( + <option key={prov.url} value={prov.url}> + {prov.url} + </option> + ))} + </select> + </span> + </span> + </div> + ); + })} + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <span class="buttons"> + <button class="button" onClick={() => setChangedProvider([])}>Reset</button> + <button class="button is-info" onClick={sendChanges}>Confirm</button> + </span> + </div> + </section> + </AnastasisClientFrame> +} diff --git a/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.stories.tsx index 1a9462b88..e952ab28d 100644 --- a/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.stories.tsx @@ -26,8 +26,11 @@ import { PoliciesPayingScreen as TestedComponent } from './PoliciesPayingScreen' export default { - title: 'Pages/PoliciesPayingScreen', + title: 'Pages/backup/PoliciesPayingScreen', component: TestedComponent, + args: { + order: 8, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, diff --git a/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx b/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx index 8a39cf0e4..a470f5155 100644 --- a/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx @@ -13,7 +13,7 @@ export function PoliciesPayingScreen(): VNode { const payments = reducer.currentReducerState.policy_payment_requests ?? []; return ( - <AnastasisClientFrame hideNext title="Backup: Recovery Document Payments"> + <AnastasisClientFrame hideNav title="Backup: Recovery Document Payments"> <p> Some of the providers require a payment to store the encrypted recovery document. diff --git a/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.stories.tsx index 0c1842420..0d2ebb778 100644 --- a/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.stories.tsx @@ -26,7 +26,10 @@ import { RecoveryFinishedScreen as TestedComponent } from './RecoveryFinishedScr export default { - title: 'Pages/RecoveryFinishedScreen', + title: 'Pages/recovery/FinishedScreen', + args: { + order: 7, + }, component: TestedComponent, argTypes: { onUpdate: { action: 'onUpdate' }, @@ -34,7 +37,7 @@ export default { }, }; -export const NormalEnding = createExample(TestedComponent, { +export const GoodEnding = createExample(TestedComponent, { ...reducerStatesExample.recoveryFinished, core_secret: { mime: 'text/plain', value: 'hello' } } as ReducerState); diff --git a/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx b/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx index 8c8a2c7c8..a61ef9efa 100644 --- a/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx @@ -15,20 +15,26 @@ export function RecoveryFinishedScreen(): VNode { if (!reducer.currentReducerState || reducer.currentReducerState.recovery_state === undefined) { return <div>invalid state</div> } - const encodedSecret = reducer.currentReducerState.core_secret?.value + const encodedSecret = reducer.currentReducerState.core_secret if (!encodedSecret) { - return <AnastasisClientFrame title="Recovery Problem" hideNext> + return <AnastasisClientFrame title="Recovery Problem" hideNav> <p> Secret not found </p> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={() => reducer.back()}>Back</button> + </div> </AnastasisClientFrame> } - const secret = bytesToString(decodeCrock(encodedSecret)) + const secret = bytesToString(decodeCrock(encodedSecret.value)) return ( - <AnastasisClientFrame title="Recovery Finished" hideNext> + <AnastasisClientFrame title="Recovery Finished" hideNav> <p> Secret: {secret} </p> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={() => reducer.back()}>Back</button> + </div> </AnastasisClientFrame> ); } diff --git a/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.stories.tsx index b52699e7b..9f7e26c16 100644 --- a/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.stories.tsx @@ -26,7 +26,10 @@ import { ReviewPoliciesScreen as TestedComponent } from './ReviewPoliciesScreen' export default { - title: 'Pages/ReviewPoliciesScreen', + title: 'Pages/backup/ReviewPoliciesScreen', + args: { + order: 6, + }, component: TestedComponent, argTypes: { onUpdate: { action: 'onUpdate' }, @@ -40,11 +43,11 @@ export const HasPoliciesButMethodListIsEmpty = createExample(TestedComponent, { methods: [{ authentication_method: 0, provider: 'asd' - },{ + }, { authentication_method: 1, provider: 'asd' }] - },{ + }, { methods: [{ authentication_method: 1, provider: 'asd' @@ -55,27 +58,191 @@ export const HasPoliciesButMethodListIsEmpty = createExample(TestedComponent, { export const SomePoliciesWithMethods = createExample(TestedComponent, { ...reducerStatesExample.policyReview, - policies: [{ - methods: [{ - authentication_method: 0, - provider: 'asd' - },{ - authentication_method: 1, - provider: 'asd' - }] - },{ - methods: [{ - authentication_method: 1, - provider: 'asd' - }] - }], + policies: [ + { + methods: [ + { + authentication_method: 0, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 1, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 2, + provider: "https://kudos.demo.anastasis.lu/" + } + ] + }, + { + methods: [ + { + authentication_method: 0, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 1, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 3, + provider: "https://anastasis.demo.taler.net/" + } + ] + }, + { + methods: [ + { + authentication_method: 0, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 1, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 4, + provider: "https://anastasis.demo.taler.net/" + } + ] + }, + { + methods: [ + { + authentication_method: 0, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 2, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 3, + provider: "https://anastasis.demo.taler.net/" + } + ] + }, + { + methods: [ + { + authentication_method: 0, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 2, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 4, + provider: "https://anastasis.demo.taler.net/" + } + ] + }, + { + methods: [ + { + authentication_method: 0, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 3, + provider: "https://anastasis.demo.taler.net/" + }, + { + authentication_method: 4, + provider: "https://anastasis.demo.taler.net/" + } + ] + }, + { + methods: [ + { + authentication_method: 1, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 2, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 3, + provider: "https://anastasis.demo.taler.net/" + } + ] + }, + { + methods: [ + { + authentication_method: 1, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 2, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 4, + provider: "https://anastasis.demo.taler.net/" + } + ] + }, + { + methods: [ + { + authentication_method: 1, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 3, + provider: "https://anastasis.demo.taler.net/" + }, + { + authentication_method: 4, + provider: "https://anastasis.demo.taler.net/" + } + ] + }, + { + methods: [ + { + authentication_method: 2, + provider: "https://kudos.demo.anastasis.lu/" + }, + { + authentication_method: 3, + provider: "https://anastasis.demo.taler.net/" + }, + { + authentication_method: 4, + provider: "https://anastasis.demo.taler.net/" + } + ] + } + ], authentication_methods: [{ - challenge: 'asd', - instructions: 'ins', - type: 'type', + type: "email", + instructions: "Email to qwe@asd.com", + challenge: "E5VPA" + }, { + type: "sms", + instructions: "SMS to 555-555", + challenge: "" + }, { + type: "question", + instructions: "Does P equal NP?", + challenge: "C5SP8" },{ - challenge: 'asd2', - instructions: 'ins2', - type: 'type2', - }] + type: "totp", + instructions: "Response code for 'Anastasis'", + challenge: "E5VPA" + }, { + type: "sms", + instructions: "SMS to 6666-6666", + challenge: "" + }, { + type: "question", + instructions: "How did the chicken cross the road?", + challenge: "C5SP8" +}] } as ReducerState); diff --git a/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx b/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx index b360ccaf0..f93963f67 100644 --- a/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx @@ -1,9 +1,13 @@ /* eslint-disable @typescript-eslint/camelcase */ import { h, VNode } from "preact"; +import { useState } from "preact/hooks"; import { useAnastasisContext } from "../../context/anastasis"; +import { authMethods, KnownAuthMethods } from "./authMethod"; +import { EditPoliciesScreen } from "./EditPoliciesScreen"; import { AnastasisClientFrame } from "./index"; export function ReviewPoliciesScreen(): VNode { + const [editingPolicy, setEditingPolicy] = useState<number | undefined>() const reducer = useAnastasisContext() if (!reducer) { return <div>no reducer in context</div> @@ -11,42 +15,72 @@ export function ReviewPoliciesScreen(): VNode { if (!reducer.currentReducerState || reducer.currentReducerState.backup_state === undefined) { return <div>invalid state</div> } - const authMethods = reducer.currentReducerState.authentication_methods ?? []; + + const configuredAuthMethods = reducer.currentReducerState.authentication_methods ?? []; const policies = reducer.currentReducerState.policies ?? []; + if (editingPolicy !== undefined) { + return ( + <EditPoliciesScreen + index={editingPolicy} + cancel={() => setEditingPolicy(undefined)} + confirm={async (newMethods) => { + await reducer.transition("update_policy", { + policy_index: editingPolicy, + policy: newMethods, + }); + setEditingPolicy(undefined) + }} + /> + ) + } + + const errors = policies.length < 1 ? 'Need more policies' : undefined return ( - <AnastasisClientFrame title="Backup: Review Recovery Policies"> + <AnastasisClientFrame hideNext={errors} title="Backup: Review Recovery Policies"> + {policies.length > 0 && <p class="block"> + Based on your configured authentication method you have created, some policies + have been configured. In order to recover your secret you have to solve all the + challenges of at least one policy. + </p>} + {policies.length < 1 && <p class="block"> + No policies had been created. Go back and add more authentication methods. + </p>} + <div class="block" style={{ justifyContent: 'flex-end' }} > + <button class="button is-success" onClick={() => setEditingPolicy(policies.length + 1)}>Add new policy</button> + </div> {policies.map((p, policy_index) => { const methods = p.methods - .map(x => authMethods[x.authentication_method] && ({ ...authMethods[x.authentication_method], provider: x.provider })) + .map(x => configuredAuthMethods[x.authentication_method] && ({ ...configuredAuthMethods[x.authentication_method], provider: x.provider })) .filter(x => !!x) const policyName = methods.map(x => x.type).join(" + "); return ( - <div key={policy_index} class="policy"> - <h3> - Policy #{policy_index + 1}: {policyName} - </h3> - Required Authentications: - {!methods.length && <p> - No auth method found - </p>} - <ul> + <div key={policy_index} class="box" style={{ display: 'flex', justifyContent: 'space-between' }}> + <div> + <h3 class="subtitle"> + Policy #{policy_index + 1}: {policyName} + </h3> + {!methods.length && <p> + No auth method found + </p>} {methods.map((m, i) => { return ( - <li key={i}> - {m.type} ({m.instructions}) at provider {m.provider} - </li> + <p key={i} class="block" style={{ display: 'flex', alignItems: 'center' }}> + <span class="icon"> + {authMethods[m.type as KnownAuthMethods]?.icon} + </span> + <span> + {m.instructions} recovery provided by <a href={m.provider}>{m.provider}</a> + </span> + </p> ); })} - </ul> - <div> - <button - onClick={() => reducer.transition("delete_policy", { policy_index })} - > - Delete Policy - </button> + </div> + <div style={{ marginTop: 'auto', marginBottom: 'auto', display: 'flex', justifyContent: 'space-between', flexDirection: 'column' }}> + <button class="button is-info block" onClick={() => setEditingPolicy(policy_index)}>Edit</button> + <button class="button is-danger block" onClick={() => reducer.transition("delete_policy", { policy_index })}>Delete</button> </div> </div> ); diff --git a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.stories.tsx index 18560356a..49dd8fca8 100644 --- a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.stories.tsx @@ -26,8 +26,11 @@ import { SecretEditorScreen as TestedComponent } from './SecretEditorScreen'; export default { - title: 'Pages/SecretEditorScreen', + title: 'Pages/backup/SecretEditorScreen', component: TestedComponent, + args: { + order: 7, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, diff --git a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx index a5235d66c..1b36a1b21 100644 --- a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx @@ -4,20 +4,21 @@ import { h, VNode } from "preact"; import { useState } from "preact/hooks"; import { useAnastasisContext } from "../../context/anastasis"; import { - AnastasisClientFrame, - LabeledInput + AnastasisClientFrame } from "./index"; +import { TextInput } from "../../components/fields/TextInput"; +import { FileInput } from "../../components/fields/FileInput"; export function SecretEditorScreen(): VNode { const reducer = useAnastasisContext() const [secretValue, setSecretValue] = useState(""); - const currentSecretName = reducer?.currentReducerState - && ("secret_name" in reducer.currentReducerState) + const currentSecretName = reducer?.currentReducerState + && ("secret_name" in reducer.currentReducerState) && reducer.currentReducerState.secret_name; const [secretName, setSecretName] = useState(currentSecretName || ""); - + if (!reducer) { return <div>no reducer in context</div> } @@ -25,8 +26,8 @@ export function SecretEditorScreen(): VNode { return <div>invalid state</div> } - const secretNext = (): void => { - reducer.runTransaction(async (tx) => { + const secretNext = async (): Promise<void> => { + return reducer.runTransaction(async (tx) => { await tx.transition("enter_secret_name", { name: secretName, }); @@ -44,21 +45,29 @@ export function SecretEditorScreen(): VNode { }; return ( <AnastasisClientFrame - title="Backup: Provide secret" + title="Backup: Provide secret to backup" onNext={() => secretNext()} > <div> - <LabeledInput - label="Secret Name:" + <TextInput + label="Secret's name:" grabFocus bind={[secretName, setSecretName]} /> </div> <div> - <LabeledInput - label="Secret Value:" + <TextInput + label="Enter the secret as text:" bind={[secretValue, setSecretValue]} /> + <div style={{display:'flex',}}> + or + <FileInput + label="click here" + bind={[secretValue, setSecretValue]} + /> + to import a file + </div> </div> </AnastasisClientFrame> ); diff --git a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx index e9c597023..6919eebad 100644 --- a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/camelcase */ /* This file is part of GNU Taler (C) 2021 Taler Systems S.A. @@ -26,8 +25,11 @@ import { SecretSelectionScreen as TestedComponent } from './SecretSelectionScree export default { - title: 'Pages/SecretSelectionScreen', + title: 'Pages/recovery/SecretSelectionScreen', component: TestedComponent, + args: { + order: 4, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, @@ -37,7 +39,7 @@ export default { export const Example = createExample(TestedComponent, { ...reducerStatesExample.secretSelection, recovery_document: { - provider_url: 'http://anastasis.url/', + provider_url: 'https://kudos.demo.anastasis.lu/', secret_name: 'secretName', version: 1, }, diff --git a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx index 903f57868..8aa5ed2f7 100644 --- a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx @@ -1,19 +1,17 @@ -/* eslint-disable @typescript-eslint/camelcase */ import { h, VNode } from "preact"; import { useState } from "preact/hooks"; +import { AsyncButton } from "../../components/AsyncButton"; +import { NumberInput } from "../../components/fields/NumberInput"; import { useAnastasisContext } from "../../context/anastasis"; import { AnastasisClientFrame } from "./index"; export function SecretSelectionScreen(): VNode { const [selectingVersion, setSelectingVersion] = useState<boolean>(false); - const [otherProvider, setOtherProvider] = useState<string>(""); const reducer = useAnastasisContext() - const currentVersion = reducer?.currentReducerState + const currentVersion = (reducer?.currentReducerState && ("recovery_document" in reducer.currentReducerState) - && reducer.currentReducerState.recovery_document?.version; - - const [otherVersion, setOtherVersion] = useState<number>(currentVersion || 0); + && reducer.currentReducerState.recovery_document?.version) || 0; if (!reducer) { return <div>no reducer in context</div> @@ -22,9 +20,9 @@ export function SecretSelectionScreen(): VNode { return <div>invalid state</div> } - function selectVersion(p: string, n: number): void { - if (!reducer) return; - reducer.runTransaction(async (tx) => { + async function doSelectVersion(p: string, n: number): Promise<void> { + if (!reducer) return Promise.resolve(); + return reducer.runTransaction(async (tx) => { await tx.transition("change_version", { version: n, provider_url: p, @@ -33,55 +31,136 @@ export function SecretSelectionScreen(): VNode { }); } + const providerList = Object.keys(reducer.currentReducerState.authentication_providers ?? {}) const recoveryDocument = reducer.currentReducerState.recovery_document + if (!recoveryDocument) { - return ( - <AnastasisClientFrame hideNav title="Recovery: Problem"> - <p>No recovery document found</p> - </AnastasisClientFrame> - ) + return <ChooseAnotherProviderScreen + providers={providerList} selected="" + onChange={(newProv) => doSelectVersion(newProv, 0)} + /> } + if (selectingVersion) { - return ( - <AnastasisClientFrame hideNav title="Recovery: Select secret"> - <p>Select a different version of the secret</p> - <select onChange={(e) => setOtherProvider((e.target as any).value)}> - {Object.keys(reducer.currentReducerState.authentication_providers ?? {}).map( - (x, i) => ( - <option key={i} selected={x === recoveryDocument.provider_url} value={x}> - {x} - </option> - ) - )} - </select> - <div> - <input - value={otherVersion} - onChange={(e) => setOtherVersion(Number((e.target as HTMLInputElement).value))} - type="number" /> - <button onClick={() => selectVersion(otherProvider, otherVersion)}> - Use this version - </button> + return <SelectOtherVersionProviderScreen providers={providerList} + provider={recoveryDocument.provider_url} version={recoveryDocument.version} + onCancel={() => setSelectingVersion(false)} + onConfirm={doSelectVersion} + /> + } + + return ( + <AnastasisClientFrame title="Recovery: Select secret"> + <div class="columns"> + <div class="column"> + <div class="box" style={{ border: '2px solid green' }}> + <h1 class="subtitle">{recoveryDocument.provider_url}</h1> + <div class="block"> + {currentVersion === 0 ? <p> + Set to recover the latest version + </p> : <p> + Set to recover the version number {currentVersion} + </p>} + </div> + <div class="buttons is-right"> + <button class="button" onClick={(e) => setSelectingVersion(true)}>Change secret's version</button> + </div> + </div> </div> - <div> - <button onClick={() => selectVersion(otherProvider, 0)}> - Use latest version - </button> + <div class="column"> + <p>Secret found, you can select another version or continue to the challenges solving</p> </div> - <div> - <button onClick={() => setSelectingVersion(false)}>Cancel</button> + </div> + </AnastasisClientFrame> + ); +} + + +function ChooseAnotherProviderScreen({ providers, selected, onChange }: { selected: string; providers: string[]; onChange: (prov: string) => void }): VNode { + return ( + <AnastasisClientFrame hideNext="Recovery document not found" title="Recovery: Problem"> + <p>No recovery document found, try with another provider</p> + <div class="field"> + <label class="label">Provider</label> + <div class="control is-expanded has-icons-left"> + <div class="select is-fullwidth"> + <select onChange={(e) => onChange(e.currentTarget.value)} value={selected}> + <option key="none" disabled selected value=""> Choose a provider </option> + {providers.map(prov => ( + <option key={prov} value={prov}> + {prov} + </option> + ))} + </select> + <div class="icon is-small is-left"> + <i class="mdi mdi-earth" /> + </div> + </div> </div> - </AnastasisClientFrame> - ); - } + </div> + </AnastasisClientFrame> + ); +} + +function SelectOtherVersionProviderScreen({ providers, provider, version, onConfirm, onCancel }: { onCancel: () => void; provider: string; version: number; providers: string[]; onConfirm: (prov: string, v: number) => Promise<void>; }): VNode { + const [otherProvider, setOtherProvider] = useState<string>(provider); + const [otherVersion, setOtherVersion] = useState(`${version}`); + return ( - <AnastasisClientFrame title="Recovery: Select secret"> - <p>Provider: {recoveryDocument.provider_url}</p> - <p>Secret version: {recoveryDocument.version}</p> - <p>Secret name: {recoveryDocument.secret_name}</p> - <button onClick={() => setSelectingVersion(true)}> - Select different secret - </button> + <AnastasisClientFrame hideNav title="Recovery: Select secret"> + <div class="columns"> + <div class="column"> + <div class="box"> + <h1 class="subtitle">Provider {otherProvider}</h1> + <div class="block"> + {version === 0 ? <p> + Set to recover the latest version + </p> : <p> + Set to recover the version number {version} + </p>} + <p>Specify other version below or use the latest</p> + </div> + + <div class="field"> + <label class="label">Provider</label> + <div class="control is-expanded has-icons-left"> + <div class="select is-fullwidth"> + <select onChange={(e) => setOtherProvider(e.currentTarget.value)} value={otherProvider}> + <option key="none" disabled selected value=""> Choose a provider </option> + {providers.map(prov => ( + <option key={prov} value={prov}> + {prov} + </option> + ))} + </select> + <div class="icon is-small is-left"> + <i class="mdi mdi-earth" /> + </div> + </div> + </div> + </div> + <div class="container"> + <NumberInput + label="Version" + placeholder="version number to recover" + grabFocus + bind={[otherVersion, setOtherVersion]} /> + </div> + </div> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={onCancel}>Cancel</button> + <div class="buttons"> + <AsyncButton class="button" onClick={() => onConfirm(otherProvider, 0)}>Use latest</AsyncButton> + <AsyncButton class="button is-info" onClick={() => onConfirm(otherProvider, parseInt(otherVersion, 10))}>Confirm</AsyncButton> + </div> + </div> + </div> + <div class="column"> + . + </div> + </div> + </AnastasisClientFrame> ); + } diff --git a/packages/anastasis-webui/src/pages/home/SolveEmailEntry.tsx b/packages/anastasis-webui/src/pages/home/SolveEmailEntry.tsx deleted file mode 100644 index 2c27895c2..000000000 --- a/packages/anastasis-webui/src/pages/home/SolveEmailEntry.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { h, VNode } from "preact"; -import { useState } from "preact/hooks"; -import { useAnastasisContext } from "../../context/anastasis"; -import { AnastasisClientFrame, LabeledInput } from "./index"; -import { SolveEntryProps } from "./SolveScreen"; - -export function SolveEmailEntry({ challenge, feedback }: SolveEntryProps): VNode { - const [answer, setAnswer] = useState(""); - const reducer = useAnastasisContext() - const next = (): void => { - if (reducer) reducer.transition("solve_challenge", { - answer, - }) - }; - return ( - <AnastasisClientFrame - title="Recovery: Solve challenge" - onNext={() => next()} - > - <p>Feedback: {JSON.stringify(feedback)}</p> - <p>{challenge.instructions}</p> - <LabeledInput label="Answer" grabFocus bind={[answer, setAnswer]} /> - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/SolvePostEntry.tsx b/packages/anastasis-webui/src/pages/home/SolvePostEntry.tsx deleted file mode 100644 index 1a824acb8..000000000 --- a/packages/anastasis-webui/src/pages/home/SolvePostEntry.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { h, VNode } from "preact"; -import { useState } from "preact/hooks"; -import { useAnastasisContext } from "../../context/anastasis"; -import { AnastasisClientFrame, LabeledInput } from "./index"; -import { SolveEntryProps } from "./SolveScreen"; - -export function SolvePostEntry({ challenge, feedback }: SolveEntryProps): VNode { - const [answer, setAnswer] = useState(""); - const reducer = useAnastasisContext() - const next = (): void => { - if (reducer) reducer.transition("solve_challenge", { answer }) - }; - return ( - <AnastasisClientFrame - title="Recovery: Solve challenge" - onNext={() => next()} - > - <p>Feedback: {JSON.stringify(feedback)}</p> - <p>{challenge.instructions}</p> - <LabeledInput label="Answer" grabFocus bind={[answer, setAnswer]} /> - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/SolveQuestionEntry.tsx b/packages/anastasis-webui/src/pages/home/SolveQuestionEntry.tsx deleted file mode 100644 index 72dadbe89..000000000 --- a/packages/anastasis-webui/src/pages/home/SolveQuestionEntry.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { h, VNode } from "preact"; -import { useState } from "preact/hooks"; -import { useAnastasisContext } from "../../context/anastasis"; -import { AnastasisClientFrame, LabeledInput } from "./index"; -import { SolveEntryProps } from "./SolveScreen"; - -export function SolveQuestionEntry({ challenge, feedback }: SolveEntryProps): VNode { - const [answer, setAnswer] = useState(""); - const reducer = useAnastasisContext() - const next = (): void => { - if (reducer) reducer.transition("solve_challenge", { answer }) - }; - return ( - <AnastasisClientFrame - title="Recovery: Solve challenge" - onNext={() => next()} - > - <p>Feedback: {JSON.stringify(feedback)}</p> - <p>Question: {challenge.instructions}</p> - <LabeledInput label="Answer" grabFocus bind={[answer, setAnswer]} /> - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/SolveScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/SolveScreen.stories.tsx index 69af9be42..cb6561b3f 100644 --- a/packages/anastasis-webui/src/pages/home/SolveScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/SolveScreen.stories.tsx @@ -26,8 +26,11 @@ import { SolveScreen as TestedComponent } from './SolveScreen'; export default { - title: 'Pages/SolveScreen', + title: 'Pages/recovery/SolveScreen', component: TestedComponent, + args: { + order: 6, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, @@ -41,7 +44,7 @@ export const NotSupportedChallenge = createExample(TestedComponent, { recovery_information: { challenges: [{ cost: 'USD:1', - instructions: 'follow htis instructions', + instructions: 'does P equals NP?', type: 'chall-type', uuid: 'ASDASDSAD!1' }], @@ -55,7 +58,7 @@ export const MismatchedChallengeId = createExample(TestedComponent, { recovery_information: { challenges: [{ cost: 'USD:1', - instructions: 'follow htis instructions', + instructions: 'does P equals NP?', type: 'chall-type', uuid: 'ASDASDSAD!1' }], @@ -69,7 +72,7 @@ export const SmsChallenge = createExample(TestedComponent, { recovery_information: { challenges: [{ cost: 'USD:1', - instructions: 'follow htis instructions', + instructions: 'SMS to 555-5555', type: 'sms', uuid: 'ASDASDSAD!1' }], @@ -83,7 +86,7 @@ export const QuestionChallenge = createExample(TestedComponent, { recovery_information: { challenges: [{ cost: 'USD:1', - instructions: 'follow htis instructions', + instructions: 'does P equals NP?', type: 'question', uuid: 'ASDASDSAD!1' }], @@ -97,7 +100,7 @@ export const EmailChallenge = createExample(TestedComponent, { recovery_information: { challenges: [{ cost: 'USD:1', - instructions: 'follow htis instructions', + instructions: 'Email to sebasjm@some-domain.com', type: 'email', uuid: 'ASDASDSAD!1' }], @@ -111,7 +114,7 @@ export const PostChallenge = createExample(TestedComponent, { recovery_information: { challenges: [{ cost: 'USD:1', - instructions: 'follow htis instructions', + instructions: 'Letter to address in postal code ABC123', type: 'post', uuid: 'ASDASDSAD!1' }], diff --git a/packages/anastasis-webui/src/pages/home/SolveScreen.tsx b/packages/anastasis-webui/src/pages/home/SolveScreen.tsx index 05ae50b48..bc1a88db3 100644 --- a/packages/anastasis-webui/src/pages/home/SolveScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/SolveScreen.tsx @@ -1,30 +1,93 @@ -import { h, VNode } from "preact"; -import { ChallengeFeedback, ChallengeInfo } from "../../../../anastasis-core/lib"; +import { Fragment, h, VNode } from "preact"; +import { useState } from "preact/hooks"; +import { AnastasisClientFrame } from "."; +import { + ChallengeFeedback, + ChallengeFeedbackStatus, + ChallengeInfo, +} from "../../../../anastasis-core/lib"; +import { AsyncButton } from "../../components/AsyncButton"; +import { TextInput } from "../../components/fields/TextInput"; import { useAnastasisContext } from "../../context/anastasis"; -import { SolveEmailEntry } from "./SolveEmailEntry"; -import { SolvePostEntry } from "./SolvePostEntry"; -import { SolveQuestionEntry } from "./SolveQuestionEntry"; -import { SolveSmsEntry } from "./SolveSmsEntry"; -import { SolveUnsupportedEntry } from "./SolveUnsupportedEntry"; + +function SolveOverviewFeedbackDisplay(props: { feedback?: ChallengeFeedback }) { + const { feedback } = props; + if (!feedback) { + return null; + } + switch (feedback.state) { + case ChallengeFeedbackStatus.Message: + return ( + <div> + <p>{feedback.message}</p> + </div> + ); + case ChallengeFeedbackStatus.Pending: + case ChallengeFeedbackStatus.AuthIban: + return null; + case ChallengeFeedbackStatus.RateLimitExceeded: + return <div>Rate limit exceeded.</div>; + case ChallengeFeedbackStatus.Redirect: + return <div>Redirect (FIXME: not supported)</div>; + case ChallengeFeedbackStatus.Unsupported: + return <div>Challenge not supported by client.</div>; + case ChallengeFeedbackStatus.TruthUnknown: + return <div>Truth unknown</div>; + default: + return ( + <div> + <pre>{JSON.stringify(feedback)}</pre> + </div> + ); + } +} export function SolveScreen(): VNode { - const reducer = useAnastasisContext() + const reducer = useAnastasisContext(); + const [answer, setAnswer] = useState(""); if (!reducer) { - return <div>no reducer in context</div> + return ( + <AnastasisClientFrame hideNav title="Recovery problem"> + <div>no reducer in context</div> + </AnastasisClientFrame> + ); } - if (!reducer.currentReducerState || reducer.currentReducerState.recovery_state === undefined) { - return <div>invalid state</div> + if ( + !reducer.currentReducerState || + reducer.currentReducerState.recovery_state === undefined + ) { + return ( + <AnastasisClientFrame hideNav title="Recovery problem"> + <div>invalid state</div> + </AnastasisClientFrame> + ); } if (!reducer.currentReducerState.recovery_information) { - return <div>no recovery information found</div> + return ( + <AnastasisClientFrame + hideNext="Recovery document not found" + title="Recovery problem" + > + <div>no recovery information found</div> + </AnastasisClientFrame> + ); } if (!reducer.currentReducerState.selected_challenge_uuid) { - return <div>no selected uuid</div> + return ( + <AnastasisClientFrame hideNav title="Recovery problem"> + <div>invalid state</div> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={() => reducer.back()}>Back</button> + </div> + </AnastasisClientFrame> + ); } + const chArr = reducer.currentReducerState.recovery_information.challenges; - const challengeFeedback = reducer.currentReducerState.challenge_feedback ?? {}; + const challengeFeedback = + reducer.currentReducerState.challenge_feedback ?? {}; const selectedUuid = reducer.currentReducerState.selected_challenge_uuid; const challenges: { [uuid: string]: ChallengeInfo; @@ -39,16 +102,137 @@ export function SolveScreen(): VNode { email: SolveEmailEntry, post: SolvePostEntry, }; - const SolveDialog = dialogMap[selectedChallenge?.type] ?? SolveUnsupportedEntry; + const SolveDialog = + selectedChallenge === undefined + ? SolveUndefinedEntry + : dialogMap[selectedChallenge.type] ?? SolveUnsupportedEntry; + + async function onNext(): Promise<void> { + return reducer?.transition("solve_challenge", { answer }); + } + function onCancel(): void { + reducer?.back(); + } + return ( - <SolveDialog - challenge={selectedChallenge} - feedback={challengeFeedback[selectedUuid]} /> + <AnastasisClientFrame hideNav title="Recovery: Solve challenge"> + <SolveOverviewFeedbackDisplay + feedback={challengeFeedback[selectedUuid]} + /> + <SolveDialog + id={selectedUuid} + answer={answer} + setAnswer={setAnswer} + challenge={selectedChallenge} + feedback={challengeFeedback[selectedUuid]} + /> + + <div + style={{ + marginTop: "2em", + display: "flex", + justifyContent: "space-between", + }} + > + <button class="button" onClick={onCancel}> + Cancel + </button> + <AsyncButton class="button is-info" onClick={onNext}> + Confirm + </AsyncButton> + </div> + </AnastasisClientFrame> ); } export interface SolveEntryProps { + id: string; challenge: ChallengeInfo; feedback?: ChallengeFeedback; + answer: string; + setAnswer: (s: string) => void; } +function SolveSmsEntry({ + challenge, + answer, + setAnswer, +}: SolveEntryProps): VNode { + return ( + <Fragment> + <p> + An sms has been sent to "<b>{challenge.instructions}</b>". Type the code + below + </p> + <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} /> + </Fragment> + ); +} +function SolveQuestionEntry({ + challenge, + answer, + setAnswer, +}: SolveEntryProps): VNode { + return ( + <Fragment> + <p>Type the answer to the following question:</p> + <pre>{challenge.instructions}</pre> + <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} /> + </Fragment> + ); +} + +function SolvePostEntry({ + challenge, + answer, + setAnswer, +}: SolveEntryProps): VNode { + return ( + <Fragment> + <p> + instruction for post type challenge "<b>{challenge.instructions}</b>" + </p> + <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} /> + </Fragment> + ); +} + +function SolveEmailEntry({ + challenge, + answer, + setAnswer, +}: SolveEntryProps): VNode { + return ( + <Fragment> + <p> + An email has been sent to "<b>{challenge.instructions}</b>". Type the + code below + </p> + <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} /> + </Fragment> + ); +} + +function SolveUnsupportedEntry(props: SolveEntryProps): VNode { + return ( + <Fragment> + <p> + The challenge selected is not supported for this UI. Please update this + version or try using another policy. + </p> + <p> + <b>Challenge type:</b> {props.challenge.type} + </p> + </Fragment> + ); +} +function SolveUndefinedEntry(props: SolveEntryProps): VNode { + return ( + <Fragment> + <p> + There is no challenge information for id <b>"{props.id}"</b>. Try + resetting the recovery session. + </p> + </Fragment> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/SolveSmsEntry.tsx b/packages/anastasis-webui/src/pages/home/SolveSmsEntry.tsx deleted file mode 100644 index 163e0d1f3..000000000 --- a/packages/anastasis-webui/src/pages/home/SolveSmsEntry.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { h, VNode } from "preact"; -import { useState } from "preact/hooks"; -import { useAnastasisContext } from "../../context/anastasis"; -import { AnastasisClientFrame, LabeledInput } from "./index"; -import { SolveEntryProps } from "./SolveScreen"; - -export function SolveSmsEntry({ challenge, feedback }: SolveEntryProps): VNode { - const [answer, setAnswer] = useState(""); - const reducer = useAnastasisContext() - const next = (): void => { - if (reducer) reducer.transition("solve_challenge", { - answer, - }) - }; - return ( - <AnastasisClientFrame - title="Recovery: Solve challenge" - onNext={() => next()} - > - <p>Feedback: {JSON.stringify(feedback)}</p> - <p>{challenge.instructions}</p> - <LabeledInput label="Answer" grabFocus bind={[answer, setAnswer]} /> - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/SolveUnsupportedEntry.tsx b/packages/anastasis-webui/src/pages/home/SolveUnsupportedEntry.tsx deleted file mode 100644 index 7f538d249..000000000 --- a/packages/anastasis-webui/src/pages/home/SolveUnsupportedEntry.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { h, VNode } from "preact"; -import { AnastasisClientFrame } from "./index"; -import { SolveEntryProps } from "./SolveScreen"; - -export function SolveUnsupportedEntry(props: SolveEntryProps): VNode { - return ( - <AnastasisClientFrame hideNext title="Recovery: Solve challenge"> - <p>{JSON.stringify(props.challenge)}</p> - <p>Challenge not supported.</p> - </AnastasisClientFrame> - ); -} diff --git a/packages/anastasis-webui/src/pages/home/StartScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/StartScreen.stories.tsx index ad84cd8f2..657a2dd74 100644 --- a/packages/anastasis-webui/src/pages/home/StartScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/StartScreen.stories.tsx @@ -26,6 +26,9 @@ import { StartScreen as TestedComponent } from './StartScreen'; export default { title: 'Pages/StartScreen', component: TestedComponent, + args: { + order: 1, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, diff --git a/packages/anastasis-webui/src/pages/home/StartScreen.tsx b/packages/anastasis-webui/src/pages/home/StartScreen.tsx index 6625ec5b8..d53df4cae 100644 --- a/packages/anastasis-webui/src/pages/home/StartScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/StartScreen.tsx @@ -10,24 +10,29 @@ export function StartScreen(): VNode { } return ( <AnastasisClientFrame hideNav title="Home"> - <div> - <section class="section is-main-section"> - <div class="columns"> - <div class="column" /> - <div class="column is-four-fifths"> + <div class="columns"> + <div class="column" /> + <div class="column is-four-fifths"> - <div class="buttons is-right"> - <button class="button is-success" autoFocus onClick={() => reducer.startBackup()}> - Backup - </button> + <div class="buttons"> + <button class="button is-success" autoFocus onClick={() => reducer.startBackup()}> + <div class="icon"><i class="mdi mdi-arrow-up" /></div> + <span>Backup a secret</span> + </button> - <button class="button is-info" onClick={() => reducer.startRecover()}>Recover</button> - </div> + <button class="button is-info" onClick={() => reducer.startRecover()}> + <div class="icon"><i class="mdi mdi-arrow-down" /></div> + <span>Recover a secret</span> + </button> - </div> - <div class="column" /> + {/* <button class="button"> + <div class="icon"><i class="mdi mdi-file" /></div> + <span>Restore a session</span> + </button> */} </div> - </section> + + </div> + <div class="column" /> </div> </AnastasisClientFrame> ); diff --git a/packages/anastasis-webui/src/pages/home/TruthsPayingScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/TruthsPayingScreen.stories.tsx index e2f3d521e..7568ccd69 100644 --- a/packages/anastasis-webui/src/pages/home/TruthsPayingScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/TruthsPayingScreen.stories.tsx @@ -25,8 +25,11 @@ import { TruthsPayingScreen as TestedComponent } from './TruthsPayingScreen'; export default { - title: 'Pages/TruthsPayingScreen', + title: 'Pages/backup/__TruthsPayingScreen', component: TestedComponent, + args: { + order: 10, + }, argTypes: { onUpdate: { action: 'onUpdate' }, onBack: { action: 'onBack' }, diff --git a/packages/anastasis-webui/src/pages/home/TruthsPayingScreen.tsx b/packages/anastasis-webui/src/pages/home/TruthsPayingScreen.tsx index 319f590a0..0b32e0db5 100644 --- a/packages/anastasis-webui/src/pages/home/TruthsPayingScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/TruthsPayingScreen.tsx @@ -13,8 +13,8 @@ export function TruthsPayingScreen(): VNode { const payments = reducer.currentReducerState.payments ?? []; return ( <AnastasisClientFrame - hideNext - title="Backup: Authentication Storage Payments" + hideNext={"FIXME"} + title="Backup: Truths Paying" > <p> Some of the providers require a payment to store the encrypted diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.stories.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.stories.tsx new file mode 100644 index 000000000..e178a4955 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.stories.tsx @@ -0,0 +1,66 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { createExample, reducerStatesExample } from '../../../utils'; +import { authMethods as TestedComponent, KnownAuthMethods } from './index'; + + +export default { + title: 'Pages/backup/authMethods/email', + component: TestedComponent, + args: { + order: 5, + }, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +const type: KnownAuthMethods = 'email' + +export const Empty = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [] +}); + +export const WithOneExample = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Email to sebasjm@email.com ', + remove: () => null + }] +}); + +export const WithMoreExamples = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Email to sebasjm@email.com', + remove: () => null + },{ + challenge: 'qwe', + type, + instructions: 'Email to someone@sebasjm.com', + remove: () => null + }] +}); diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.tsx new file mode 100644 index 000000000..1a6be1b61 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.tsx @@ -0,0 +1,62 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { + encodeCrock, + stringToBytes +} from "@gnu-taler/taler-util"; +import { Fragment, h, VNode } from "preact"; +import { useState } from "preact/hooks"; +import { AuthMethodSetupProps } from "../AuthenticationEditorScreen"; +import { AnastasisClientFrame } from "../index"; +import { TextInput } from "../../../components/fields/TextInput"; +import { EmailInput } from "../../../components/fields/EmailInput"; + +const EMAIL_PATTERN = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + +export function AuthMethodEmailSetup({ cancel, addAuthMethod, configured }: AuthMethodSetupProps): VNode { + const [email, setEmail] = useState(""); + const addEmailAuth = (): void => addAuthMethod({ + authentication_method: { + type: "email", + instructions: `Email to ${email}`, + challenge: encodeCrock(stringToBytes(email)), + }, + }); + const emailError = !EMAIL_PATTERN.test(email) ? 'Email address is not valid' : undefined + const errors = !email ? 'Add your email' : emailError + + return ( + <AnastasisClientFrame hideNav title="Add email authentication"> + <p> + For email authentication, you need to provide an email address. When + recovering your secret, you will need to enter the code you receive by + email. + </p> + <div> + <EmailInput + label="Email address" + error={emailError} + placeholder="email@domain.com" + bind={[email, setEmail]} /> + </div> + {configured.length > 0 && <section class="section"> + <div class="block"> + Your emails: + </div><div class="block"> + {configured.map((c, i) => { + return <div key={i} class="box" style={{ display: 'flex', justifyContent: 'space-between' }}> + <p style={{ marginBottom: 'auto', marginTop: 'auto' }}>{c.instructions}</p> + <div><button class="button is-danger" onClick={c.remove} >Delete</button></div> + </div> + })} + </div></section>} + <div> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <span data-tooltip={errors}> + <button class="button is-info" disabled={errors !== undefined} onClick={addEmailAuth}>Add</button> + </span> + </div> + </div> + </AnastasisClientFrame> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.stories.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.stories.tsx new file mode 100644 index 000000000..71f618646 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.stories.tsx @@ -0,0 +1,65 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { createExample, reducerStatesExample } from '../../../utils'; +import { authMethods as TestedComponent, KnownAuthMethods } from './index'; + + +export default { + title: 'Pages/backup/authMethods/IBAN', + component: TestedComponent, + args: { + order: 5, + }, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +const type: KnownAuthMethods = 'iban' + +export const Empty = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [] +}); + +export const WithOneExample = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Wire transfer from QWEASD123123 with holder Sebastian', + remove: () => null + }] +}); +export const WithMoreExamples = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Wire transfer from QWEASD123123 with holder Javier', + remove: () => null + },{ + challenge: 'qwe', + type, + instructions: 'Wire transfer from QWEASD123123 with holder Sebastian', + remove: () => null + }] +},); diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.tsx new file mode 100644 index 000000000..c9edbfa07 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.tsx @@ -0,0 +1,68 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { + canonicalJson, + encodeCrock, + stringToBytes +} from "@gnu-taler/taler-util"; +import { h, VNode } from "preact"; +import { useState } from "preact/hooks"; +import { TextInput } from "../../../components/fields/TextInput"; +import { AuthMethodSetupProps } from "../AuthenticationEditorScreen"; +import { AnastasisClientFrame } from "../index"; + +export function AuthMethodIbanSetup({ addAuthMethod, cancel, configured }: AuthMethodSetupProps): VNode { + const [name, setName] = useState(""); + const [account, setAccount] = useState(""); + const addIbanAuth = (): void => addAuthMethod({ + authentication_method: { + type: "iban", + instructions: `Wire transfer from ${account} with holder ${name}`, + challenge: encodeCrock(stringToBytes(canonicalJson({ + name, account + }))), + }, + }); + const errors = !name ? 'Add an account name' : ( + !account ? 'Add an account IBAN number' : undefined + ) + return ( + <AnastasisClientFrame hideNav title="Add bank transfer authentication"> + <p> + For bank transfer authentication, you need to provide a bank + account (account holder name and IBAN). When recovering your + secret, you will be asked to pay the recovery fee via bank + transfer from the account you provided here. + </p> + <div> + <TextInput + label="Bank account holder name" + grabFocus + placeholder="John Smith" + bind={[name, setName]} /> + <TextInput + label="IBAN" + placeholder="DE91100000000123456789" + bind={[account, setAccount]} /> + </div> + {configured.length > 0 && <section class="section"> + <div class="block"> + Your bank accounts: + </div><div class="block"> + {configured.map((c, i) => { + return <div key={i} class="box" style={{ display: 'flex', justifyContent: 'space-between' }}> + <p style={{ marginBottom: 'auto', marginTop: 'auto' }}>{c.instructions}</p> + <div><button class="button is-danger" onClick={c.remove} >Delete</button></div> + </div> + })} + </div></section>} + <div> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <span data-tooltip={errors}> + <button class="button is-info" disabled={errors !== undefined} onClick={addIbanAuth}>Add</button> + </span> + </div> + </div> + </AnastasisClientFrame> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.stories.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.stories.tsx new file mode 100644 index 000000000..0f1c17495 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.stories.tsx @@ -0,0 +1,66 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { createExample, reducerStatesExample } from '../../../utils'; +import { authMethods as TestedComponent, KnownAuthMethods } from './index'; + + +export default { + title: 'Pages/backup/authMethods/Post', + component: TestedComponent, + args: { + order: 5, + }, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +const type: KnownAuthMethods = 'post' + +export const Empty = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [] +}); + +export const WithOneExample = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Letter to address in postal code QWE456', + remove: () => null + }] +}); + +export const WithMoreExamples = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Letter to address in postal code QWE456', + remove: () => null + },{ + challenge: 'qwe', + type, + instructions: 'Letter to address in postal code ABC123', + remove: () => null + }] +}); diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.tsx new file mode 100644 index 000000000..bfeaaa832 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.tsx @@ -0,0 +1,102 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { + canonicalJson, encodeCrock, + stringToBytes +} from "@gnu-taler/taler-util"; +import { Fragment, h, VNode } from "preact"; +import { useState } from "preact/hooks"; +import { AuthMethodSetupProps } from "../AuthenticationEditorScreen"; +import { TextInput } from "../../../components/fields/TextInput"; +import { AnastasisClientFrame } from ".."; + +export function AuthMethodPostSetup({ addAuthMethod, cancel, configured }: AuthMethodSetupProps): VNode { + const [fullName, setFullName] = useState(""); + const [street, setStreet] = useState(""); + const [city, setCity] = useState(""); + const [postcode, setPostcode] = useState(""); + const [country, setCountry] = useState(""); + + const addPostAuth = () => { + const challengeJson = { + full_name: fullName, + street, + city, + postcode, + country, + }; + addAuthMethod({ + authentication_method: { + type: "post", + instructions: `Letter to address in postal code ${postcode}`, + challenge: encodeCrock(stringToBytes(canonicalJson(challengeJson))), + }, + }); + }; + + const errors = !fullName ? 'The full name is missing' : ( + !street ? 'The street is missing' : ( + !city ? 'The city is missing' : ( + !postcode ? 'The postcode is missing' : ( + !country ? 'The country is missing' : undefined + ) + ) + ) + ) + return ( + <AnastasisClientFrame hideNav title="Add postal authentication"> + <p> + For postal letter authentication, you need to provide a postal + address. When recovering your secret, you will be asked to enter a + code that you will receive in a letter to that address. + </p> + <div> + <TextInput + grabFocus + label="Full Name" + bind={[fullName, setFullName]} + /> + </div> + <div> + <TextInput + label="Street" + bind={[street, setStreet]} + /> + </div> + <div> + <TextInput + label="City" bind={[city, setCity]} + /> + </div> + <div> + <TextInput + label="Postal Code" bind={[postcode, setPostcode]} + /> + </div> + <div> + <TextInput + label="Country" + bind={[country, setCountry]} + /> + </div> + + {configured.length > 0 && <section class="section"> + <div class="block"> + Your postal code: + </div><div class="block"> + {configured.map((c, i) => { + return <div key={i} class="box" style={{ display: 'flex', justifyContent: 'space-between' }}> + <p style={{ marginBottom: 'auto', marginTop: 'auto' }}>{c.instructions}</p> + <div><button class="button is-danger" onClick={c.remove} >Delete</button></div> + </div> + })} + </div> + </section>} + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <span data-tooltip={errors}> + <button class="button is-info" disabled={errors !== undefined} onClick={addPostAuth}>Add</button> + </span> + </div> + </AnastasisClientFrame> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.stories.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.stories.tsx new file mode 100644 index 000000000..3ba4a84ca --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.stories.tsx @@ -0,0 +1,66 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { createExample, reducerStatesExample } from '../../../utils'; +import { authMethods as TestedComponent, KnownAuthMethods } from './index'; + + +export default { + title: 'Pages/backup/authMethods/Question', + component: TestedComponent, + args: { + order: 5, + }, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +const type: KnownAuthMethods = 'question' + +export const Empty = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [] +}); + +export const WithOneExample = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Is integer factorization polynomial? (non-quantum computer)', + remove: () => null + }] +}); + +export const WithMoreExamples = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Does P equal NP?', + remove: () => null + },{ + challenge: 'asd', + type, + instructions: 'Are continuous groups automatically differential groups?', + remove: () => null + }] +}); diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.tsx new file mode 100644 index 000000000..04fa00d59 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.tsx @@ -0,0 +1,71 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { + encodeCrock, + stringToBytes +} from "@gnu-taler/taler-util"; +import { Fragment, h, VNode } from "preact"; +import { useState } from "preact/hooks"; +import { AuthMethodSetupProps } from "../AuthenticationEditorScreen"; +import { AnastasisClientFrame } from "../index"; +import { TextInput } from "../../../components/fields/TextInput"; + +export function AuthMethodQuestionSetup({ cancel, addAuthMethod, configured }: AuthMethodSetupProps): VNode { + const [questionText, setQuestionText] = useState(""); + const [answerText, setAnswerText] = useState(""); + const addQuestionAuth = (): void => addAuthMethod({ + authentication_method: { + type: "question", + instructions: questionText, + challenge: encodeCrock(stringToBytes(answerText)), + }, + }); + + const errors = !questionText ? "Add your security question" : ( + !answerText ? 'Add the answer to your question' : undefined + ) + return ( + <AnastasisClientFrame hideNav title="Add Security Question"> + <div> + <p> + For2 security question authentication, you need to provide a question + and its answer. When recovering your secret, you will be shown the + question and you will need to type the answer exactly as you typed it + here. + </p> + <div> + <TextInput + label="Security question" + grabFocus + placeholder="Your question" + bind={[questionText, setQuestionText]} /> + </div> + <div> + <TextInput + label="Answer" + placeholder="Your answer" + bind={[answerText, setAnswerText]} + /> + </div> + + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <span data-tooltip={errors}> + <button class="button is-info" disabled={errors !== undefined} onClick={addQuestionAuth}>Add</button> + </span> + </div> + + {configured.length > 0 && <section class="section"> + <div class="block"> + Your security questions: + </div><div class="block"> + {configured.map((c, i) => { + return <div key={i} class="box" style={{ display: 'flex', justifyContent: 'space-between' }}> + <p style={{ marginBottom: 'auto', marginTop: 'auto' }}>{c.instructions}</p> + <div><button class="button is-danger" onClick={c.remove} >Delete</button></div> + </div> + })} + </div></section>} + </div> + </AnastasisClientFrame > + ); +} diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.stories.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.stories.tsx new file mode 100644 index 000000000..ae8297ef7 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.stories.tsx @@ -0,0 +1,66 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { createExample, reducerStatesExample } from '../../../utils'; +import { authMethods as TestedComponent, KnownAuthMethods } from './index'; + + +export default { + title: 'Pages/backup/authMethods/Sms', + component: TestedComponent, + args: { + order: 5, + }, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +const type: KnownAuthMethods = 'sms' + +export const Empty = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [] +}); + +export const WithOneExample = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'SMS to +11-1234-2345', + remove: () => null + }] +}); + +export const WithMoreExamples = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'SMS to +11-1234-2345', + remove: () => null + },{ + challenge: 'qwe', + type, + instructions: 'SMS to +11-5555-2345', + remove: () => null + }] +}); diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.tsx new file mode 100644 index 000000000..9e85af2b2 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.tsx @@ -0,0 +1,63 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { + encodeCrock, + stringToBytes +} from "@gnu-taler/taler-util"; +import { Fragment, h, VNode } from "preact"; +import { useLayoutEffect, useRef, useState } from "preact/hooks"; +import { NumberInput } from "../../../components/fields/NumberInput"; +import { AuthMethodSetupProps } from "../AuthenticationEditorScreen"; +import { AnastasisClientFrame } from "../index"; + +export function AuthMethodSmsSetup({ addAuthMethod, cancel, configured }: AuthMethodSetupProps): VNode { + const [mobileNumber, setMobileNumber] = useState(""); + const addSmsAuth = (): void => { + addAuthMethod({ + authentication_method: { + type: "sms", + instructions: `SMS to ${mobileNumber}`, + challenge: encodeCrock(stringToBytes(mobileNumber)), + }, + }); + }; + const inputRef = useRef<HTMLInputElement>(null); + useLayoutEffect(() => { + inputRef.current?.focus(); + }, []); + const errors = !mobileNumber ? 'Add a mobile number' : undefined + return ( + <AnastasisClientFrame hideNav title="Add SMS authentication"> + <div> + <p> + For SMS authentication, you need to provide a mobile number. When + recovering your secret, you will be asked to enter the code you + receive via SMS. + </p> + <div class="container"> + <NumberInput + label="Mobile number" + placeholder="Your mobile number" + grabFocus + bind={[mobileNumber, setMobileNumber]} /> + </div> + {configured.length > 0 && <section class="section"> + <div class="block"> + Your mobile numbers: + </div><div class="block"> + {configured.map((c, i) => { + return <div key={i} class="box" style={{ display: 'flex', justifyContent: 'space-between' }}> + <p style={{ marginTop: 'auto', marginBottom: 'auto' }}>{c.instructions}</p> + <div><button class="button is-danger" onClick={c.remove}>Delete</button></div> + </div> + })} + </div></section>} + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <span data-tooltip={errors}> + <button class="button is-info" disabled={errors !== undefined} onClick={addSmsAuth}>Add</button> + </span> + </div> + </div> + </AnastasisClientFrame> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.stories.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.stories.tsx new file mode 100644 index 000000000..4e46b600e --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.stories.tsx @@ -0,0 +1,64 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { createExample, reducerStatesExample } from '../../../utils'; +import { authMethods as TestedComponent, KnownAuthMethods } from './index'; + + +export default { + title: 'Pages/backup/authMethods/TOTP', + component: TestedComponent, + args: { + order: 5, + }, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +const type: KnownAuthMethods = 'totp' + +export const Empty = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [] +}); +export const WithOneExample = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Enter 8 digits code for "Anastasis"', + remove: () => null + }] +}); +export const WithMoreExample = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: 'Enter 8 digits code for "Anastasis1"', + remove: () => null + },{ + challenge: 'qwe', + type, + instructions: 'Enter 8 digits code for "Anastasis2"', + remove: () => null + }] +}); diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx new file mode 100644 index 000000000..fd0bd0224 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx @@ -0,0 +1,81 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { + encodeCrock, + stringToBytes +} from "@gnu-taler/taler-util"; +import { h, VNode } from "preact"; +import { useMemo, useState } from "preact/hooks"; +import { AuthMethodSetupProps } from "../AuthenticationEditorScreen"; +import { AnastasisClientFrame } from "../index"; +import { TextInput } from "../../../components/fields/TextInput"; +import { QR } from "../../../components/QR"; +import { base32enc, computeTOTPandCheck } from "./totp"; + +export function AuthMethodTotpSetup({ addAuthMethod, cancel, configured }: AuthMethodSetupProps): VNode { + const [name, setName] = useState("anastasis"); + const [test, setTest] = useState(""); + const digits = 8 + const secretKey = useMemo(() => { + const array = new Uint8Array(32) + return window.crypto.getRandomValues(array) + }, []) + const secret32 = base32enc(secretKey); + const totpURL = `otpauth://totp/${name}?digits=${digits}&secret=${secret32}` + + const addTotpAuth = (): void => addAuthMethod({ + authentication_method: { + type: "totp", + instructions: `Enter ${digits} digits code for "${name}"`, + challenge: encodeCrock(stringToBytes(totpURL)), + }, + }); + + const testCodeMatches = computeTOTPandCheck(secretKey, 8, parseInt(test, 10)); + + const errors = !name ? 'The TOTP name is missing' : ( + !testCodeMatches ? 'The test code doesnt match' : undefined + ); + return ( + <AnastasisClientFrame hideNav title="Add TOTP authentication"> + <p> + For Time-based One-Time Password (TOTP) authentication, you need to set + a name for the TOTP secret. Then, you must scan the generated QR code + with your TOTP App to import the TOTP secret into your TOTP App. + </p> + <div class="block"> + <TextInput + label="TOTP Name" + grabFocus + bind={[name, setName]} /> + </div> + <div style={{ height: 300 }}> + <QR text={totpURL} /> + </div> + <p> + After scanning the code with your TOTP App, test it in the input below. + </p> + <TextInput + label="Test code" + bind={[test, setTest]} /> + {configured.length > 0 && <section class="section"> + <div class="block"> + Your TOTP numbers: + </div><div class="block"> + {configured.map((c, i) => { + return <div key={i} class="box" style={{ display: 'flex', justifyContent: 'space-between' }}> + <p style={{ marginTop: 'auto', marginBottom: 'auto' }}>{c.instructions}</p> + <div><button class="button is-danger" onClick={c.remove}>Delete</button></div> + </div> + })} + </div></section>} + <div> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <span data-tooltip={errors}> + <button class="button is-info" disabled={errors !== undefined} onClick={addTotpAuth}>Add</button> + </span> + </div> + </div> + </AnastasisClientFrame> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.stories.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.stories.tsx new file mode 100644 index 000000000..3c4c7bf39 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.stories.tsx @@ -0,0 +1,66 @@ +/* eslint-disable @typescript-eslint/camelcase */ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** +* +* @author Sebastian Javier Marchano (sebasjm) +*/ + +import { createExample, reducerStatesExample } from '../../../utils'; +import { authMethods as TestedComponent, KnownAuthMethods } from './index'; +import logoImage from '../../../assets/logo.jpeg' + +export default { + title: 'Pages/backup/authMethods/Video', + component: TestedComponent, + args: { + order: 5, + }, + argTypes: { + onUpdate: { action: 'onUpdate' }, + onBack: { action: 'onBack' }, + }, +}; + +const type: KnownAuthMethods = 'video' + +export const Empty = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [] +}); + +export const WithOneExample = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: logoImage, + remove: () => null + }] +}); + +export const WithMoreExamples = createExample(TestedComponent[type].screen, reducerStatesExample.authEditing, { + configured: [{ + challenge: 'qwe', + type, + instructions: logoImage, + remove: () => null + },{ + challenge: 'qwe', + type, + instructions: logoImage, + remove: () => null + }] +}); diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.tsx new file mode 100644 index 000000000..8be999b3f --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.tsx @@ -0,0 +1,56 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { + encodeCrock, + stringToBytes +} from "@gnu-taler/taler-util"; +import { h, VNode } from "preact"; +import { useState } from "preact/hooks"; +import { ImageInput } from "../../../components/fields/ImageInput"; +import { AuthMethodSetupProps } from "../AuthenticationEditorScreen"; +import { AnastasisClientFrame } from "../index"; + +export function AuthMethodVideoSetup({cancel, addAuthMethod, configured}: AuthMethodSetupProps): VNode { + const [image, setImage] = useState(""); + const addVideoAuth = (): void => { + addAuthMethod({ + authentication_method: { + type: "video", + instructions: 'Join a video call', + challenge: encodeCrock(stringToBytes(image)), + }, + }) + }; + return ( + <AnastasisClientFrame hideNav title="Add video authentication"> + <p> + For video identification, you need to provide a passport-style + photograph. When recovering your secret, you will be asked to join a + video call. During that call, a human will use the photograph to + verify your identity. + </p> + <div style={{textAlign:'center'}}> + <ImageInput + label="Choose photograph" + grabFocus + bind={[image, setImage]} /> + </div> + {configured.length > 0 && <section class="section"> + <div class="block"> + Your photographs: + </div><div class="block"> + {configured.map((c, i) => { + return <div key={i} class="box" style={{ display: 'flex', justifyContent: 'space-between' }}> + <img style={{ marginTop: 'auto', marginBottom: 'auto', width: 100, height:100, border: 'solid 1px black' }} src={c.instructions} /> + <div style={{marginTop: 'auto', marginBottom: 'auto'}}><button class="button is-danger" onClick={c.remove}>Delete</button></div> + </div> + })} + </div></section>} + <div> + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={cancel}>Cancel</button> + <button class="button is-info" onClick={addVideoAuth}>Add</button> + </div> + </div> + </AnastasisClientFrame> + ); +} diff --git a/packages/anastasis-webui/src/pages/home/authMethod/index.tsx b/packages/anastasis-webui/src/pages/home/authMethod/index.tsx new file mode 100644 index 000000000..7b0cce883 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/index.tsx @@ -0,0 +1,69 @@ +import { h, VNode } from "preact"; +import { AuthMethodSetupProps } from "../AuthenticationEditorScreen"; + +import { AuthMethodEmailSetup as EmailScreen } from "./AuthMethodEmailSetup"; +import { AuthMethodIbanSetup as IbanScreen } from "./AuthMethodIbanSetup"; +import { AuthMethodPostSetup as PostalScreen } from "./AuthMethodPostSetup"; +import { AuthMethodQuestionSetup as QuestionScreen } from "./AuthMethodQuestionSetup"; +import { AuthMethodSmsSetup as SmsScreen } from "./AuthMethodSmsSetup"; +import { AuthMethodTotpSetup as TotpScreen } from "./AuthMethodTotpSetup"; +import { AuthMethodVideoSetup as VideScreen } from "./AuthMethodVideoSetup"; +import postalIcon from '../../../assets/icons/auth_method/postal.svg'; +import questionIcon from '../../../assets/icons/auth_method/question.svg'; +import smsIcon from '../../../assets/icons/auth_method/sms.svg'; +import videoIcon from '../../../assets/icons/auth_method/video.svg'; + +interface AuthMethodConfiguration { + icon: VNode; + label: string; + screen: (props: AuthMethodSetupProps) => VNode; + skip?: boolean; +} +export type KnownAuthMethods = "sms" | "email" | "post" | "question" | "video" | "totp" | "iban"; + +type KnowMethodConfig = { + [name in KnownAuthMethods]: AuthMethodConfiguration; +}; + +export const authMethods: KnowMethodConfig = { + question: { + icon: <img src={questionIcon} />, + label: "Question", + screen: QuestionScreen + }, + sms: { + icon: <img src={smsIcon} />, + label: "SMS", + screen: SmsScreen + }, + email: { + icon: <i class="mdi mdi-email" />, + label: "Email", + screen: EmailScreen + + }, + iban: { + icon: <i class="mdi mdi-bank" />, + label: "IBAN", + screen: IbanScreen + + }, + post: { + icon: <img src={postalIcon} />, + label: "Physical mail", + screen: PostalScreen + + }, + totp: { + icon: <i class="mdi mdi-devices" />, + label: "TOTP", + screen: TotpScreen + + }, + video: { + icon: <img src={videoIcon} />, + label: "Video", + screen: VideScreen, + skip: true, + } +}
\ No newline at end of file diff --git a/packages/anastasis-webui/src/pages/home/authMethod/totp.ts b/packages/anastasis-webui/src/pages/home/authMethod/totp.ts new file mode 100644 index 000000000..0bc3feaf8 --- /dev/null +++ b/packages/anastasis-webui/src/pages/home/authMethod/totp.ts @@ -0,0 +1,56 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import jssha from 'jssha' + +const SEARCH_RANGE = 16 +const timeStep = 30 + +export function computeTOTPandCheck(secretKey: Uint8Array, digits: number, code: number): boolean { + const now = new Date().getTime() + const epoch = Math.floor(Math.round(now / 1000.0) / timeStep); + + for (let ms = -SEARCH_RANGE; ms < SEARCH_RANGE; ms++) { + const movingFactor = (epoch + ms).toString(16).padStart(16, "0"); + + const hmacSha = new jssha('SHA-1', 'HEX', { hmacKey: { value: secretKey, format: 'UINT8ARRAY' } }); + hmacSha.update(movingFactor); + const hmac_text = hmacSha.getHMAC('UINT8ARRAY'); + + const offset = (hmac_text[hmac_text.length - 1] & 0xf) + + const otp = (( + (hmac_text[offset + 0] << 24) + + (hmac_text[offset + 1] << 16) + + (hmac_text[offset + 2] << 8) + + (hmac_text[offset + 3]) + ) & 0x7fffffff) % Math.pow(10, digits) + + if (otp == code) return true + } + return false +} + +const encTable__ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".split('') +export function base32enc(buffer: Uint8Array): string { + let rpos = 0 + let bits = 0 + let vbit = 0 + + let result = "" + while ((rpos < buffer.length) || (vbit > 0)) { + if ((rpos < buffer.length) && (vbit < 5)) { + bits = (bits << 8) | buffer[rpos++]; + vbit += 8; + } + if (vbit < 5) { + bits <<= (5 - vbit); + vbit = 5; + } + result += encTable__[(bits >> (vbit - 5)) & 31]; + vbit -= 5; + } + return result +} + +// const array = new Uint8Array(256) +// const secretKey = window.crypto.getRandomValues(array) +// console.log(base32enc(secretKey)) diff --git a/packages/anastasis-webui/src/pages/home/index.tsx b/packages/anastasis-webui/src/pages/home/index.tsx index 4cec47ec8..07bc7c604 100644 --- a/packages/anastasis-webui/src/pages/home/index.tsx +++ b/packages/anastasis-webui/src/pages/home/index.tsx @@ -11,11 +11,11 @@ import { VNode } from "preact"; import { - useErrorBoundary, - useLayoutEffect, - useRef + useErrorBoundary } from "preact/hooks"; +import { AsyncButton } from "../../components/AsyncButton"; import { Menu } from "../../components/menu"; +import { Notifications } from "../../components/Notifications"; import { AnastasisProvider, useAnastasisContext } from "../../context/anastasis"; import { AnastasisReducerApi, @@ -25,8 +25,8 @@ import { AttributeEntryScreen } from "./AttributeEntryScreen"; import { AuthenticationEditorScreen } from "./AuthenticationEditorScreen"; import { BackupFinishedScreen } from "./BackupFinishedScreen"; import { ChallengeOverviewScreen } from "./ChallengeOverviewScreen"; +import { ChallengePayingScreen } from "./ChallengePayingScreen"; import { ContinentSelectionScreen } from "./ContinentSelectionScreen"; -import { CountrySelectionScreen } from "./CountrySelectionScreen"; import { PoliciesPayingScreen } from "./PoliciesPayingScreen"; import { RecoveryFinishedScreen } from "./RecoveryFinishedScreen"; import { ReviewPoliciesScreen } from "./ReviewPoliciesScreen"; @@ -61,7 +61,7 @@ interface AnastasisClientFrameProps { /** * Hide only the "next" button. */ - hideNext?: boolean; + hideNext?: string; } function ErrorBoundary(props: { @@ -96,11 +96,11 @@ export function AnastasisClientFrame(props: AnastasisClientFrameProps): VNode { if (!reducer) { return <p>Fatal: Reducer must be in context.</p>; } - const next = (): void => { + const next = async (): Promise<void> => { if (props.onNext) { - props.onNext(); + await props.onNext(); } else { - reducer.transition("next", {}); + await reducer.transition("next", {}); } }; const handleKeyPress = ( @@ -112,18 +112,18 @@ export function AnastasisClientFrame(props: AnastasisClientFrameProps): VNode { return ( <Fragment> <Menu title="Anastasis" /> - <div> - <div class="home" onKeyPress={(e) => handleKeyPress(e)}> - <h1>{props.title}</h1> - <ErrorBanner /> + <div class="home" onKeyPress={(e) => handleKeyPress(e)}> + <h1 class="title">{props.title}</h1> + <ErrorBanner /> + <section class="section is-main-section"> {props.children} {!props.hideNav ? ( - <div> - <button onClick={() => reducer.back()}>Back</button> - {!props.hideNext ? <button onClick={next}>Next</button> : null} + <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}> + <button class="button" onClick={() => reducer.back()}>Back</button> + <AsyncButton class="button is-info" data-tooltip={props.hideNext} onClick={next} disabled={props.hideNext !== undefined}>Next</AsyncButton> </div> ) : null} - </div> + </section> </div> </Fragment> ); @@ -140,7 +140,7 @@ const AnastasisClient: FunctionalComponent = () => { ); }; -const AnastasisClientImpl: FunctionalComponent = () => { +function AnastasisClientImpl(): VNode { const reducer = useAnastasisContext() if (!reducer) { return <p>Fatal: Reducer must be in context.</p>; @@ -153,18 +153,12 @@ const AnastasisClientImpl: FunctionalComponent = () => { if ( state.backup_state === BackupStates.ContinentSelecting || - state.recovery_state === RecoveryStates.ContinentSelecting - ) { - return ( - <ContinentSelectionScreen /> - ); - } - if ( + state.recovery_state === RecoveryStates.ContinentSelecting || state.backup_state === BackupStates.CountrySelecting || state.recovery_state === RecoveryStates.CountrySelecting ) { return ( - <CountrySelectionScreen /> + <ContinentSelectionScreen /> ); } if ( @@ -222,7 +216,9 @@ const AnastasisClientImpl: FunctionalComponent = () => { <RecoveryFinishedScreen /> ); } - + if (state.recovery_state === RecoveryStates.ChallengePaying) { + return <ChallengePayingScreen />; + } console.log("unknown state", reducer.currentReducerState); return ( <AnastasisClientFrame hideNav title="Bug"> @@ -232,32 +228,6 @@ const AnastasisClientImpl: FunctionalComponent = () => { </div> </AnastasisClientFrame> ); -}; - -interface LabeledInputProps { - label: string; - grabFocus?: boolean; - bind: [string, (x: string) => void]; -} - -export function LabeledInput(props: LabeledInputProps): VNode { - const inputRef = useRef<HTMLInputElement>(null); - useLayoutEffect(() => { - if (props.grabFocus) { - inputRef.current?.focus(); - } - }, [props.grabFocus]); - return ( - <label> - {props.label} - <input - value={props.bind[0]} - onChange={(e) => props.bind[1]((e.target as HTMLInputElement).value)} - ref={inputRef} - style={{ display: "block" }} - /> - </label> - ); } /** @@ -266,13 +236,11 @@ export function LabeledInput(props: LabeledInputProps): VNode { function ErrorBanner(): VNode | null { const reducer = useAnastasisContext(); if (!reducer || !reducer.currentError) return null; - return ( - <div id="error"> - <p>Error: {JSON.stringify(reducer.currentError)}</p> - <button onClick={() => reducer.dismissError()}> - Dismiss Error - </button> - </div> + return (<Notifications removeNotification={reducer.dismissError} notifications={[{ + type: "ERROR", + message: `Error code: ${reducer.currentError.code}`, + description: reducer.currentError.hint + }]} /> ); } diff --git a/packages/anastasis-webui/src/scss/_custom-calendar.scss b/packages/anastasis-webui/src/scss/_custom-calendar.scss index 9ac877ce0..bff68cf79 100644 --- a/packages/anastasis-webui/src/scss/_custom-calendar.scss +++ b/packages/anastasis-webui/src/scss/_custom-calendar.scss @@ -41,6 +41,10 @@ } +.home .datePicker div { + margin-top: 0px; + margin-bottom: 0px; +} .datePicker { text-align: left; background: var(--primary-card-color); diff --git a/packages/anastasis-webui/src/scss/main.scss b/packages/anastasis-webui/src/scss/main.scss index 2e60bf6f9..b5335073f 100644 --- a/packages/anastasis-webui/src/scss/main.scss +++ b/packages/anastasis-webui/src/scss/main.scss @@ -195,13 +195,13 @@ div[data-tooltip]::before { padding: 1em 1em; min-height: 100%; width: 100%; - max-width: 40em; + // max-width: 40em; } -.home div { - margin-top: 0.5em; - margin-bottom: 0.5em; -} +// .home div { +// margin-top: 0.5em; +// margin-bottom: 0.5em; +// } .policy { padding: 0.5em; diff --git a/packages/anastasis-webui/src/utils/index.tsx b/packages/anastasis-webui/src/utils/index.tsx index d1d861469..9c01aa6ba 100644 --- a/packages/anastasis-webui/src/utils/index.tsx +++ b/packages/anastasis-webui/src/utils/index.tsx @@ -8,13 +8,13 @@ export function createExample<Props>(Component: FunctionalComponent<Props>, curr return <AnastasisProvider value={{ currentReducerState, currentError: undefined, - back: () => { null }, - dismissError: () => { null }, + back: async () => { null }, + dismissError: async () => { null }, reset: () => { null }, - runTransaction: () => { null }, + runTransaction: async () => { null }, startBackup: () => { null }, startRecover: () => { null }, - transition: () => { null }, + transition: async () => { null }, }}> <Component {...args} /> </AnastasisProvider> @@ -86,12 +86,60 @@ const base = { { type: "question", usage_fee: "COL:0" - } + }, { + type: "sms", + usage_fee: "COL:0" + }, { + type: "email", + usage_fee: "COL:0" + }, + ], + salt: "WBMDD76BR1E90YQ5AHBMKPH7GW", + storage_limit_in_megabytes: 16, + truth_upload_fee: "COL:0" + }, + "https://kudos.demo.anastasis.lu/": { + http_status: 200, + annual_fee: "COL:0", + business_name: "ana", + currency: "COL", + liability_limit: "COL:10", + methods: [ + { + type: "question", + usage_fee: "COL:0" + }, { + type: "email", + usage_fee: "COL:0" + }, + ], + salt: "WBMDD76BR1E90YQ5AHBMKPH7GW", + storage_limit_in_megabytes: 16, + truth_upload_fee: "COL:0" + }, + "https://anastasis.demo.taler.net/": { + http_status: 200, + annual_fee: "COL:0", + business_name: "ana", + currency: "COL", + liability_limit: "COL:10", + methods: [ + { + type: "question", + usage_fee: "COL:0" + }, { + type: "sms", + usage_fee: "COL:0" + }, { + type: "totp", + usage_fee: "COL:0" + }, ], salt: "WBMDD76BR1E90YQ5AHBMKPH7GW", storage_limit_in_megabytes: 16, truth_upload_fee: "COL:0" }, + "http://localhost:8087/": { code: 8414, hint: "request to provider failed" @@ -112,49 +160,72 @@ const base = { export const reducerStatesExample = { initial: undefined, - recoverySelectCountry: {...base, + recoverySelectCountry: { + ...base, recovery_state: RecoveryStates.CountrySelecting } as ReducerState, - backupSelectCountry: {...base, - backup_state: BackupStates.CountrySelecting - } as ReducerState, - recoverySelectContinent: {...base, + recoverySelectContinent: { + ...base, recovery_state: RecoveryStates.ContinentSelecting, } as ReducerState, - backupSelectContinent: {...base, - backup_state: BackupStates.ContinentSelecting, - } as ReducerState, - secretSelection: {...base, + secretSelection: { + ...base, recovery_state: RecoveryStates.SecretSelecting, } as ReducerState, - recoveryFinished: {...base, + recoveryFinished: { + ...base, recovery_state: RecoveryStates.RecoveryFinished, } as ReducerState, - challengeSelecting: {...base, + challengeSelecting: { + ...base, recovery_state: RecoveryStates.ChallengeSelecting, } as ReducerState, - challengeSolving: {...base, + challengeSolving: { + ...base, recovery_state: RecoveryStates.ChallengeSolving, } as ReducerState, - secretEdition: {...base, + challengePaying: { + ...base, + recovery_state: RecoveryStates.ChallengePaying, + } as ReducerState, + recoveryAttributeEditing: { + ...base, + recovery_state: RecoveryStates.UserAttributesCollecting + } as ReducerState, + backupSelectCountry: { + ...base, + backup_state: BackupStates.CountrySelecting + } as ReducerState, + backupSelectContinent: { + ...base, + backup_state: BackupStates.ContinentSelecting, + } as ReducerState, + secretEdition: { + ...base, backup_state: BackupStates.SecretEditing, } as ReducerState, - policyReview: {...base, + policyReview: { + ...base, backup_state: BackupStates.PoliciesReviewing, } as ReducerState, - policyPay: {...base, + policyPay: { + ...base, backup_state: BackupStates.PoliciesPaying, } as ReducerState, - backupFinished: {...base, + backupFinished: { + ...base, backup_state: BackupStates.BackupFinished, } as ReducerState, - authEditing: {...base, + authEditing: { + ...base, backup_state: BackupStates.AuthenticationsEditing } as ReducerState, - attributeEditing: {...base, + backupAttributeEditing: { + ...base, backup_state: BackupStates.UserAttributesCollecting } as ReducerState, - truthsPaying: {...base, + truthsPaying: { + ...base, backup_state: BackupStates.TruthsPaying } as ReducerState, diff --git a/packages/taler-util/src/amounts.ts b/packages/taler-util/src/amounts.ts index 5a8c7f06f..41fd14bee 100644 --- a/packages/taler-util/src/amounts.ts +++ b/packages/taler-util/src/amounts.ts @@ -349,7 +349,8 @@ export class Amounts { } } - static mult(a: AmountJson, n: number): Result { + static mult(a: AmountLike, n: number): Result { + a = this.jsonifyAmount(a); if (!Number.isInteger(n)) { throw Error("amount can only be multipied by an integer"); } diff --git a/packages/taler-util/src/clk.ts b/packages/taler-util/src/clk.ts new file mode 100644 index 000000000..d172eed48 --- /dev/null +++ b/packages/taler-util/src/clk.ts @@ -0,0 +1,620 @@ +/* + This file is part of GNU Taler + (C) 2019 GNUnet e.V. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** + * Imports. + */ +import process from "process"; +import path from "path"; +import readline from "readline"; + +export namespace clk { + class Converter<T> {} + + export const INT = new Converter<number>(); + export const STRING: Converter<string> = new Converter<string>(); + + export interface OptionArgs<T> { + help?: string; + default?: T; + onPresentHandler?: (v: T) => void; + } + + export interface ArgumentArgs<T> { + metavar?: string; + help?: string; + default?: T; + } + + export interface SubcommandArgs { + help?: string; + } + + export interface FlagArgs { + help?: string; + } + + export interface ProgramArgs { + help?: string; + } + + interface ArgumentDef { + name: string; + conv: Converter<any>; + args: ArgumentArgs<any>; + required: boolean; + } + + interface SubcommandDef { + commandGroup: CommandGroup<any, any>; + name: string; + args: SubcommandArgs; + } + + type ActionFn<TG> = (x: TG) => void; + + type SubRecord<S extends keyof any, N extends keyof any, V> = { + [Y in S]: { [X in N]: V }; + }; + + interface OptionDef { + name: string; + flagspec: string[]; + /** + * Converter, only present for options, not for flags. + */ + conv?: Converter<any>; + args: OptionArgs<any>; + isFlag: boolean; + required: boolean; + } + + function splitOpt(opt: string): { key: string; value?: string } { + const idx = opt.indexOf("="); + if (idx == -1) { + return { key: opt }; + } + return { key: opt.substring(0, idx), value: opt.substring(idx + 1) }; + } + + function formatListing(key: string, value?: string): string { + const res = " " + key; + if (!value) { + return res; + } + if (res.length >= 25) { + return res + "\n" + " " + value; + } else { + return res.padEnd(24) + " " + value; + } + } + + export class CommandGroup<GN extends keyof any, TG> { + private shortOptions: { [name: string]: OptionDef } = {}; + private longOptions: { [name: string]: OptionDef } = {}; + private subcommandMap: { [name: string]: SubcommandDef } = {}; + private subcommands: SubcommandDef[] = []; + private options: OptionDef[] = []; + private arguments: ArgumentDef[] = []; + + private myAction?: ActionFn<TG>; + + constructor( + private argKey: string, + private name: string | null, + private scArgs: SubcommandArgs, + ) {} + + action(f: ActionFn<TG>): void { + if (this.myAction) { + throw Error("only one action supported per command"); + } + this.myAction = f; + } + + requiredOption<N extends keyof any, V>( + name: N, + flagspec: string[], + conv: Converter<V>, + args: OptionArgs<V> = {}, + ): CommandGroup<GN, TG & SubRecord<GN, N, V>> { + const def: OptionDef = { + args: args, + conv: conv, + flagspec: flagspec, + isFlag: false, + required: true, + name: name as string, + }; + this.options.push(def); + for (const flag of flagspec) { + if (flag.startsWith("--")) { + const flagname = flag.substring(2); + this.longOptions[flagname] = def; + } else if (flag.startsWith("-")) { + const flagname = flag.substring(1); + this.shortOptions[flagname] = def; + } else { + throw Error("option must start with '-' or '--'"); + } + } + return this as any; + } + + maybeOption<N extends keyof any, V>( + name: N, + flagspec: string[], + conv: Converter<V>, + args: OptionArgs<V> = {}, + ): CommandGroup<GN, TG & SubRecord<GN, N, V | undefined>> { + const def: OptionDef = { + args: args, + conv: conv, + flagspec: flagspec, + isFlag: false, + required: false, + name: name as string, + }; + this.options.push(def); + for (const flag of flagspec) { + if (flag.startsWith("--")) { + const flagname = flag.substring(2); + this.longOptions[flagname] = def; + } else if (flag.startsWith("-")) { + const flagname = flag.substring(1); + this.shortOptions[flagname] = def; + } else { + throw Error("option must start with '-' or '--'"); + } + } + return this as any; + } + + requiredArgument<N extends keyof any, V>( + name: N, + conv: Converter<V>, + args: ArgumentArgs<V> = {}, + ): CommandGroup<GN, TG & SubRecord<GN, N, V>> { + const argDef: ArgumentDef = { + args: args, + conv: conv, + name: name as string, + required: true, + }; + this.arguments.push(argDef); + return this as any; + } + + maybeArgument<N extends keyof any, V>( + name: N, + conv: Converter<V>, + args: ArgumentArgs<V> = {}, + ): CommandGroup<GN, TG & SubRecord<GN, N, V | undefined>> { + const argDef: ArgumentDef = { + args: args, + conv: conv, + name: name as string, + required: false, + }; + this.arguments.push(argDef); + return this as any; + } + + flag<N extends string, V>( + name: N, + flagspec: string[], + args: OptionArgs<V> = {}, + ): CommandGroup<GN, TG & SubRecord<GN, N, boolean>> { + const def: OptionDef = { + args: args, + flagspec: flagspec, + isFlag: true, + required: false, + name: name as string, + }; + this.options.push(def); + for (const flag of flagspec) { + if (flag.startsWith("--")) { + const flagname = flag.substring(2); + this.longOptions[flagname] = def; + } else if (flag.startsWith("-")) { + const flagname = flag.substring(1); + this.shortOptions[flagname] = def; + } else { + throw Error("option must start with '-' or '--'"); + } + } + return this as any; + } + + subcommand<GN extends keyof any>( + argKey: GN, + name: string, + args: SubcommandArgs = {}, + ): CommandGroup<GN, TG> { + const cg = new CommandGroup<GN, {}>(argKey as string, name, args); + const def: SubcommandDef = { + commandGroup: cg, + name: name as string, + args: args, + }; + cg.flag("help", ["-h", "--help"], { + help: "Show this message and exit.", + }); + this.subcommandMap[name as string] = def; + this.subcommands.push(def); + this.subcommands = this.subcommands.sort((x1, x2) => { + const a = x1.name; + const b = x2.name; + if (a === b) { + return 0; + } else if (a < b) { + return -1; + } else { + return 1; + } + }); + return cg as any; + } + + printHelp(progName: string, parents: CommandGroup<any, any>[]): void { + let usageSpec = ""; + for (const p of parents) { + usageSpec += (p.name ?? progName) + " "; + if (p.arguments.length >= 1) { + usageSpec += "<ARGS...> "; + } + } + usageSpec += (this.name ?? progName) + " "; + if (this.subcommands.length != 0) { + usageSpec += "COMMAND "; + } + for (const a of this.arguments) { + const argName = a.args.metavar ?? a.name; + usageSpec += `<${argName}> `; + } + usageSpec = usageSpec.trimRight(); + console.log(`Usage: ${usageSpec}`); + if (this.scArgs.help) { + console.log(); + console.log(this.scArgs.help); + } + if (this.options.length != 0) { + console.log(); + console.log("Options:"); + for (const opt of this.options) { + let optSpec = opt.flagspec.join(", "); + if (!opt.isFlag) { + optSpec = optSpec + "=VALUE"; + } + console.log(formatListing(optSpec, opt.args.help)); + } + } + + if (this.subcommands.length != 0) { + console.log(); + console.log("Commands:"); + for (const subcmd of this.subcommands) { + console.log(formatListing(subcmd.name, subcmd.args.help)); + } + } + } + + /** + * Run the (sub-)command with the given command line parameters. + */ + run( + progname: string, + parents: CommandGroup<any, any>[], + unparsedArgs: string[], + parsedArgs: any, + ): void { + let posArgIndex = 0; + let argsTerminated = false; + let i; + let foundSubcommand: CommandGroup<any, any> | undefined = undefined; + const myArgs: any = (parsedArgs[this.argKey] = {}); + const foundOptions: { [name: string]: boolean } = {}; + const currentName = this.name ?? progname; + for (i = 0; i < unparsedArgs.length; i++) { + const argVal = unparsedArgs[i]; + if (argsTerminated == false) { + if (argVal === "--") { + argsTerminated = true; + continue; + } + if (argVal.startsWith("--")) { + const opt = argVal.substring(2); + const r = splitOpt(opt); + const d = this.longOptions[r.key]; + if (!d) { + console.error( + `error: unknown option '--${r.key}' for ${currentName}`, + ); + process.exit(-1); + throw Error("not reached"); + } + if (d.isFlag) { + if (r.value !== undefined) { + console.error(`error: flag '--${r.key}' does not take a value`); + process.exit(-1); + throw Error("not reached"); + } + foundOptions[d.name] = true; + myArgs[d.name] = true; + } else { + if (r.value === undefined) { + if (i === unparsedArgs.length - 1) { + console.error(`error: option '--${r.key}' needs an argument`); + process.exit(-1); + throw Error("not reached"); + } + myArgs[d.name] = unparsedArgs[i + 1]; + i++; + } else { + myArgs[d.name] = r.value; + } + foundOptions[d.name] = true; + } + continue; + } + if (argVal.startsWith("-") && argVal != "-") { + const optShort = argVal.substring(1); + for (let si = 0; si < optShort.length; si++) { + const chr = optShort[si]; + const opt = this.shortOptions[chr]; + if (!opt) { + console.error(`error: option '-${chr}' not known`); + process.exit(-1); + } + if (opt.isFlag) { + myArgs[opt.name] = true; + foundOptions[opt.name] = true; + } else { + if (si == optShort.length - 1) { + if (i === unparsedArgs.length - 1) { + console.error(`error: option '-${chr}' needs an argument`); + process.exit(-1); + throw Error("not reached"); + } else { + myArgs[opt.name] = unparsedArgs[i + 1]; + i++; + } + } else { + myArgs[opt.name] = optShort.substring(si + 1); + } + foundOptions[opt.name] = true; + break; + } + } + continue; + } + } + if (this.subcommands.length != 0) { + const subcmd = this.subcommandMap[argVal]; + if (!subcmd) { + console.error(`error: unknown command '${argVal}'`); + process.exit(-1); + throw Error("not reached"); + } + foundSubcommand = subcmd.commandGroup; + break; + } else { + const d = this.arguments[posArgIndex]; + if (!d) { + console.error(`error: too many arguments for ${currentName}`); + process.exit(-1); + throw Error("not reached"); + } + myArgs[d.name] = unparsedArgs[i]; + posArgIndex++; + } + } + + if (parsedArgs[this.argKey].help) { + this.printHelp(progname, parents); + process.exit(0); + throw Error("not reached"); + } + + for (let i = posArgIndex; i < this.arguments.length; i++) { + const d = this.arguments[i]; + if (d.required) { + if (d.args.default !== undefined) { + myArgs[d.name] = d.args.default; + } else { + console.error( + `error: missing positional argument '${d.name}' for ${currentName}`, + ); + process.exit(-1); + throw Error("not reached"); + } + } + } + + for (const option of this.options) { + if (option.isFlag == false && option.required == true) { + if (!foundOptions[option.name]) { + if (option.args.default !== undefined) { + myArgs[option.name] = option.args.default; + } else { + const name = option.flagspec.join(","); + console.error(`error: missing option '${name}'`); + process.exit(-1); + throw Error("not reached"); + } + } + } + } + + for (const option of this.options) { + const ph = option.args.onPresentHandler; + if (ph && foundOptions[option.name]) { + ph(myArgs[option.name]); + } + } + + if (foundSubcommand) { + foundSubcommand.run( + progname, + Array.prototype.concat(parents, [this]), + unparsedArgs.slice(i + 1), + parsedArgs, + ); + } else if (this.myAction) { + let r; + try { + r = this.myAction(parsedArgs); + } catch (e) { + console.error(`An error occurred while running ${currentName}`); + console.error(e); + process.exit(1); + } + Promise.resolve(r).catch((e) => { + console.error(`An error occurred while running ${currentName}`); + console.error(e); + process.exit(1); + }); + } else { + this.printHelp(progname, parents); + process.exit(-1); + throw Error("not reached"); + } + } + } + + export class Program<PN extends keyof any, T> { + private mainCommand: CommandGroup<any, any>; + + constructor(argKey: string, args: ProgramArgs = {}) { + this.mainCommand = new CommandGroup<any, any>(argKey, null, { + help: args.help, + }); + this.mainCommand.flag("help", ["-h", "--help"], { + help: "Show this message and exit.", + }); + } + + run(): void { + const args = process.argv; + if (args.length < 2) { + console.error( + "Error while parsing command line arguments: not enough arguments", + ); + process.exit(-1); + } + const progname = path.basename(args[1]); + const rest = args.slice(2); + + this.mainCommand.run(progname, [], rest, {}); + } + + subcommand<GN extends keyof any>( + argKey: GN, + name: string, + args: SubcommandArgs = {}, + ): CommandGroup<GN, T> { + const cmd = this.mainCommand.subcommand(argKey, name as string, args); + return cmd as any; + } + + requiredOption<N extends keyof any, V>( + name: N, + flagspec: string[], + conv: Converter<V>, + args: OptionArgs<V> = {}, + ): Program<PN, T & SubRecord<PN, N, V>> { + this.mainCommand.requiredOption(name, flagspec, conv, args); + return this as any; + } + + maybeOption<N extends keyof any, V>( + name: N, + flagspec: string[], + conv: Converter<V>, + args: OptionArgs<V> = {}, + ): Program<PN, T & SubRecord<PN, N, V | undefined>> { + this.mainCommand.maybeOption(name, flagspec, conv, args); + return this as any; + } + + /** + * Add a flag (option without value) to the program. + */ + flag<N extends string>( + name: N, + flagspec: string[], + args: OptionArgs<boolean> = {}, + ): Program<PN, T & SubRecord<PN, N, boolean>> { + this.mainCommand.flag(name, flagspec, args); + return this as any; + } + + /** + * Add a required positional argument to the program. + */ + requiredArgument<N extends keyof any, V>( + name: N, + conv: Converter<V>, + args: ArgumentArgs<V> = {}, + ): Program<PN, T & SubRecord<PN, N, V>> { + this.mainCommand.requiredArgument(name, conv, args); + return this as any; + } + + /** + * Add an optional argument to the program. + */ + maybeArgument<N extends keyof any, V>( + name: N, + conv: Converter<V>, + args: ArgumentArgs<V> = {}, + ): Program<PN, T & SubRecord<PN, N, V | undefined>> { + this.mainCommand.maybeArgument(name, conv, args); + return this as any; + } + + action(f: ActionFn<T>): void { + this.mainCommand.action(f); + } + } + + export type GetArgType<T> = T extends Program<any, infer AT> + ? AT + : T extends CommandGroup<any, infer AT> + ? AT + : any; + + export function program<PN extends keyof any>( + argKey: PN, + args: ProgramArgs = {}, + ): Program<PN, {}> { + return new Program(argKey as string, args); + } + + export function prompt(question: string): Promise<string> { + const stdinReadline = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + return new Promise<string>((resolve, reject) => { + stdinReadline.question(question, (res) => { + resolve(res); + stdinReadline.close(); + }); + }); + } +} diff --git a/packages/taler-util/src/http-status-codes.ts b/packages/taler-util/src/http-status-codes.ts new file mode 100644 index 000000000..848839990 --- /dev/null +++ b/packages/taler-util/src/http-status-codes.ts @@ -0,0 +1,379 @@ +/** + * Hypertext Transfer Protocol (HTTP) response status codes. + * + * @see {@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes} + */ +export enum HttpStatusCode { + /** + * The server has received the request headers and the client should proceed to send the request body + * (in the case of a request for which a body needs to be sent; for example, a POST request). + * Sending a large request body to a server after a request has been rejected for inappropriate headers would be inefficient. + * To have a server check the request's headers, a client must send Expect: 100-continue as a header in its initial request + * and receive a 100 Continue status code in response before sending the body. The response 417 Expectation Failed indicates the request should not be continued. + */ + Continue = 100, + + /** + * The requester has asked the server to switch protocols and the server has agreed to do so. + */ + SwitchingProtocols = 101, + + /** + * A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request. + * This code indicates that the server has received and is processing the request, but no response is available yet. + * This prevents the client from timing out and assuming the request was lost. + */ + Processing = 102, + + /** + * Standard response for successful HTTP requests. + * The actual response will depend on the request method used. + * In a GET request, the response will contain an entity corresponding to the requested resource. + * In a POST request, the response will contain an entity describing or containing the result of the action. + */ + Ok = 200, + + /** + * The request has been fulfilled, resulting in the creation of a new resource. + */ + Created = 201, + + /** + * The request has been accepted for processing, but the processing has not been completed. + * The request might or might not be eventually acted upon, and may be disallowed when processing occurs. + */ + Accepted = 202, + + /** + * SINCE HTTP/1.1 + * The server is a transforming proxy that received a 200 OK from its origin, + * but is returning a modified version of the origin's response. + */ + NonAuthoritativeInformation = 203, + + /** + * The server successfully processed the request and is not returning any content. + */ + NoContent = 204, + + /** + * The server successfully processed the request, but is not returning any content. + * Unlike a 204 response, this response requires that the requester reset the document view. + */ + ResetContent = 205, + + /** + * The server is delivering only part of the resource (byte serving) due to a range header sent by the client. + * The range header is used by HTTP clients to enable resuming of interrupted downloads, + * or split a download into multiple simultaneous streams. + */ + PartialContent = 206, + + /** + * The message body that follows is an XML message and can contain a number of separate response codes, + * depending on how many sub-requests were made. + */ + MultiStatus = 207, + + /** + * The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, + * and are not being included again. + */ + AlreadyReported = 208, + + /** + * The server has fulfilled a request for the resource, + * and the response is a representation of the result of one or more instance-manipulations applied to the current instance. + */ + ImUsed = 226, + + /** + * Indicates multiple options for the resource from which the client may choose (via agent-driven content negotiation). + * For example, this code could be used to present multiple video format options, + * to list files with different filename extensions, or to suggest word-sense disambiguation. + */ + MultipleChoices = 300, + + /** + * This and all future requests should be directed to the given URI. + */ + MovedPermanently = 301, + + /** + * This is an example of industry practice contradicting the standard. + * The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect + * (the original describing phrase was "Moved Temporarily"), but popular browsers implemented 302 + * with the functionality of a 303 See Other. Therefore, HTTP/1.1 added status codes 303 and 307 + * to distinguish between the two behaviours. However, some Web applications and frameworks + * use the 302 status code as if it were the 303. + */ + Found = 302, + + /** + * SINCE HTTP/1.1 + * The response to the request can be found under another URI using a GET method. + * When received in response to a POST (or PUT/DELETE), the client should presume that + * the server has received the data and should issue a redirect with a separate GET message. + */ + SeeOther = 303, + + /** + * Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match. + * In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy. + */ + NotModified = 304, + + /** + * SINCE HTTP/1.1 + * The requested resource is available only through a proxy, the address for which is provided in the response. + * Many HTTP clients (such as Mozilla and Internet Explorer) do not correctly handle responses with this status code, primarily for security reasons. + */ + UseProxy = 305, + + /** + * No longer used. Originally meant "Subsequent requests should use the specified proxy." + */ + SwitchProxy = 306, + + /** + * SINCE HTTP/1.1 + * In this case, the request should be repeated with another URI; however, future requests should still use the original URI. + * In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request. + * For example, a POST request should be repeated using another POST request. + */ + TemporaryRedirect = 307, + + /** + * The request and all future requests should be repeated using another URI. + * 307 and 308 parallel the behaviors of 302 and 301, but do not allow the HTTP method to change. + * So, for example, submitting a form to a permanently redirected resource may continue smoothly. + */ + PermanentRedirect = 308, + + /** + * The server cannot or will not process the request due to an apparent client error + * (e.g., malformed request syntax, too large size, invalid request message framing, or deceptive request routing). + */ + BadRequest = 400, + + /** + * Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet + * been provided. The response must include a WWW-Authenticate header field containing a challenge applicable to the + * requested resource. See Basic access authentication and Digest access authentication. 401 semantically means + * "unauthenticated",i.e. the user does not have the necessary credentials. + */ + Unauthorized = 401, + + /** + * Reserved for future use. The original intention was that this code might be used as part of some form of digital + * cash or micro payment scheme, but that has not happened, and this code is not usually used. + * Google Developers API uses this status if a particular developer has exceeded the daily limit on requests. + */ + PaymentRequired = 402, + + /** + * The request was valid, but the server is refusing action. + * The user might not have the necessary permissions for a resource. + */ + Forbidden = 403, + + /** + * The requested resource could not be found but may be available in the future. + * Subsequent requests by the client are permissible. + */ + NotFound = 404, + + /** + * A request method is not supported for the requested resource; + * for example, a GET request on a form that requires data to be presented via POST, or a PUT request on a read-only resource. + */ + MethodNotAllowed = 405, + + /** + * The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request. + */ + NotAcceptable = 406, + + /** + * The client must first authenticate itself with the proxy. + */ + ProxyAuthenticationRequired = 407, + + /** + * The server timed out waiting for the request. + * According to HTTP specifications: + * "The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time." + */ + RequestTimeout = 408, + + /** + * Indicates that the request could not be processed because of conflict in the request, + * such as an edit conflict between multiple simultaneous updates. + */ + Conflict = 409, + + /** + * Indicates that the resource requested is no longer available and will not be available again. + * This should be used when a resource has been intentionally removed and the resource should be purged. + * Upon receiving a 410 status code, the client should not request the resource in the future. + * Clients such as search engines should remove the resource from their indices. + * Most use cases do not require clients and search engines to purge the resource, and a "404 Not Found" may be used instead. + */ + Gone = 410, + + /** + * The request did not specify the length of its content, which is required by the requested resource. + */ + LengthRequired = 411, + + /** + * The server does not meet one of the preconditions that the requester put on the request. + */ + PreconditionFailed = 412, + + /** + * The request is larger than the server is willing or able to process. Previously called "Request Entity Too Large". + */ + PayloadTooLarge = 413, + + /** + * The URI provided was too long for the server to process. Often the result of too much data being encoded as a query-string of a GET request, + * in which case it should be converted to a POST request. + * Called "Request-URI Too Long" previously. + */ + UriTooLong = 414, + + /** + * The request entity has a media type which the server or resource does not support. + * For example, the client uploads an image as image/svg+xml, but the server requires that images use a different format. + */ + UnsupportedMediaType = 415, + + /** + * The client has asked for a portion of the file (byte serving), but the server cannot supply that portion. + * For example, if the client asked for a part of the file that lies beyond the end of the file. + * Called "Requested Range Not Satisfiable" previously. + */ + RangeNotSatisfiable = 416, + + /** + * The server cannot meet the requirements of the Expect request-header field. + */ + ExpectationFailed = 417, + + /** + * This code was defined in 1998 as one of the traditional IETF April Fools' jokes, in RFC 2324, Hyper Text Coffee Pot Control Protocol, + * and is not expected to be implemented by actual HTTP servers. The RFC specifies this code should be returned by + * teapots requested to brew coffee. This HTTP status is used as an Easter egg in some websites, including Google.com. + */ + IAmATeapot = 418, + + /** + * The request was directed at a server that is not able to produce a response (for example because a connection reuse). + */ + MisdirectedRequest = 421, + + /** + * The request was well-formed but was unable to be followed due to semantic errors. + */ + UnprocessableEntity = 422, + + /** + * The resource that is being accessed is locked. + */ + Locked = 423, + + /** + * The request failed due to failure of a previous request (e.g., a PROPPATCH). + */ + FailedDependency = 424, + + /** + * The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field. + */ + UpgradeRequired = 426, + + /** + * The origin server requires the request to be conditional. + * Intended to prevent "the 'lost update' problem, where a client + * GETs a resource's state, modifies it, and PUTs it back to the server, + * when meanwhile a third party has modified the state on the server, leading to a conflict." + */ + PreconditionRequired = 428, + + /** + * The user has sent too many requests in a given amount of time. Intended for use with rate-limiting schemes. + */ + TooManyRequests = 429, + + /** + * The server is unwilling to process the request because either an individual header field, + * or all the header fields collectively, are too large. + */ + RequestHeaderFieldsTooLarge = 431, + + /** + * A server operator has received a legal demand to deny access to a resource or to a set of resources + * that includes the requested resource. The code 451 was chosen as a reference to the novel Fahrenheit 451. + */ + UnavailableForLegalReasons = 451, + + /** + * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable. + */ + InternalServerError = 500, + + /** + * The server either does not recognize the request method, or it lacks the ability to fulfill the request. + * Usually this implies future availability (e.g., a new feature of a web-service API). + */ + NotImplemented = 501, + + /** + * The server was acting as a gateway or proxy and received an invalid response from the upstream server. + */ + BadGateway = 502, + + /** + * The server is currently unavailable (because it is overloaded or down for maintenance). + * Generally, this is a temporary state. + */ + ServiceUnavailable = 503, + + /** + * The server was acting as a gateway or proxy and did not receive a timely response from the upstream server. + */ + GatewayTimeout = 504, + + /** + * The server does not support the HTTP protocol version used in the request + */ + HttpVersionNotSupported = 505, + + /** + * Transparent content negotiation for the request results in a circular reference. + */ + VariantAlsoNegotiates = 506, + + /** + * The server is unable to store the representation needed to complete the request. + */ + InsufficientStorage = 507, + + /** + * The server detected an infinite loop while processing the request. + */ + LoopDetected = 508, + + /** + * Further extensions to the request are required for the server to fulfill it. + */ + NotExtended = 510, + + /** + * The client needs to authenticate to gain network access. + * Intended for use by intercepting proxies used to control access to the network (e.g., "captive portals" used + * to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot). + */ + NetworkAuthenticationRequired = 511, +} diff --git a/packages/taler-util/src/index.node.ts b/packages/taler-util/src/index.node.ts index 018b4767f..bd59f320a 100644 --- a/packages/taler-util/src/index.node.ts +++ b/packages/taler-util/src/index.node.ts @@ -21,3 +21,4 @@ initNodePrng(); export * from "./index.js"; export * from "./talerconfig.js"; export * from "./globbing/minimatch.js"; +export { clk } from "./clk.js"; diff --git a/packages/taler-util/src/index.ts b/packages/taler-util/src/index.ts index 4ad752954..c42e5e66a 100644 --- a/packages/taler-util/src/index.ts +++ b/packages/taler-util/src/index.ts @@ -22,6 +22,7 @@ export * from "./url.js"; export { fnutil } from "./fnutils.js"; export * from "./kdf.js"; export * from "./talerCrypto.js"; +export * from "./http-status-codes.js"; export { randomBytes, secretbox, diff --git a/packages/taler-util/src/logging.ts b/packages/taler-util/src/logging.ts index 0037d95a3..8b9de1ab0 100644 --- a/packages/taler-util/src/logging.ts +++ b/packages/taler-util/src/logging.ts @@ -23,6 +23,47 @@ const isNode = typeof process.release !== "undefined" && process.release.name === "node"; +export enum LogLevel { + Trace = "trace", + Message = "message", + Info = "info", + Warn = "warn", + Error = "error", + None = "none", +} + +export let globalLogLevel = LogLevel.Info; + +export function setGlobalLogLevelFromString(logLevelStr: string) { + let level: LogLevel; + switch (logLevelStr.toLowerCase()) { + case "trace": + level = LogLevel.Trace; + break; + case "info": + level = LogLevel.Info; + break; + case "warn": + case "warning": + level = LogLevel.Warn; + break; + case "error": + level = LogLevel.Error; + break; + case "none": + level = LogLevel.None; + break; + default: + if (isNode) { + process.stderr.write(`Invalid log level, defaulting to WARNING`); + } else { + console.warn(`Invalid log level, defaulting to WARNING`); + } + level = LogLevel.Warn; + } + globalLogLevel = level; +} + function writeNodeLog( message: any, tag: string, @@ -57,21 +98,60 @@ export class Logger { constructor(private tag: string) {} shouldLogTrace() { - // FIXME: Implement logic to check loglevel - return true; + switch (globalLogLevel) { + case LogLevel.Trace: + return true; + case LogLevel.Message: + case LogLevel.Info: + case LogLevel.Warn: + case LogLevel.Error: + case LogLevel.None: + return false; + } } shouldLogInfo() { - // FIXME: Implement logic to check loglevel - return true; + switch (globalLogLevel) { + case LogLevel.Trace: + case LogLevel.Message: + case LogLevel.Info: + return true; + case LogLevel.Warn: + case LogLevel.Error: + case LogLevel.None: + return false; + } } shouldLogWarn() { - // FIXME: Implement logic to check loglevel - return true; + switch (globalLogLevel) { + case LogLevel.Trace: + case LogLevel.Message: + case LogLevel.Info: + case LogLevel.Warn: + return true; + case LogLevel.Error: + case LogLevel.None: + return false; + } + } + + shouldLogError() { + switch (globalLogLevel) { + case LogLevel.Trace: + case LogLevel.Message: + case LogLevel.Info: + case LogLevel.Warn: + case LogLevel.Error: + case LogLevel.None: + return false; + } } info(message: string, ...args: any[]): void { + if (!this.shouldLogInfo()) { + return; + } if (isNode) { writeNodeLog(message, this.tag, "INFO", args); } else { @@ -83,6 +163,9 @@ export class Logger { } warn(message: string, ...args: any[]): void { + if (!this.shouldLogWarn()) { + return; + } if (isNode) { writeNodeLog(message, this.tag, "WARN", args); } else { @@ -94,6 +177,9 @@ export class Logger { } error(message: string, ...args: any[]): void { + if (!this.shouldLogError()) { + return; + } if (isNode) { writeNodeLog(message, this.tag, "ERROR", args); } else { @@ -105,6 +191,9 @@ export class Logger { } trace(message: any, ...args: any[]): void { + if (!this.shouldLogTrace()) { + return; + } if (isNode) { writeNodeLog(message, this.tag, "TRACE", args); } else { diff --git a/packages/taler-util/src/time.ts b/packages/taler-util/src/time.ts index c0858ada6..856db8a57 100644 --- a/packages/taler-util/src/time.ts +++ b/packages/taler-util/src/time.ts @@ -69,6 +69,20 @@ export function getDurationRemaining( return { d_ms: deadline.t_ms - now.t_ms }; } +export namespace Duration { + export const getRemaining = getDurationRemaining; + export function toIntegerYears(d: Duration): number { + if (typeof d.d_ms !== "number") { + throw Error("infinite duration"); + } + return Math.ceil(d.d_ms / 1000 / 60 / 60 / 24 / 365); + } +} + +export namespace Timestamp { + export const min = timestampMin; +} + export function timestampMin(t1: Timestamp, t2: Timestamp): Timestamp { if (t1.t_ms === "never") { return { t_ms: t2.t_ms }; diff --git a/packages/taler-wallet-cli/src/bench1.ts b/packages/taler-wallet-cli/src/bench1.ts index 448dc913d..3d4561097 100644 --- a/packages/taler-wallet-cli/src/bench1.ts +++ b/packages/taler-wallet-cli/src/bench1.ts @@ -22,6 +22,7 @@ import { codecForNumber, codecForString, codecOptional, + Logger, } from "@gnu-taler/taler-util"; import { getDefaultNodeWallet, @@ -36,6 +37,9 @@ import { * set up its own services. */ export async function runBench1(configJson: any): Promise<void> { + + const logger = new Logger("Bench1"); + // Validate the configuration file for this benchmark. const b1conf = codecForBench1Config().decode(configJson); @@ -47,8 +51,9 @@ export async function runBench1(configJson: any): Promise<void> { const withdrawAmount = (numDeposits + 1) * 10; + logger.info(`Starting Benchmark with ${numIter} Iterations`); + for (let i = 0; i < numIter; i++) { - // Create a new wallet in each iteration // otherwise the TPS go down // my assumption is that the in-memory db file gets too large @@ -59,6 +64,8 @@ export async function runBench1(configJson: any): Promise<void> { }); await wallet.client.call(WalletApiOperation.InitWallet, {}); + logger.info(`Starting withdrawal of ${withdrawAmount} ${b1conf.currency}`); + await wallet.client.call(WalletApiOperation.WithdrawFakebank, { amount: b1conf.currency + ":" + withdrawAmount, bank: b1conf.bank, @@ -69,7 +76,11 @@ export async function runBench1(configJson: any): Promise<void> { stopWhenDone: true, }); + logger.info(`Finished withdrawal`); + for (let i = 0; i < numDeposits; i++) { + + logger.info(`Starting deposit of 10 ${b1conf.currency}`); await wallet.client.call(WalletApiOperation.CreateDepositGroup, { amount: b1conf.currency + ":10", depositPaytoUri: b1conf.payto, @@ -78,6 +89,7 @@ export async function runBench1(configJson: any): Promise<void> { await wallet.runTaskLoop({ stopWhenDone: true, }); + logger.info(`Deposit succesful`); } wallet.stop(); diff --git a/packages/taler-wallet-cli/src/harness/harness.ts b/packages/taler-wallet-cli/src/harness/harness.ts index b4ac16dbf..f8dd15738 100644 --- a/packages/taler-wallet-cli/src/harness/harness.ts +++ b/packages/taler-wallet-cli/src/harness/harness.ts @@ -67,6 +67,7 @@ import { getRandomBytes, } from "@gnu-taler/taler-util"; import { CoinConfig } from "./denomStructures.js"; +import { LibeufinNexusApi, LibeufinSandboxApi } from "./libeufin-apis.js"; const exec = util.promisify(require("child_process").exec); @@ -607,24 +608,202 @@ export namespace BankApi { } } -export class BankService implements BankServiceInterface { + +class BankServiceBase { proc: ProcessWrapper | undefined; - static fromExistingConfig(gc: GlobalTestState): BankService { - const cfgFilename = gc.testDir + "/bank.conf"; - console.log("reading bank config from", cfgFilename); - const config = Configuration.load(cfgFilename); - const bc: BankConfig = { - allowRegistrations: config - .getYesNo("bank", "allow_registrations") - .required(), - currency: config.getString("taler", "currency").required(), - database: config.getString("bank", "database").required(), - httpPort: config.getNumber("bank", "http_port").required(), + protected constructor( + protected globalTestState: GlobalTestState, + protected bankConfig: BankConfig, + protected configFile: string, + ) {} +} + +/** + * Work in progress. The key point is that both Sandbox and Nexus + * will be configured and started by this class. + */ +class LibeufinBankService extends BankServiceBase implements BankService { + sandboxProc: ProcessWrapper | undefined; + nexusProc: ProcessWrapper | undefined; + + static async create( + gc: GlobalTestState, + bc: BankConfig, + ): Promise<BankService> { + + return new LibeufinBankService(gc, bc, "foo"); + } + + get port() { + return this.bankConfig.httpPort; + } + + get nexusBaseUrl(): string { + return `http://localhost:${this.bankConfig.httpPort + 1}`; + } + + get baseUrl(): string { + return `http://localhost:${this.bankConfig.httpPort}/demobanks/default/access-api`; + } + + async setSuggestedExchange( + e: ExchangeServiceInterface, + exchangePayto: string + ) { + await sh( + this.globalTestState, + "libeufin-sandbox-set-default-exchange", + `libeufin-sandbox default-exchange ${exchangePayto}` + ); + } + + // Create one at both sides: Sandbox and Nexus. + async createExchangeAccount( + accountName: string, + password: string, + ): Promise<HarnessExchangeBankAccount> { + + await LibeufinSandboxApi.createDemobankAccount( + accountName, + password, + { baseUrl: this.baseUrl } + ); + let bankAccountLabel = `${accountName}-acct` + await LibeufinSandboxApi.createDemobankEbicsSubscriber( + { + hostID: "talertest-ebics-host", + userID: "exchange-ebics-user", + partnerID: "exchange-ebics-partner", + }, + bankAccountLabel, + { baseUrl: this.baseUrl } + ); + + await LibeufinNexusApi.createUser( + { baseUrl: this.nexusBaseUrl }, + { + username: `${accountName}-nexus-username`, + password: `${password}-nexus-password` + } + ); + await LibeufinNexusApi.createEbicsBankConnection( + { baseUrl: this.nexusBaseUrl }, + { + name: "ebics-connection", // connection name. + ebicsURL: `http://localhost:${this.bankConfig.httpPort}/ebicsweb`, + hostID: "talertest-ebics-host", + userID: "exchange-ebics-user", + partnerID: "exchange-ebics-partner", + } + ); + await LibeufinNexusApi.connectBankConnection( + { baseUrl: this.nexusBaseUrl }, "ebics-connection" + ); + await LibeufinNexusApi.fetchAccounts( + { baseUrl: this.nexusBaseUrl }, "ebics-connection" + ); + await LibeufinNexusApi.importConnectionAccount( + { baseUrl: this.nexusBaseUrl }, + "ebics-connection", // connection name + `${accountName}-acct`, // offered account label + `${accountName}-nexus-label` // bank account label at Nexus + ); + await LibeufinNexusApi.createTwgFacade( + { baseUrl: this.nexusBaseUrl }, + { + name: "exchange-facade", + connectionName: "ebics-connection", + accountName: `${accountName}-nexus-label`, + currency: "EUR", + reserveTransferLevel: "report" + } + ); + await LibeufinNexusApi.postPermission( + { baseUrl: this.nexusBaseUrl }, + { + action: "grant", + permission: { + subjectId: `${accountName}-nexus-username`, + subjectType: "user", + resourceType: "facade", + resourceId: "exchange-facade", // facade name + permissionName: "facade.talerWireGateway.transfer", + }, + } + ); + await LibeufinNexusApi.postPermission( + { baseUrl: this.nexusBaseUrl }, + { + action: "grant", + permission: { + subjectId: `${accountName}-nexus-username`, + subjectType: "user", + resourceType: "facade", + resourceId: "exchange-facade", // facade name + permissionName: "facade.talerWireGateway.history", + }, + } + ); + let facadesResp = await LibeufinNexusApi.getAllFacades({ baseUrl: this.nexusBaseUrl }); + let accountInfoResp = await LibeufinSandboxApi.demobankAccountInfo( + accountName, // username + password, + { baseUrl: this.nexusBaseUrl }, + `${accountName}acct` // bank account label. + ); + return { + accountName: accountName, + accountPassword: password, + accountPaytoUri: accountInfoResp.data.paytoUri, + wireGatewayApiBaseUrl: facadesResp.data.facades[0].baseUrl, }; - return new BankService(gc, bc, cfgFilename); } + async start(): Promise<void> { + let sandboxDb = `jdbc:sqlite:${this.globalTestState.testDir}/libeufin-sandbox.sqlite3`; + let nexusDb = `jdbc:sqlite:${this.globalTestState.testDir}/libeufin-nexus.sqlite3`; + this.sandboxProc = this.globalTestState.spawnService( + "libeufin-sandbox", + ["serve", "--port", `${this.port}`], + "libeufin-sandbox", + { + ...process.env, + LIBEUFIN_SANDBOX_DB_CONNECTION: sandboxDb, + LIBEUFIN_SANDBOX_ADMIN_PASSWORD: "secret", + }, + ); + await runCommand( + this.globalTestState, + "libeufin-nexus-superuser", + "libeufin-nexus", + ["superuser", "admin", "--password", "test"], + { + ...process.env, + LIBEUFIN_NEXUS_DB_CONNECTION: nexusDb, + }, + ); + + this.nexusProc = this.globalTestState.spawnService( + "libeufin-nexus", + ["serve", "--port", `${this.port + 1}`], + "libeufin-nexus", + { + ...process.env, + LIBEUFIN_NEXUS_DB_CONNECTION: nexusDb, + }, + ); + } + + async pingUntilAvailable(): Promise<void> { + await pingProc(this.sandboxProc, this.baseUrl, "libeufin-sandbox"); + await pingProc(this.nexusProc, `${this.baseUrl}config`, "libeufin-nexus"); + } +} + +export class BankService extends BankServiceBase implements BankServiceInterface { + proc: ProcessWrapper | undefined; + static async create( gc: GlobalTestState, bc: BankConfig, @@ -700,12 +879,6 @@ export class BankService implements BankServiceInterface { return this.bankConfig.httpPort; } - private constructor( - private globalTestState: GlobalTestState, - private bankConfig: BankConfig, - private configFile: string, - ) {} - async start(): Promise<void> { this.proc = this.globalTestState.spawnService( "taler-bank-manage", @@ -720,6 +893,12 @@ export class BankService implements BankServiceInterface { } } +// Still work in progress.. +if (false && process.env.WALLET_HARNESS_WITH_EUFIN) { + BankService.create = LibeufinBankService.create; + BankService.prototype = Object.create(LibeufinBankService.prototype); +} + export class FakeBankService { proc: ProcessWrapper | undefined; diff --git a/packages/taler-wallet-cli/src/harness/helpers.ts b/packages/taler-wallet-cli/src/harness/helpers.ts index 3b4e1643f..6ff62504b 100644 --- a/packages/taler-wallet-cli/src/harness/helpers.ts +++ b/packages/taler-wallet-cli/src/harness/helpers.ts @@ -62,16 +62,6 @@ export interface SimpleTestEnvironment { wallet: WalletCli; } -export function getRandomIban(countryCode: string): string { - return `${countryCode}715001051796${(Math.random() * 100000000) - .toString() - .substring(0, 6)}`; -} - -export function getRandomString(): string { - return Math.random().toString(36).substring(2); -} - /** * Run a test case with a simple TESTKUDOS Taler environment, consisting * of one exchange, one bank and one merchant. diff --git a/packages/taler-wallet-cli/src/harness/libeufin-apis.ts b/packages/taler-wallet-cli/src/harness/libeufin-apis.ts new file mode 100644 index 000000000..68a25d92f --- /dev/null +++ b/packages/taler-wallet-cli/src/harness/libeufin-apis.ts @@ -0,0 +1,857 @@ + +/** + * This file defines most of the API calls offered + * by Nexus and Sandbox. They don't have state, + * therefore got moved away from libeufin.ts where + * the services get actually started and managed. + */ + + +import axios from "axios"; +import { URL } from "@gnu-taler/taler-util"; + +export interface LibeufinSandboxServiceInterface { + baseUrl: string; +} + +export interface LibeufinNexusServiceInterface { + baseUrl: string; +} + +export interface CreateEbicsSubscriberRequest { + hostID: string; + userID: string; + partnerID: string; + systemID?: string; +} + +export interface BankAccountInfo { + iban: string; + bic: string; + name: string; + label: string; +} + +export interface CreateEbicsBankConnectionRequest { + name: string; // connection name. + ebicsURL: string; + hostID: string; + userID: string; + partnerID: string; + systemID?: string; +} + +export interface UpdateNexusUserRequest { + newPassword: string; +} + +export interface NexusAuth { + auth: { + username: string; + password: string; + }; +} + +export interface PostNexusTaskRequest { + name: string; + cronspec: string; + type: string; // fetch | submit + params: + | { + level: string; // report | statement | all + rangeType: string; // all | since-last | previous-days | latest + } + | {}; +} + +export interface CreateNexusUserRequest { + username: string; + password: string; +} + +export interface PostNexusPermissionRequest { + action: "revoke" | "grant"; + permission: { + subjectType: string; + subjectId: string; + resourceType: string; + resourceId: string; + permissionName: string; + }; +} + + +export interface CreateAnastasisFacadeRequest { + name: string; + connectionName: string; + accountName: string; + currency: string; + reserveTransferLevel: "report" | "statement" | "notification"; +} + +export interface CreateTalerWireGatewayFacadeRequest { + name: string; + connectionName: string; + accountName: string; + currency: string; + reserveTransferLevel: "report" | "statement" | "notification"; +} + +export interface SandboxAccountTransactions { + payments: { + accountLabel: string; + creditorIban: string; + creditorBic?: string; + creditorName: string; + debtorIban: string; + debtorBic: string; + debtorName: string; + amount: string; + currency: string; + subject: string; + date: string; + creditDebitIndicator: "debit" | "credit"; + accountServicerReference: string; + }[]; +} + +export interface DeleteBankConnectionRequest { + bankConnectionId: string; +} + +export interface SimulateIncomingTransactionRequest { + debtorIban: string; + debtorBic: string; + debtorName: string; + + /** + * Subject / unstructured remittance info. + */ + subject: string; + + /** + * Decimal amount without currency. + */ + amount: string; +} + + +export interface CreateEbicsBankAccountRequest { + subscriber: { + hostID: string; + partnerID: string; + userID: string; + systemID?: string; + }; + // IBAN + iban: string; + // BIC + bic: string; + // human name + name: string; + label: string; +} + +export interface LibeufinSandboxAddIncomingRequest { + creditorIban: string; + creditorBic: string; + creditorName: string; + debtorIban: string; + debtorBic: string; + debtorName: string; + subject: string; + amount: string; + currency: string; + uid: string; + direction: string; +} + +function getRandomString(): string { + return Math.random().toString(36).substring(2); +} + +export namespace LibeufinSandboxApi { + + /** + * Return balance and payto-address of 'accountLabel'. + * Note: the demobank serving the request is hard-coded + * inside the base URL, and therefore contained in + * 'libeufinSandboxService'. + */ + export async function demobankAccountInfo( + username: string, + password: string, + libeufinSandboxService: LibeufinSandboxServiceInterface, + accountLabel: string + ) { + let url = new URL(`${libeufinSandboxService.baseUrl}/accounts/${accountLabel}`); + return await axios.get(url.href, { + auth: { + username: username, + password: password + } + }); + } + + // Creates one bank account via the Access API. + export async function createDemobankAccount( + username: string, + password: string, + libeufinSandboxService: LibeufinSandboxServiceInterface, + ) { + let url = new URL(`${libeufinSandboxService.baseUrl}/testing/register`); + await axios.post(url.href, { + username: username, + password: password + }); + } + + export async function createDemobankEbicsSubscriber( + req: CreateEbicsSubscriberRequest, + demobankAccountLabel: string, + libeufinSandboxService: LibeufinSandboxServiceInterface, + username: string = "admin", + password: string = "secret", + ) { + // baseUrl should already be pointed to one demobank. + let url = new URL(libeufinSandboxService.baseUrl); + await axios.post(url.href, { + userID: req.userID, + hostID: req.hostID, + partnerID: req.userID, + demobankAccountLabel: demobankAccountLabel, + }, { + auth: { + username: "admin", + password: "secret", + }, + }); + } + + export async function rotateKeys( + libeufinSandboxService: LibeufinSandboxServiceInterface, + hostID: string, + ) { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL(`admin/ebics/hosts/${hostID}/rotate-keys`, baseUrl); + await axios.post(url.href, {}, { + auth: { + username: "admin", + password: "secret", + }, + }); + } + export async function createEbicsHost( + libeufinSandboxService: LibeufinSandboxServiceInterface, + hostID: string, + ) { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL("admin/ebics/hosts", baseUrl); + await axios.post(url.href, { + hostID, + ebicsVersion: "2.5", + }, + { + auth: { + username: "admin", + password: "secret", + }, + }); + } + + export async function createBankAccount( + libeufinSandboxService: LibeufinSandboxServiceInterface, + req: BankAccountInfo, + ) { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL(`admin/bank-accounts/${req.label}`, baseUrl); + await axios.post(url.href, req, { + auth: { + username: "admin", + password: "secret", + }, + }); + } + + /** + * This function is useless. It creates a Ebics subscriber + * but never gives it a bank account. To be removed + */ + export async function createEbicsSubscriber( + libeufinSandboxService: LibeufinSandboxServiceInterface, + req: CreateEbicsSubscriberRequest, + ) { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL("admin/ebics/subscribers", baseUrl); + await axios.post(url.href, req, { + auth: { + username: "admin", + password: "secret", + }, + }); + } + + export async function createEbicsBankAccount( + libeufinSandboxService: LibeufinSandboxServiceInterface, + req: CreateEbicsBankAccountRequest, + ) { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL("admin/ebics/bank-accounts", baseUrl); + await axios.post(url.href, req, { + auth: { + username: "admin", + password: "secret", + }, + }); + } + + export async function simulateIncomingTransaction( + libeufinSandboxService: LibeufinSandboxServiceInterface, + accountLabel: string, + req: SimulateIncomingTransactionRequest, + ) { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL( + `admin/bank-accounts/${accountLabel}/simulate-incoming-transaction`, + baseUrl, + ); + await axios.post(url.href, req, { + auth: { + username: "admin", + password: "secret", + }, + }); + } + + export async function getAccountTransactions( + libeufinSandboxService: LibeufinSandboxServiceInterface, + accountLabel: string, + ): Promise<SandboxAccountTransactions> { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL( + `admin/bank-accounts/${accountLabel}/transactions`, + baseUrl, + ); + const res = await axios.get(url.href, { + auth: { + username: "admin", + password: "secret", + }, + }); + return res.data as SandboxAccountTransactions; + } + + export async function getCamt053( + libeufinSandboxService: LibeufinSandboxServiceInterface, + accountLabel: string, + ): Promise<any> { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL("admin/payments/camt", baseUrl); + return await axios.post(url.href, { + bankaccount: accountLabel, + type: 53, + }, + { + auth: { + username: "admin", + password: "secret", + }, + }); + } + + export async function getAccountInfoWithBalance( + libeufinSandboxService: LibeufinSandboxServiceInterface, + accountLabel: string, + ): Promise<any> { + const baseUrl = libeufinSandboxService.baseUrl; + let url = new URL( + `admin/bank-accounts/${accountLabel}`, + baseUrl, + ); + return await axios.get(url.href, { + auth: { + username: "admin", + password: "secret", + }, + }); + } +} + +export namespace LibeufinNexusApi { + export async function getAllConnections( + nexus: LibeufinNexusServiceInterface, + ): Promise<any> { + let url = new URL("bank-connections", nexus.baseUrl); + const res = await axios.get(url.href, { + auth: { + username: "admin", + password: "test", + }, + }); + return res; + } + + export async function deleteBankConnection( + libeufinNexusService: LibeufinNexusServiceInterface, + req: DeleteBankConnectionRequest, + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL("bank-connections/delete-connection", baseUrl); + return await axios.post(url.href, req, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function createEbicsBankConnection( + libeufinNexusService: LibeufinNexusServiceInterface, + req: CreateEbicsBankConnectionRequest, + ): Promise<void> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL("bank-connections", baseUrl); + await axios.post( + url.href, + { + source: "new", + type: "ebics", + name: req.name, + data: { + ebicsURL: req.ebicsURL, + hostID: req.hostID, + userID: req.userID, + partnerID: req.partnerID, + systemID: req.systemID, + }, + }, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } + + export async function getBankAccount( + libeufinNexusService: LibeufinNexusServiceInterface, + accountName: string, + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL( + `bank-accounts/${accountName}`, + baseUrl, + ); + return await axios.get( + url.href, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } + + + export async function submitInitiatedPayment( + libeufinNexusService: LibeufinNexusServiceInterface, + accountName: string, + paymentId: string, + ): Promise<void> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL( + `bank-accounts/${accountName}/payment-initiations/${paymentId}/submit`, + baseUrl, + ); + await axios.post( + url.href, + {}, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } + + export async function fetchAccounts( + libeufinNexusService: LibeufinNexusServiceInterface, + connectionName: string, + ): Promise<void> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL( + `bank-connections/${connectionName}/fetch-accounts`, + baseUrl, + ); + await axios.post( + url.href, + {}, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } + + export async function importConnectionAccount( + libeufinNexusService: LibeufinNexusServiceInterface, + connectionName: string, + offeredAccountId: string, + nexusBankAccountId: string, + ): Promise<void> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL( + `bank-connections/${connectionName}/import-account`, + baseUrl, + ); + await axios.post( + url.href, + { + offeredAccountId, + nexusBankAccountId, + }, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } + + export async function connectBankConnection( + libeufinNexusService: LibeufinNexusServiceInterface, + connectionName: string, + ) { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`bank-connections/${connectionName}/connect`, baseUrl); + await axios.post( + url.href, + {}, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } + + export async function getPaymentInitiations( + libeufinNexusService: LibeufinNexusServiceInterface, + accountName: string, + username: string = "admin", + password: string = "test", + ): Promise<void> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL( + `/bank-accounts/${accountName}/payment-initiations`, + baseUrl, + ); + let response = await axios.get(url.href, { + auth: { + username: username, + password: password, + }, + }); + console.log( + `Payment initiations of: ${accountName}`, + JSON.stringify(response.data, null, 2), + ); + } + + export async function getConfig( + libeufinNexusService: LibeufinNexusServiceInterface, + ): Promise<void> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/config`, baseUrl); + let response = await axios.get(url.href); + } + + // Uses the Anastasis API to get a list of transactions. + export async function getAnastasisTransactions( + libeufinNexusService: LibeufinNexusServiceInterface, + anastasisBaseUrl: string, + params: {}, // of the request: {delta: 5, ..} + username: string = "admin", + password: string = "test", + ): Promise<any> { + let url = new URL("history/incoming", anastasisBaseUrl); + let response = await axios.get(url.href, { params: params, + auth: { + username: username, + password: password, + }, + }); + return response; + } + + // FIXME: this function should return some structured + // object that represents a history. + export async function getAccountTransactions( + libeufinNexusService: LibeufinNexusServiceInterface, + accountName: string, + username: string = "admin", + password: string = "test", + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/bank-accounts/${accountName}/transactions`, baseUrl); + let response = await axios.get(url.href, { + auth: { + username: username, + password: password, + }, + }); + return response; + } + + export async function fetchTransactions( + libeufinNexusService: LibeufinNexusServiceInterface, + accountName: string, + rangeType: string = "all", + level: string = "report", + username: string = "admin", + password: string = "test", + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL( + `/bank-accounts/${accountName}/fetch-transactions`, + baseUrl, + ); + return await axios.post( + url.href, + { + rangeType: rangeType, + level: level, + }, + { + auth: { + username: username, + password: password, + }, + }, + ); + } + + export async function changePassword( + libeufinNexusService: LibeufinNexusServiceInterface, + username: string, + req: UpdateNexusUserRequest, + auth: NexusAuth, + ) { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/users/${username}/password`, baseUrl); + await axios.post(url.href, req, auth); + } + + export async function getUser( + libeufinNexusService: LibeufinNexusServiceInterface, + auth: NexusAuth, + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/user`, baseUrl); + return await axios.get(url.href, auth); + } + + export async function createUser( + libeufinNexusService: LibeufinNexusServiceInterface, + req: CreateNexusUserRequest, + ) { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/users`, baseUrl); + await axios.post(url.href, req, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function getAllPermissions( + libeufinNexusService: LibeufinNexusServiceInterface, + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/permissions`, baseUrl); + return await axios.get(url.href, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function postPermission( + libeufinNexusService: LibeufinNexusServiceInterface, + req: PostNexusPermissionRequest, + ) { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/permissions`, baseUrl); + await axios.post(url.href, req, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function getTasks( + libeufinNexusService: LibeufinNexusServiceInterface, + bankAccountName: string, + // When void, the request returns the list of all the + // tasks under this bank account. + taskName: string | void, + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/bank-accounts/${bankAccountName}/schedule`, baseUrl); + if (taskName) url = new URL(taskName, `${url}/`); + + // It's caller's responsibility to interpret the response. + return await axios.get(url.href, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function deleteTask( + libeufinNexusService: LibeufinNexusServiceInterface, + bankAccountName: string, + taskName: string, + ) { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL( + `/bank-accounts/${bankAccountName}/schedule/${taskName}`, + baseUrl, + ); + await axios.delete(url.href, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function postTask( + libeufinNexusService: LibeufinNexusServiceInterface, + bankAccountName: string, + req: PostNexusTaskRequest, + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`/bank-accounts/${bankAccountName}/schedule`, baseUrl); + return await axios.post(url.href, req, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function deleteFacade( + libeufinNexusService: LibeufinNexusServiceInterface, + facadeName: string, + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL(`facades/${facadeName}`, baseUrl); + return await axios.delete(url.href, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function getAllFacades( + libeufinNexusService: LibeufinNexusServiceInterface, + ): Promise<any> { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL("facades", baseUrl); + return await axios.get(url.href, { + auth: { + username: "admin", + password: "test", + }, + }); + } + + export async function createAnastasisFacade( + libeufinNexusService: LibeufinNexusServiceInterface, + req: CreateAnastasisFacadeRequest, + ) { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL("facades", baseUrl); + await axios.post( + url.href, + { + name: req.name, + type: "anastasis", + config: { + bankAccount: req.accountName, + bankConnection: req.connectionName, + currency: req.currency, + reserveTransferLevel: req.reserveTransferLevel, + }, + }, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } + + export async function createTwgFacade( + libeufinNexusService: LibeufinNexusServiceInterface, + req: CreateTalerWireGatewayFacadeRequest, + ) { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL("facades", baseUrl); + await axios.post( + url.href, + { + name: req.name, + type: "taler-wire-gateway", + config: { + bankAccount: req.accountName, + bankConnection: req.connectionName, + currency: req.currency, + reserveTransferLevel: req.reserveTransferLevel, + }, + }, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } + + export async function submitAllPaymentInitiations( + libeufinNexusService: LibeufinNexusServiceInterface, + accountId: string, + ) { + const baseUrl = libeufinNexusService.baseUrl; + let url = new URL( + `/bank-accounts/${accountId}/submit-all-payment-initiations`, + baseUrl, + ); + await axios.post( + url.href, + {}, + { + auth: { + username: "admin", + password: "test", + }, + }, + ); + } +} + diff --git a/packages/taler-wallet-cli/src/harness/libeufin.ts b/packages/taler-wallet-cli/src/harness/libeufin.ts index ea4a2685a..d101efa52 100644 --- a/packages/taler-wallet-cli/src/harness/libeufin.ts +++ b/packages/taler-wallet-cli/src/harness/libeufin.ts @@ -15,11 +15,19 @@ */ /** + * This file defines euFin test logic that needs state + * and that depends on the main harness.ts. The other + * definitions - mainly helper functions to call RESTful + * APIs - moved to libeufin-apis.ts. That enables harness.ts + * to depend on such API calls, in contrast to the previous + * situation where harness.ts had to include this file causing + * a circular dependency. */ + +/** * Imports. */ import axios from "axios"; import { URL } from "@gnu-taler/taler-util"; -import { getRandomIban, getRandomString } from "../harness/helpers.js"; import { GlobalTestState, DbInfo, @@ -30,12 +38,27 @@ import { sh, } from "../harness/harness.js"; -export interface LibeufinSandboxServiceInterface { - baseUrl: string; -} - -export interface LibeufinNexusServiceInterface { - baseUrl: string; +import { + LibeufinSandboxApi, + LibeufinNexusApi, + CreateEbicsBankAccountRequest, + LibeufinSandboxServiceInterface, + CreateTalerWireGatewayFacadeRequest, + SimulateIncomingTransactionRequest, + SandboxAccountTransactions, + DeleteBankConnectionRequest, + CreateEbicsBankConnectionRequest, + UpdateNexusUserRequest, + NexusAuth, + CreateAnastasisFacadeRequest, + PostNexusTaskRequest, + PostNexusPermissionRequest, + CreateNexusUserRequest +} from "../harness/libeufin-apis.js"; + +export { + LibeufinSandboxApi, + LibeufinNexusApi } export interface LibeufinServices { @@ -54,10 +77,6 @@ export interface LibeufinNexusConfig { databaseJdbcUri: string; } -export interface DeleteBankConnectionRequest { - bankConnectionId: string; -} - interface LibeufinNexusMoneyMovement { amount: string; creditDebitIndicator: string; @@ -154,13 +173,6 @@ export interface LibeufinBankAccountImportDetails { connectionName: string; } -export interface BankAccountInfo { - iban: string; - bic: string; - name: string; - label: string; -} - export interface LibeufinPreparedPaymentDetails { creditorIban: string; creditorBic: string; @@ -171,18 +183,8 @@ export interface LibeufinPreparedPaymentDetails { nexusBankAccountName: string; } -export interface LibeufinSandboxAddIncomingRequest { - creditorIban: string; - creditorBic: string; - creditorName: string; - debtorIban: string; - debtorBic: string; - debtorName: string; - subject: string; - amount: string; - currency: string; - uid: string; - direction: string; +function getRandomIban(countryCode: string): string { + return `${countryCode}715001051796${(Math.random().toString().substring(2, 8))}` } export class LibeufinSandboxService implements LibeufinSandboxServiceInterface { @@ -317,51 +319,12 @@ export class LibeufinNexusService { } } -export interface CreateEbicsSubscriberRequest { - hostID: string; - userID: string; - partnerID: string; - systemID?: string; -} - export interface TwgAddIncomingRequest { amount: string; reserve_pub: string; debit_account: string; } -interface CreateEbicsBankAccountRequest { - subscriber: { - hostID: string; - partnerID: string; - userID: string; - systemID?: string; - }; - // IBAN - iban: string; - // BIC - bic: string; - // human name - name: string; - label: string; -} - -export interface SimulateIncomingTransactionRequest { - debtorIban: string; - debtorBic: string; - debtorName: string; - - /** - * Subject / unstructured remittance info. - */ - subject: string; - - /** - * Decimal amount without currency. - */ - amount: string; -} - /** * The bundle aims at minimizing the amount of input * data that is required to initialize a new user + Ebics @@ -756,7 +719,6 @@ export class LibeufinCli { console.log(stdout); } - async newTalerWireGatewayFacade(req: NewTalerWireGatewayReq): Promise<void> { const stdout = await sh( this.globalTestState, @@ -805,752 +767,6 @@ interface NewTalerWireGatewayReq { currency: string; } -export namespace LibeufinSandboxApi { - - export async function rotateKeys( - libeufinSandboxService: LibeufinSandboxServiceInterface, - hostID: string, - ) { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL(`admin/ebics/hosts/${hostID}/rotate-keys`, baseUrl); - await axios.post(url.href, {}, { - auth: { - username: "admin", - password: "secret", - }, - }); - } - export async function createEbicsHost( - libeufinSandboxService: LibeufinSandboxServiceInterface, - hostID: string, - ) { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL("admin/ebics/hosts", baseUrl); - await axios.post(url.href, { - hostID, - ebicsVersion: "2.5", - }, - { - auth: { - username: "admin", - password: "secret", - }, - }); - } - - export async function createBankAccount( - libeufinSandboxService: LibeufinSandboxServiceInterface, - req: BankAccountInfo, - ) { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL(`admin/bank-accounts/${req.label}`, baseUrl); - await axios.post(url.href, req, { - auth: { - username: "admin", - password: "secret", - }, - }); - } - - export async function createEbicsSubscriber( - libeufinSandboxService: LibeufinSandboxServiceInterface, - req: CreateEbicsSubscriberRequest, - ) { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL("admin/ebics/subscribers", baseUrl); - await axios.post(url.href, req, { - auth: { - username: "admin", - password: "secret", - }, - }); - } - - export async function createEbicsBankAccount( - libeufinSandboxService: LibeufinSandboxServiceInterface, - req: CreateEbicsBankAccountRequest, - ) { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL("admin/ebics/bank-accounts", baseUrl); - await axios.post(url.href, req, { - auth: { - username: "admin", - password: "secret", - }, - }); - } - - export async function bookPayment2( - libeufinSandboxService: LibeufinSandboxService, - req: LibeufinSandboxAddIncomingRequest, - ) { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL("admin/payments", baseUrl); - await axios.post(url.href, req, { - auth: { - username: "admin", - password: "secret", - }, - }); - } - - export async function bookPayment( - libeufinSandboxService: LibeufinSandboxService, - creditorBundle: SandboxUserBundle, - debitorBundle: SandboxUserBundle, - subject: string, - amount: string, - currency: string, - ) { - let req: LibeufinSandboxAddIncomingRequest = { - creditorIban: creditorBundle.ebicsBankAccount.iban, - creditorBic: creditorBundle.ebicsBankAccount.bic, - creditorName: creditorBundle.ebicsBankAccount.name, - debtorIban: debitorBundle.ebicsBankAccount.iban, - debtorBic: debitorBundle.ebicsBankAccount.bic, - debtorName: debitorBundle.ebicsBankAccount.name, - subject: subject, - amount: amount, - currency: currency, - uid: getRandomString(), - direction: "CRDT", - }; - await bookPayment2(libeufinSandboxService, req); - } - - export async function simulateIncomingTransaction( - libeufinSandboxService: LibeufinSandboxServiceInterface, - accountLabel: string, - req: SimulateIncomingTransactionRequest, - ) { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL( - `admin/bank-accounts/${accountLabel}/simulate-incoming-transaction`, - baseUrl, - ); - await axios.post(url.href, req, { - auth: { - username: "admin", - password: "secret", - }, - }); - } - - export async function getAccountTransactions( - libeufinSandboxService: LibeufinSandboxServiceInterface, - accountLabel: string, - ): Promise<SandboxAccountTransactions> { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL( - `admin/bank-accounts/${accountLabel}/transactions`, - baseUrl, - ); - const res = await axios.get(url.href, { - auth: { - username: "admin", - password: "secret", - }, - }); - return res.data as SandboxAccountTransactions; - } - - export async function getCamt053( - libeufinSandboxService: LibeufinSandboxServiceInterface, - accountLabel: string, - ): Promise<any> { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL("admin/payments/camt", baseUrl); - return await axios.post(url.href, { - bankaccount: accountLabel, - type: 53, - }, - { - auth: { - username: "admin", - password: "secret", - }, - }); - } - - export async function getAccountInfoWithBalance( - libeufinSandboxService: LibeufinSandboxServiceInterface, - accountLabel: string, - ): Promise<any> { - const baseUrl = libeufinSandboxService.baseUrl; - let url = new URL( - `admin/bank-accounts/${accountLabel}`, - baseUrl, - ); - return await axios.get(url.href, { - auth: { - username: "admin", - password: "secret", - }, - }); - } -} - -export interface SandboxAccountTransactions { - payments: { - accountLabel: string; - creditorIban: string; - creditorBic?: string; - creditorName: string; - debtorIban: string; - debtorBic: string; - debtorName: string; - amount: string; - currency: string; - subject: string; - date: string; - creditDebitIndicator: "debit" | "credit"; - accountServicerReference: string; - }[]; -} - -export interface CreateEbicsBankConnectionRequest { - name: string; - ebicsURL: string; - hostID: string; - userID: string; - partnerID: string; - systemID?: string; -} - -export interface CreateAnastasisFacadeRequest { - name: string; - connectionName: string; - accountName: string; - currency: string; - reserveTransferLevel: "report" | "statement" | "notification"; -} - - -export interface CreateTalerWireGatewayFacadeRequest { - name: string; - connectionName: string; - accountName: string; - currency: string; - reserveTransferLevel: "report" | "statement" | "notification"; -} - -export interface UpdateNexusUserRequest { - newPassword: string; -} - -export interface NexusAuth { - auth: { - username: string; - password: string; - }; -} - -export interface CreateNexusUserRequest { - username: string; - password: string; -} - -export interface PostNexusTaskRequest { - name: string; - cronspec: string; - type: string; // fetch | submit - params: - | { - level: string; // report | statement | all - rangeType: string; // all | since-last | previous-days | latest - } - | {}; -} - -export interface PostNexusPermissionRequest { - action: "revoke" | "grant"; - permission: { - subjectType: string; - subjectId: string; - resourceType: string; - resourceId: string; - permissionName: string; - }; -} - -export namespace LibeufinNexusApi { - export async function getAllConnections( - nexus: LibeufinNexusServiceInterface, - ): Promise<any> { - let url = new URL("bank-connections", nexus.baseUrl); - const res = await axios.get(url.href, { - auth: { - username: "admin", - password: "test", - }, - }); - return res; - } - - export async function deleteBankConnection( - libeufinNexusService: LibeufinNexusServiceInterface, - req: DeleteBankConnectionRequest, - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL("bank-connections/delete-connection", baseUrl); - return await axios.post(url.href, req, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function createEbicsBankConnection( - libeufinNexusService: LibeufinNexusServiceInterface, - req: CreateEbicsBankConnectionRequest, - ): Promise<void> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL("bank-connections", baseUrl); - await axios.post( - url.href, - { - source: "new", - type: "ebics", - name: req.name, - data: { - ebicsURL: req.ebicsURL, - hostID: req.hostID, - userID: req.userID, - partnerID: req.partnerID, - systemID: req.systemID, - }, - }, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } - - export async function getBankAccount( - libeufinNexusService: LibeufinNexusServiceInterface, - accountName: string, - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL( - `bank-accounts/${accountName}`, - baseUrl, - ); - return await axios.get( - url.href, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } - - - export async function submitInitiatedPayment( - libeufinNexusService: LibeufinNexusServiceInterface, - accountName: string, - paymentId: string, - ): Promise<void> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL( - `bank-accounts/${accountName}/payment-initiations/${paymentId}/submit`, - baseUrl, - ); - await axios.post( - url.href, - {}, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } - - export async function fetchAccounts( - libeufinNexusService: LibeufinNexusServiceInterface, - connectionName: string, - ): Promise<void> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL( - `bank-connections/${connectionName}/fetch-accounts`, - baseUrl, - ); - await axios.post( - url.href, - {}, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } - - export async function importConnectionAccount( - libeufinNexusService: LibeufinNexusServiceInterface, - connectionName: string, - offeredAccountId: string, - nexusBankAccountId: string, - ): Promise<void> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL( - `bank-connections/${connectionName}/import-account`, - baseUrl, - ); - await axios.post( - url.href, - { - offeredAccountId, - nexusBankAccountId, - }, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } - - export async function connectBankConnection( - libeufinNexusService: LibeufinNexusServiceInterface, - connectionName: string, - ) { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`bank-connections/${connectionName}/connect`, baseUrl); - await axios.post( - url.href, - {}, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } - - export async function getPaymentInitiations( - libeufinNexusService: LibeufinNexusService, - accountName: string, - username: string = "admin", - password: string = "test", - ): Promise<void> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL( - `/bank-accounts/${accountName}/payment-initiations`, - baseUrl, - ); - let response = await axios.get(url.href, { - auth: { - username: username, - password: password, - }, - }); - console.log( - `Payment initiations of: ${accountName}`, - JSON.stringify(response.data, null, 2), - ); - } - - export async function getConfig( - libeufinNexusService: LibeufinNexusService, - ): Promise<void> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/config`, baseUrl); - let response = await axios.get(url.href); - } - - // Uses the Anastasis API to get a list of transactions. - export async function getAnastasisTransactions( - libeufinNexusService: LibeufinNexusService, - anastasisBaseUrl: string, - params: {}, // of the request: {delta: 5, ..} - username: string = "admin", - password: string = "test", - ): Promise<any> { - let url = new URL("history/incoming", anastasisBaseUrl); - let response = await axios.get(url.href, { params: params, - auth: { - username: username, - password: password, - }, - }); - return response; - } - - // FIXME: this function should return some structured - // object that represents a history. - export async function getAccountTransactions( - libeufinNexusService: LibeufinNexusService, - accountName: string, - username: string = "admin", - password: string = "test", - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/bank-accounts/${accountName}/transactions`, baseUrl); - let response = await axios.get(url.href, { - auth: { - username: username, - password: password, - }, - }); - return response; - } - - export async function fetchTransactions( - libeufinNexusService: LibeufinNexusService, - accountName: string, - rangeType: string = "all", - level: string = "report", - username: string = "admin", - password: string = "test", - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL( - `/bank-accounts/${accountName}/fetch-transactions`, - baseUrl, - ); - return await axios.post( - url.href, - { - rangeType: rangeType, - level: level, - }, - { - auth: { - username: username, - password: password, - }, - }, - ); - } - - export async function changePassword( - libeufinNexusService: LibeufinNexusServiceInterface, - username: string, - req: UpdateNexusUserRequest, - auth: NexusAuth, - ) { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/users/${username}/password`, baseUrl); - await axios.post(url.href, req, auth); - } - - export async function getUser( - libeufinNexusService: LibeufinNexusServiceInterface, - auth: NexusAuth, - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/user`, baseUrl); - return await axios.get(url.href, auth); - } - - export async function createUser( - libeufinNexusService: LibeufinNexusServiceInterface, - req: CreateNexusUserRequest, - ) { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/users`, baseUrl); - await axios.post(url.href, req, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function getAllPermissions( - libeufinNexusService: LibeufinNexusServiceInterface, - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/permissions`, baseUrl); - return await axios.get(url.href, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function postPermission( - libeufinNexusService: LibeufinNexusServiceInterface, - req: PostNexusPermissionRequest, - ) { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/permissions`, baseUrl); - await axios.post(url.href, req, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function getTasks( - libeufinNexusService: LibeufinNexusServiceInterface, - bankAccountName: string, - // When void, the request returns the list of all the - // tasks under this bank account. - taskName: string | void, - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/bank-accounts/${bankAccountName}/schedule`, baseUrl); - if (taskName) url = new URL(taskName, `${url}/`); - - // It's caller's responsibility to interpret the response. - return await axios.get(url.href, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function deleteTask( - libeufinNexusService: LibeufinNexusServiceInterface, - bankAccountName: string, - taskName: string, - ) { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL( - `/bank-accounts/${bankAccountName}/schedule/${taskName}`, - baseUrl, - ); - await axios.delete(url.href, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function postTask( - libeufinNexusService: LibeufinNexusServiceInterface, - bankAccountName: string, - req: PostNexusTaskRequest, - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`/bank-accounts/${bankAccountName}/schedule`, baseUrl); - return await axios.post(url.href, req, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function deleteFacade( - libeufinNexusService: LibeufinNexusServiceInterface, - facadeName: string, - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL(`facades/${facadeName}`, baseUrl); - return await axios.delete(url.href, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function getAllFacades( - libeufinNexusService: LibeufinNexusServiceInterface, - ): Promise<any> { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL("facades", baseUrl); - return await axios.get(url.href, { - auth: { - username: "admin", - password: "test", - }, - }); - } - - export async function createAnastasisFacade( - libeufinNexusService: LibeufinNexusServiceInterface, - req: CreateAnastasisFacadeRequest, - ) { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL("facades", baseUrl); - await axios.post( - url.href, - { - name: req.name, - type: "anastasis", - config: { - bankAccount: req.accountName, - bankConnection: req.connectionName, - currency: req.currency, - reserveTransferLevel: req.reserveTransferLevel, - }, - }, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } - - export async function createTwgFacade( - libeufinNexusService: LibeufinNexusServiceInterface, - req: CreateTalerWireGatewayFacadeRequest, - ) { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL("facades", baseUrl); - await axios.post( - url.href, - { - name: req.name, - type: "taler-wire-gateway", - config: { - bankAccount: req.accountName, - bankConnection: req.connectionName, - currency: req.currency, - reserveTransferLevel: req.reserveTransferLevel, - }, - }, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } - - export async function submitAllPaymentInitiations( - libeufinNexusService: LibeufinNexusServiceInterface, - accountId: string, - ) { - const baseUrl = libeufinNexusService.baseUrl; - let url = new URL( - `/bank-accounts/${accountId}/submit-all-payment-initiations`, - baseUrl, - ); - await axios.post( - url.href, - {}, - { - auth: { - username: "admin", - password: "test", - }, - }, - ); - } -} - /** * Launch Nexus and Sandbox AND creates users / facades / bank accounts / * .. all that's required to start making banking traffic. diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts index 142e98e7c..71431b5eb 100644 --- a/packages/taler-wallet-cli/src/index.ts +++ b/packages/taler-wallet-cli/src/index.ts @@ -43,6 +43,8 @@ import { Configuration, decodeCrock, rsaBlind, + LogLevel, + setGlobalLogLevelFromString, } from "@gnu-taler/taler-util"; import { NodeHttpLib, @@ -161,6 +163,12 @@ export const walletCli = clk setDangerousTimetravel(x / 1000); }, }) + .maybeOption("log", ["-L", "--log"], clk.STRING, { + help: "configure log level (NONE, ..., TRACE)", + onPresentHandler: (x) => { + setGlobalLogLevelFromString(x); + }, + }) .maybeOption("inhibit", ["--inhibit"], clk.STRING, { help: "Inhibit running certain operations, useful for debugging and testing.", diff --git a/packages/taler-wallet-core/package.json b/packages/taler-wallet-core/package.json index 0d726a6d7..d8b344f2c 100644 --- a/packages/taler-wallet-core/package.json +++ b/packages/taler-wallet-core/package.json @@ -54,7 +54,7 @@ "po2json": "^0.4.5", "prettier": "^2.2.1", "rimraf": "^3.0.2", - "rollup": "^2.37.1", + "rollup": "^2.38", "rollup-plugin-sourcemaps": "^0.6.3", "source-map-resolve": "^0.6.0", "typedoc": "^0.20.16", diff --git a/packages/taler-wallet-core/src/operations/backup/index.ts b/packages/taler-wallet-core/src/operations/backup/index.ts index 913ffcb2e..3f4c02274 100644 --- a/packages/taler-wallet-core/src/operations/backup/index.ts +++ b/packages/taler-wallet-core/src/operations/backup/index.ts @@ -40,6 +40,7 @@ import { ConfirmPayResultType, durationFromSpec, getTimestampNow, + HttpStatusCode, j2s, Logger, notEmpty, @@ -84,7 +85,6 @@ import { } from "../../db.js"; import { guardOperationException } from "../../errors.js"; import { - HttpResponseStatus, readSuccessResponseJsonOrThrow, readTalerErrorResponse, } from "../../util/http.js"; @@ -317,7 +317,7 @@ async function runBackupCycleForProvider( logger.trace(`sync response status: ${resp.status}`); - if (resp.status === HttpResponseStatus.NotModified) { + if (resp.status === HttpStatusCode.NotModified) { await ws.db .mktx((x) => ({ backupProvider: x.backupProviders })) .runReadWrite(async (tx) => { @@ -335,7 +335,7 @@ async function runBackupCycleForProvider( return; } - if (resp.status === HttpResponseStatus.PaymentRequired) { + if (resp.status === HttpStatusCode.PaymentRequired) { logger.trace("payment required for backup"); logger.trace(`headers: ${j2s(resp.headers)}`); const talerUri = resp.headers.get("taler"); @@ -396,7 +396,7 @@ async function runBackupCycleForProvider( return; } - if (resp.status === HttpResponseStatus.NoContent) { + if (resp.status === HttpStatusCode.NoContent) { await ws.db .mktx((x) => ({ backupProviders: x.backupProviders })) .runReadWrite(async (tx) => { @@ -415,7 +415,7 @@ async function runBackupCycleForProvider( return; } - if (resp.status === HttpResponseStatus.Conflict) { + if (resp.status === HttpStatusCode.Conflict) { logger.info("conflicting backup found"); const backupEnc = new Uint8Array(await resp.bytes()); const backupConfig = await provideBackupState(ws); diff --git a/packages/taler-wallet-core/src/operations/pay.ts b/packages/taler-wallet-core/src/operations/pay.ts index 8fad55994..a42480f40 100644 --- a/packages/taler-wallet-core/src/operations/pay.ts +++ b/packages/taler-wallet-core/src/operations/pay.ts @@ -53,6 +53,7 @@ import { Logger, URL, getDurationRemaining, + HttpStatusCode, } from "@gnu-taler/taler-util"; import { encodeCrock, getRandomBytes } from "@gnu-taler/taler-util"; import { @@ -89,7 +90,6 @@ import { } from "../db.js"; import { getHttpResponseErrorDetails, - HttpResponseStatus, readSuccessResponseJsonOrErrorCode, readSuccessResponseJsonOrThrow, readTalerErrorResponse, @@ -1222,7 +1222,7 @@ async function submitPay( }; } - if (resp.status === HttpResponseStatus.BadRequest) { + if (resp.status === HttpStatusCode.BadRequest) { const errDetails = await readUnexpectedResponseDetails(resp); logger.warn("unexpected 400 response for /pay"); logger.warn(j2s(errDetails)); @@ -1242,7 +1242,7 @@ async function submitPay( throw new OperationFailedAndReportedError(errDetails); } - if (resp.status === HttpResponseStatus.Conflict) { + if (resp.status === HttpStatusCode.Conflict) { const err = await readTalerErrorResponse(resp); if ( err.code === diff --git a/packages/taler-wallet-core/src/operations/refresh.ts b/packages/taler-wallet-core/src/operations/refresh.ts index 144514e1c..d727bd06f 100644 --- a/packages/taler-wallet-core/src/operations/refresh.ts +++ b/packages/taler-wallet-core/src/operations/refresh.ts @@ -14,7 +14,7 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { encodeCrock, getRandomBytes } from "@gnu-taler/taler-util"; +import { encodeCrock, getRandomBytes, HttpStatusCode } from "@gnu-taler/taler-util"; import { CoinRecord, CoinSourceType, @@ -40,7 +40,6 @@ import { import { AmountJson, Amounts } from "@gnu-taler/taler-util"; import { amountToPretty } from "@gnu-taler/taler-util"; import { - HttpResponseStatus, readSuccessResponseJsonOrThrow, readUnexpectedResponseDetails, } from "../util/http.js"; @@ -377,7 +376,7 @@ async function refreshMelt( }); }); - if (resp.status === HttpResponseStatus.NotFound) { + if (resp.status === HttpStatusCode.NotFound) { const errDetails = await readUnexpectedResponseDetails(resp); await ws.db .mktx((x) => ({ diff --git a/packages/taler-wallet-core/src/util/http.ts b/packages/taler-wallet-core/src/util/http.ts index d01f2ee42..0556d2274 100644 --- a/packages/taler-wallet-core/src/util/http.ts +++ b/packages/taler-wallet-core/src/util/http.ts @@ -59,17 +59,6 @@ export interface HttpRequestOptions { body?: string | ArrayBuffer | ArrayBufferView; } -export enum HttpResponseStatus { - Ok = 200, - NoContent = 204, - Gone = 210, - NotModified = 304, - BadRequest = 400, - PaymentRequired = 402, - NotFound = 404, - Conflict = 409, -} - /** * Headers, roughly modeled after the fetch API's headers object. */ diff --git a/packages/taler-wallet-webextension/package.json b/packages/taler-wallet-webextension/package.json index 4023e4ebd..3a43f1e76 100644 --- a/packages/taler-wallet-webextension/package.json +++ b/packages/taler-wallet-webextension/package.json @@ -45,7 +45,7 @@ "@storybook/preact": "^6.2.9", "@testing-library/preact": "^2.0.1", "@types/chrome": "^0.0.128", - "@types/enzyme": "^3.10.8", + "@types/enzyme": "^3.10.10", "@types/history": "^4.7.8", "@types/jest": "^26.0.23", "@types/node": "^14.14.22", @@ -80,4 +80,4 @@ "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|po)$": "<rootDir>/tests/__mocks__/fileTransformer.js" } } -}
\ No newline at end of file +} diff --git a/packages/taler-wallet-webextension/src/wallet/Transaction.tsx b/packages/taler-wallet-webextension/src/wallet/Transaction.tsx index 8a97ad50c..cf41efb59 100644 --- a/packages/taler-wallet-webextension/src/wallet/Transaction.tsx +++ b/packages/taler-wallet-webextension/src/wallet/Transaction.tsx @@ -14,17 +14,17 @@ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { AmountJson, AmountLike, Amounts, i18n, Transaction, TransactionType } from "@gnu-taler/taler-util"; +import { AmountLike, Amounts, i18n, Transaction, TransactionType } from "@gnu-taler/taler-util"; import { format } from "date-fns"; -import { Fragment, JSX, VNode, h } from "preact"; +import { JSX, VNode } from "preact"; import { route } from 'preact-router'; import { useEffect, useState } from "preact/hooks"; -import * as wxApi from "../wxApi"; -import { Pages } from "../NavigationBar"; -import emptyImg from "../../static/img/empty.png" -import { Button, ButtonBox, ButtonBoxDestructive, ButtonDestructive, ButtonPrimary, ExtraLargeText, FontIcon, LargeText, ListOfProducts, PopupBox, Row, RowBorderGray, SmallLightText, WalletBox, WarningBox } from "../components/styled"; +import emptyImg from "../../static/img/empty.png"; import { ErrorMessage } from "../components/ErrorMessage"; import { Part } from "../components/Part"; +import { ButtonBox, ButtonBoxDestructive, ButtonPrimary, FontIcon, ListOfProducts, RowBorderGray, SmallLightText, WalletBox, WarningBox } from "../components/styled"; +import { Pages } from "../NavigationBar"; +import * as wxApi from "../wxApi"; export function TransactionPage({ tid }: { tid: string; }): JSX.Element { const [transaction, setTransaction] = useState< @@ -42,7 +42,7 @@ export function TransactionPage({ tid }: { tid: string; }): JSX.Element { } }; fetchData(); - }, []); + }, [tid]); if (!transaction) { return <div><i18n.Translate>Loading ...</i18n.Translate></div>; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd6d7ae58..ce6296f3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,99 +4,121 @@ importers: .: specifiers: - '@linaria/esbuild': ^3.0.0-beta.7 - '@linaria/shaker': ^3.0.0-beta.7 - esbuild: ^0.12.21 + '@linaria/esbuild': ^3.0.0-beta.13 + '@linaria/shaker': ^3.0.0-beta.13 + esbuild: ^0.12.29 devDependencies: - '@linaria/esbuild': 3.0.0-beta.7 - '@linaria/shaker': 3.0.0-beta.7 - esbuild: 0.12.21 + '@linaria/esbuild': 3.0.0-beta.13 + '@linaria/shaker': 3.0.0-beta.13 + esbuild: 0.12.29 packages/anastasis-core: specifiers: '@gnu-taler/taler-util': workspace:^0.8.3 + '@rollup/plugin-commonjs': ^21.0.1 + '@rollup/plugin-json': ^4.1.0 + '@rollup/plugin-node-resolve': ^13.0.6 ava: ^3.15.0 fetch-ponyfill: ^7.1.0 fflate: ^0.6.0 hash-wasm: ^4.9.0 node-fetch: ^3.0.0 - typescript: ^4.4.3 + rimraf: ^3.0.2 + rollup: ^2.59.0 + rollup-plugin-sourcemaps: ^0.6.3 + source-map-support: ^0.5.19 + tslib: ^2.1.0 + typescript: ^4.4.4 dependencies: '@gnu-taler/taler-util': link:../taler-util fetch-ponyfill: 7.1.0 fflate: 0.6.0 hash-wasm: 4.9.0 node-fetch: 3.0.0 + tslib: 2.3.1 devDependencies: + '@rollup/plugin-commonjs': 21.0.1_rollup@2.59.0 + '@rollup/plugin-json': 4.1.0_rollup@2.59.0 + '@rollup/plugin-node-resolve': 13.0.6_rollup@2.59.0 ava: 3.15.0 - typescript: 4.4.3 + rimraf: 3.0.2 + rollup: 2.59.0 + rollup-plugin-sourcemaps: 0.6.3_rollup@2.59.0 + source-map-support: 0.5.19 + typescript: 4.4.4 packages/anastasis-webui: specifiers: '@creativebulma/bulma-tooltip': ^1.2.0 '@gnu-taler/taler-util': workspace:^0.8.3 - '@storybook/addon-a11y': ^6.2.9 - '@storybook/addon-actions': ^6.2.9 - '@storybook/addon-essentials': ^6.2.9 - '@storybook/addon-links': ^6.2.9 - '@storybook/preact': ^6.2.9 + '@storybook/addon-a11y': ^6.3.12 + '@storybook/addon-actions': ^6.3.12 + '@storybook/addon-essentials': ^6.3.12 + '@storybook/addon-links': ^6.3.12 + '@storybook/preact': ^6.3.12 '@storybook/preset-scss': ^1.0.3 - '@types/enzyme': ^3.10.5 - '@types/jest': ^26.0.8 - '@typescript-eslint/eslint-plugin': ^2.25.0 - '@typescript-eslint/parser': ^2.25.0 + '@types/enzyme': ^3.10.10 + '@types/jest': ^27.0.2 + '@typescript-eslint/eslint-plugin': ^5.3.0 + '@typescript-eslint/parser': ^5.3.0 anastasis-core: workspace:^0.0.1 bulma: ^0.9.3 bulma-checkbox: ^1.1.1 bulma-radio: ^1.1.1 + date-fns: 2.25.0 enzyme: ^3.11.0 - enzyme-adapter-preact-pure: ^3.1.0 - eslint: ^6.8.0 - eslint-config-preact: ^1.1.1 + enzyme-adapter-preact-pure: ^3.2.0 + eslint: ^8.1.0 + eslint-config-preact: ^1.2.0 jed: 1.1.1 - jest: ^26.2.2 - jest-preset-preact: ^4.0.2 - preact: ^10.3.1 - preact-cli: ^3.2.2 - preact-render-to-string: ^5.1.4 + jest: ^27.3.1 + jest-preset-preact: ^4.0.5 + jssha: ^3.2.0 + preact: ^10.5.15 + preact-cli: ^3.3.1 + preact-render-to-string: ^5.1.19 preact-router: ^3.2.1 - sass: ^1.32.13 - sass-loader: ^10.1.1 - sirv-cli: ^1.0.0-next.3 - typescript: ^3.7.5 + qrcode-generator: ^1.4.4 + sass: 1.32.13 + sass-loader: ^10 + sirv-cli: ^1.0.14 + typescript: ^4.4.4 dependencies: '@gnu-taler/taler-util': link:../taler-util anastasis-core: link:../anastasis-core + date-fns: 2.25.0 jed: 1.1.1 - preact: 10.5.14 - preact-render-to-string: 5.1.19_preact@10.5.14 - preact-router: 3.2.1_preact@10.5.14 + preact: 10.5.15 + preact-render-to-string: 5.1.19_preact@10.5.15 + preact-router: 3.2.1_preact@10.5.15 + qrcode-generator: 1.4.4 devDependencies: '@creativebulma/bulma-tooltip': 1.2.0 - '@storybook/addon-a11y': 6.3.7 - '@storybook/addon-actions': 6.3.7 - '@storybook/addon-essentials': 6.3.7_typescript@3.9.10 + '@storybook/addon-a11y': 6.3.12 + '@storybook/addon-actions': 6.3.12 + '@storybook/addon-essentials': 6.3.12_eslint@8.1.0+typescript@4.4.4 '@storybook/addon-links': 6.3.12 - '@storybook/preact': 6.3.7_preact@10.5.14+typescript@3.9.10 + '@storybook/preact': 6.3.12_95076c79c13120062fc2121e56d666e8 '@storybook/preset-scss': 1.0.3_sass-loader@10.2.0 - '@types/enzyme': 3.10.9 - '@types/jest': 26.0.24 - '@typescript-eslint/eslint-plugin': 2.34.0_2b015b1c4b7c4a3ed9a197dc233b1a35 - '@typescript-eslint/parser': 2.34.0_eslint@6.8.0+typescript@3.9.10 + '@types/enzyme': 3.10.10 + '@types/jest': 27.0.2 + '@typescript-eslint/eslint-plugin': 5.3.0_f8873316f48f7781ccc3e081fc76e214 + '@typescript-eslint/parser': 5.3.0_eslint@8.1.0+typescript@4.4.4 bulma: 0.9.3 bulma-checkbox: 1.1.1 bulma-radio: 1.1.1 enzyme: 3.11.0 - enzyme-adapter-preact-pure: 3.1.0_enzyme@3.11.0+preact@10.5.14 - eslint: 6.8.0 - eslint-config-preact: 1.1.4_eslint@6.8.0+typescript@3.9.10 - jest: 26.6.3 - jest-preset-preact: 4.0.2_9b3f24ae35a87c3c82fffbe3fdf70e1e - preact-cli: 3.2.2_8d1b4ee21ca5a56b4aabd4a3e659b2d7 - sass: 1.43.2 - sass-loader: 10.2.0_sass@1.43.2 + enzyme-adapter-preact-pure: 3.2.0_enzyme@3.11.0+preact@10.5.15 + eslint: 8.1.0 + eslint-config-preact: 1.2.0_eslint@8.1.0+typescript@4.4.4 + jest: 27.3.1 + jest-preset-preact: 4.0.5_726380f5f23d12d9b6cc402fef7b8b84 + jssha: 3.2.0 + preact-cli: 3.3.1_bb0f676d04cdcea3d812adbcf5208138 + sass: 1.32.13 + sass-loader: 10.2.0_sass@1.32.13 sirv-cli: 1.0.14 - typescript: 3.9.10 + typescript: 4.4.4 packages/idb-bridge: specifiers: @@ -223,7 +245,7 @@ importers: po2json: ^0.4.5 prettier: ^2.2.1 rimraf: ^3.0.2 - rollup: ^2.37.1 + rollup: ^2.38 rollup-plugin-sourcemaps: ^0.6.3 source-map-resolve: ^0.6.0 source-map-support: ^0.5.19 @@ -257,8 +279,8 @@ importers: po2json: 0.4.5 prettier: 2.2.1 rimraf: 3.0.2 - rollup: 2.37.1 - rollup-plugin-sourcemaps: 0.6.3_38ff52cc32daa1ae80c428f8a47a4e22 + rollup: 2.59.0 + rollup-plugin-sourcemaps: 0.6.3_57eeb328ceff0756ae1d32f4d22d60f9 source-map-resolve: 0.6.0 typedoc: 0.20.16_typescript@4.1.3 typescript: 4.1.3 @@ -319,7 +341,7 @@ importers: '@storybook/preact': ^6.2.9 '@testing-library/preact': ^2.0.1 '@types/chrome': ^0.0.128 - '@types/enzyme': ^3.10.8 + '@types/enzyme': ^3.10.10 '@types/history': ^4.7.8 '@types/jest': ^26.0.23 '@types/node': ^14.14.22 @@ -375,7 +397,7 @@ importers: '@storybook/preact': 6.3.7_9cd0ede338ef3d2deb8dbc69bc115c66 '@testing-library/preact': 2.0.1_preact@10.5.14 '@types/chrome': 0.0.128 - '@types/enzyme': 3.10.9 + '@types/enzyme': 3.10.10 '@types/history': 4.7.9 '@types/jest': 26.0.24 '@types/node': 14.17.10 @@ -411,6 +433,18 @@ packages: leven: 3.1.0 dev: true + /@apideck/better-ajv-errors/0.2.6_ajv@8.6.3: + resolution: {integrity: sha512-FvGcbFUdbPLexAhdvihkroCA3LQa7kGMa8Qj9f32BiOcV1Thscg/QCxp/kJibsFrhUrlKOzd07uJFOGTN0/awQ==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.6.3 + json-schema: 0.3.0 + jsonpointer: 4.1.0 + leven: 3.1.0 + dev: true + /@ava/typescript/1.1.1: resolution: {integrity: sha512-KbLUAe2cWXK63WLK6LnOJonjwEDU/8MNXCOA1ooX/YFZgKRmeAD1kZu+2K0ks5fnOCEcckNQAooyBNGdZUmMQA==} engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=13.5.0'} @@ -421,7 +455,7 @@ packages: /@babel/code-frame/7.10.4: resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} dependencies: - '@babel/highlight': 7.14.5 + '@babel/highlight': 7.16.0 dev: true /@babel/code-frame/7.12.11: @@ -443,23 +477,35 @@ packages: '@babel/highlight': 7.14.5 dev: true + /@babel/code-frame/7.16.0: + resolution: {integrity: sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.16.0 + dev: true + /@babel/compat-data/7.15.0: resolution: {integrity: sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==} engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data/7.16.0: + resolution: {integrity: sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core/7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.14.5 - '@babel/generator': 7.15.0 - '@babel/helper-module-transforms': 7.15.0 - '@babel/helpers': 7.15.3 - '@babel/parser': 7.15.3 - '@babel/template': 7.14.5 - '@babel/traverse': 7.15.0 - '@babel/types': 7.15.0 + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helpers': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 convert-source-map: 1.8.0 debug: 4.3.2 gensync: 1.0.0-beta.2 @@ -518,6 +564,43 @@ packages: - supports-color dev: true + /@babel/core/7.16.0: + resolution: {integrity: sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/helper-compilation-targets': 7.16.0_@babel+core@7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helpers': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + convert-source-map: 1.8.0 + debug: 4.3.2 + gensync: 1.0.0-beta.2 + json5: 2.2.0 + semver: 6.3.0 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/eslint-parser/7.16.0_@babel+core@7.16.0+eslint@8.1.0: + resolution: {integrity: sha512-c+AsYOHjI+FgCa+ifLd8sDXp4U4mjkfFgL9NdQWhuA731kAUJs0WdJIXET4A14EJAR9Jv9FFF/MzPWJfV9Oirw==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.16.0 + eslint: 8.1.0 + eslint-scope: 5.1.1 + eslint-visitor-keys: 2.1.0 + semver: 6.3.0 + dev: true + /@babel/generator/7.15.0: resolution: {integrity: sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==} engines: {node: '>=6.9.0'} @@ -527,6 +610,15 @@ packages: source-map: 0.5.7 dev: true + /@babel/generator/7.16.0: + resolution: {integrity: sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + jsesc: 2.5.2 + source-map: 0.5.7 + dev: true + /@babel/helper-annotate-as-pure/7.14.5: resolution: {integrity: sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==} engines: {node: '>=6.9.0'} @@ -534,6 +626,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-annotate-as-pure/7.16.0: + resolution: {integrity: sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-builder-binary-assignment-operator-visitor/7.14.5: resolution: {integrity: sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==} engines: {node: '>=6.9.0'} @@ -542,58 +641,76 @@ packages: '@babel/types': 7.15.0 dev: true - /@babel/helper-compilation-targets/7.15.0: + /@babel/helper-builder-binary-assignment-operator-visitor/7.16.0: + resolution: {integrity: sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.16.0 + '@babel/types': 7.16.0 + dev: true + + /@babel/helper-compilation-targets/7.15.0_@babel+core@7.13.16: resolution: {integrity: sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/compat-data': 7.15.0 + '@babel/core': 7.13.16 '@babel/helper-validator-option': 7.14.5 browserslist: 4.16.8 semver: 6.3.0 dev: true - /@babel/helper-compilation-targets/7.15.0_@babel+core@7.13.16: + /@babel/helper-compilation-targets/7.15.0_@babel+core@7.15.0: resolution: {integrity: sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/compat-data': 7.15.0 - '@babel/core': 7.13.16 + '@babel/core': 7.15.0 '@babel/helper-validator-option': 7.14.5 browserslist: 4.16.8 semver: 6.3.0 dev: true - /@babel/helper-compilation-targets/7.15.0_@babel+core@7.15.0: - resolution: {integrity: sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==} + /@babel/helper-compilation-targets/7.16.0: + resolution: {integrity: sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.15.0 + '@babel/compat-data': 7.16.0 + '@babel/helper-validator-option': 7.14.5 + browserslist: 4.17.6 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.16.0_@babel+core@7.15.0: + resolution: {integrity: sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.16.0 '@babel/core': 7.15.0 '@babel/helper-validator-option': 7.14.5 - browserslist: 4.16.8 + browserslist: 4.17.6 semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin/7.15.0: - resolution: {integrity: sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==} + /@babel/helper-compilation-targets/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/helper-annotate-as-pure': 7.14.5 - '@babel/helper-function-name': 7.14.5 - '@babel/helper-member-expression-to-functions': 7.15.0 - '@babel/helper-optimise-call-expression': 7.14.5 - '@babel/helper-replace-supers': 7.15.0 - '@babel/helper-split-export-declaration': 7.14.5 - transitivePeerDependencies: - - supports-color + '@babel/compat-data': 7.16.0 + '@babel/core': 7.16.0 + '@babel/helper-validator-option': 7.14.5 + browserslist: 4.17.6 + semver: 6.3.0 dev: true /@babel/helper-create-class-features-plugin/7.15.0_@babel+core@7.13.16: @@ -630,14 +747,37 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.14.5: - resolution: {integrity: sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==} + /@babel/helper-create-class-features-plugin/7.16.0: + resolution: {integrity: sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/helper-annotate-as-pure': 7.14.5 - regexpu-core: 4.7.1 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-member-expression-to-functions': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-class-features-plugin/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-member-expression-to-functions': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-create-regexp-features-plugin/7.14.5_@babel+core@7.13.16: @@ -662,16 +802,37 @@ packages: regexpu-core: 4.7.1 dev: true + /@babel/helper-create-regexp-features-plugin/7.16.0: + resolution: {integrity: sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/helper-annotate-as-pure': 7.16.0 + regexpu-core: 4.8.0 + dev: true + + /@babel/helper-create-regexp-features-plugin/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + regexpu-core: 4.8.0 + dev: true + /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.15.0: resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.15.0 - '@babel/helper-compilation-targets': 7.15.0_@babel+core@7.15.0 - '@babel/helper-module-imports': 7.14.5 + '@babel/helper-compilation-targets': 7.16.0_@babel+core@7.15.0 + '@babel/helper-module-imports': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/traverse': 7.15.0 + '@babel/traverse': 7.16.0 debug: 4.3.2 lodash.debounce: 4.0.8 resolve: 1.20.0 @@ -680,15 +841,16 @@ packages: - supports-color dev: true - /@babel/helper-define-polyfill-provider/0.2.3: - resolution: {integrity: sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==} + /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.16.0: + resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: - '@babel/helper-compilation-targets': 7.15.0 - '@babel/helper-module-imports': 7.14.5 + '@babel/core': 7.16.0 + '@babel/helper-compilation-targets': 7.16.0_@babel+core@7.16.0 + '@babel/helper-module-imports': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/traverse': 7.15.0 + '@babel/traverse': 7.16.0 debug: 4.3.2 lodash.debounce: 4.0.8 resolve: 1.20.0 @@ -733,6 +895,41 @@ packages: - supports-color dev: true + /@babel/helper-define-polyfill-provider/0.2.4: + resolution: {integrity: sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/helper-compilation-targets': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/traverse': 7.16.0 + debug: 4.3.2 + lodash.debounce: 4.0.8 + resolve: 1.20.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider/0.2.4_@babel+core@7.16.0: + resolution: {integrity: sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-compilation-targets': 7.16.0_@babel+core@7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/traverse': 7.16.0 + debug: 4.3.2 + lodash.debounce: 4.0.8 + resolve: 1.20.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-explode-assignable-expression/7.14.5: resolution: {integrity: sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==} engines: {node: '>=6.9.0'} @@ -740,6 +937,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-explode-assignable-expression/7.16.0: + resolution: {integrity: sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-function-name/7.14.5: resolution: {integrity: sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==} engines: {node: '>=6.9.0'} @@ -749,6 +953,15 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-function-name/7.16.0: + resolution: {integrity: sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-get-function-arity': 7.16.0 + '@babel/template': 7.16.0 + '@babel/types': 7.16.0 + dev: true + /@babel/helper-get-function-arity/7.14.5: resolution: {integrity: sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==} engines: {node: '>=6.9.0'} @@ -756,6 +969,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-get-function-arity/7.16.0: + resolution: {integrity: sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-hoist-variables/7.14.5: resolution: {integrity: sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==} engines: {node: '>=6.9.0'} @@ -763,6 +983,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-hoist-variables/7.16.0: + resolution: {integrity: sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-member-expression-to-functions/7.15.0: resolution: {integrity: sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==} engines: {node: '>=6.9.0'} @@ -770,6 +997,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-member-expression-to-functions/7.16.0: + resolution: {integrity: sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-module-imports/7.14.5: resolution: {integrity: sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==} engines: {node: '>=6.9.0'} @@ -777,6 +1011,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-module-imports/7.16.0: + resolution: {integrity: sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-module-transforms/7.15.0: resolution: {integrity: sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==} engines: {node: '>=6.9.0'} @@ -793,6 +1034,22 @@ packages: - supports-color dev: true + /@babel/helper-module-transforms/7.16.0: + resolution: {integrity: sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-simple-access': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + '@babel/helper-validator-identifier': 7.15.7 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-optimise-call-expression/7.14.5: resolution: {integrity: sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==} engines: {node: '>=6.9.0'} @@ -800,6 +1057,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-optimise-call-expression/7.16.0: + resolution: {integrity: sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-plugin-utils/7.10.4: resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} dev: true @@ -820,6 +1084,17 @@ packages: - supports-color dev: true + /@babel/helper-remap-async-to-generator/7.16.0: + resolution: {integrity: sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-wrap-function': 7.16.0 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-replace-supers/7.15.0: resolution: {integrity: sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==} engines: {node: '>=6.9.0'} @@ -832,6 +1107,18 @@ packages: - supports-color dev: true + /@babel/helper-replace-supers/7.16.0: + resolution: {integrity: sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-member-expression-to-functions': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-simple-access/7.14.8: resolution: {integrity: sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==} engines: {node: '>=6.9.0'} @@ -839,6 +1126,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-simple-access/7.16.0: + resolution: {integrity: sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-skip-transparent-expression-wrappers/7.14.5: resolution: {integrity: sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==} engines: {node: '>=6.9.0'} @@ -846,6 +1140,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-skip-transparent-expression-wrappers/7.16.0: + resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-split-export-declaration/7.14.5: resolution: {integrity: sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==} engines: {node: '>=6.9.0'} @@ -853,6 +1154,13 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/helper-split-export-declaration/7.16.0: + resolution: {integrity: sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 + dev: true + /@babel/helper-validator-identifier/7.12.11: resolution: {integrity: sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==} dev: true @@ -866,6 +1174,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-identifier/7.15.7: + resolution: {integrity: sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option/7.14.5: resolution: {integrity: sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==} engines: {node: '>=6.9.0'} @@ -883,6 +1196,18 @@ packages: - supports-color dev: true + /@babel/helper-wrap-function/7.16.0: + resolution: {integrity: sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.16.0 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helpers/7.15.3: resolution: {integrity: sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==} engines: {node: '>=6.9.0'} @@ -894,6 +1219,17 @@ packages: - supports-color dev: true + /@babel/helpers/7.16.0: + resolution: {integrity: sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight/7.10.4: resolution: {integrity: sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==} dependencies: @@ -919,21 +1255,44 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/highlight/7.16.0: + resolution: {integrity: sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.15.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser/7.15.3: resolution: {integrity: sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==} engines: {node: '>=6.0.0'} hasBin: true dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.14.5: - resolution: {integrity: sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==} + /@babel/parser/7.16.2: + resolution: {integrity: sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==} + engines: {node: '>=6.0.0'} + hasBin: true + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.2: + resolution: {integrity: sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.13.0 + '@babel/core': ^7.0.0 dependencies: '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.14.5 - '@babel/plugin-proposal-optional-chaining': 7.14.5 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.2_@babel+core@7.16.0: + resolution: {integrity: sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.14.5_@babel+core@7.13.16: @@ -960,17 +1319,27 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.14.5_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-async-generator-functions/7.14.9: - resolution: {integrity: sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.0: + resolution: {integrity: sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.13.0 dependencies: '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-remap-async-to-generator': 7.14.5 - '@babel/plugin-syntax-async-generators': 7.8.4 - transitivePeerDependencies: - - supports-color + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-async-generator-functions/7.14.9_@babel+core@7.13.16: @@ -1001,14 +1370,29 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.14.5: - resolution: {integrity: sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==} + /@babel/plugin-proposal-async-generator-functions/7.16.0: + resolution: {integrity: sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-class-features-plugin': 7.15.0 '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-remap-async-to-generator': 7.16.0 + '@babel/plugin-syntax-async-generators': 7.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-remap-async-to-generator': 7.16.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.0 transitivePeerDependencies: - supports-color dev: true @@ -1039,15 +1423,27 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.14.5: - resolution: {integrity: sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==} + /@babel/plugin-proposal-class-properties/7.16.0: + resolution: {integrity: sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.12.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-class-features-plugin': 7.15.0 + '@babel/helper-create-class-features-plugin': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-class-static-block': 7.14.5 transitivePeerDependencies: - supports-color dev: true @@ -1080,6 +1476,33 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-static-block/7.16.0: + resolution: {integrity: sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/helper-create-class-features-plugin': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-class-static-block': 7.14.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-decorators/7.14.5_@babel+core@7.15.0: resolution: {integrity: sha512-LYz5nvQcvYeRVjui1Ykn28i+3aUiXwQ/3MGoEy0InTaz1pJo/lAzmIDXX+BQny/oufgHzJ6vnEEiXQ8KZjEVFg==} engines: {node: '>=6.9.0'} @@ -1094,14 +1517,18 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.14.5: - resolution: {integrity: sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==} + /@babel/plugin-proposal-decorators/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-ttvhKuVnQwoNQrcTd1oe6o49ahaZ1kns1fsJKzTVOaS/FJDJoK4qzgVS68xzJhYUMgTnbXW6z/T6rlP3lL7tJw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3 + '@babel/plugin-syntax-decorators': 7.16.0_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/plugin-proposal-dynamic-import/7.14.5_@babel+core@7.13.16: @@ -1126,6 +1553,27 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.15.0 dev: true + /@babel/plugin-proposal-dynamic-import/7.16.0: + resolution: {integrity: sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3 + dev: true + + /@babel/plugin-proposal-dynamic-import/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + dev: true + /@babel/plugin-proposal-export-default-from/7.14.5_@babel+core@7.15.0: resolution: {integrity: sha512-T8KZ5abXvKMjF6JcoXjgac3ElmXf0AWzJwi2O/42Jk+HmCky3D9+i1B7NPP1FblyceqTevKeV/9szeikFoaMDg==} engines: {node: '>=6.9.0'} @@ -1137,14 +1585,15 @@ packages: '@babel/plugin-syntax-export-default-from': 7.14.5_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-export-namespace-from/7.14.5: - resolution: {integrity: sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==} + /@babel/plugin-proposal-export-default-from/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-kFAhaIbh5qbBwETRNa/cgGmPJ/BicXhIyrZhAkyYhf/Z9LXCTRGO1mvUwczto0Hl1q4YtzP9cRtTKT4wujm38Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3 + '@babel/plugin-syntax-export-default-from': 7.16.0_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-export-namespace-from/7.14.5_@babel+core@7.13.16: @@ -1169,14 +1618,25 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-json-strings/7.14.5: - resolution: {integrity: sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==} + /@babel/plugin-proposal-export-namespace-from/7.16.0: + resolution: {integrity: sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-json-strings': 7.8.3 + '@babel/plugin-syntax-export-namespace-from': 7.8.3 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-json-strings/7.14.5_@babel+core@7.13.16: @@ -1201,14 +1661,25 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.14.5: - resolution: {integrity: sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==} + /@babel/plugin-proposal-json-strings/7.16.0: + resolution: {integrity: sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4 + '@babel/plugin-syntax-json-strings': 7.8.3 + dev: true + + /@babel/plugin-proposal-json-strings/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-logical-assignment-operators/7.14.5_@babel+core@7.13.16: @@ -1233,14 +1704,25 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.14.5: - resolution: {integrity: sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==} + /@babel/plugin-proposal-logical-assignment-operators/7.16.0: + resolution: {integrity: sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-nullish-coalescing-operator/7.14.5_@babel+core@7.13.16: @@ -1265,14 +1747,25 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-numeric-separator/7.14.5: - resolution: {integrity: sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==} + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.0: + resolution: {integrity: sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-numeric-separator/7.14.5_@babel+core@7.13.16: @@ -1297,28 +1790,36 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: - resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} + /@babel/plugin-proposal-numeric-separator/7.16.0: + resolution: {integrity: sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.10.4 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.14.5_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4 dev: true - /@babel/plugin-proposal-object-rest-spread/7.14.7: - resolution: {integrity: sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==} + /@babel/plugin-proposal-numeric-separator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.15.0 - '@babel/helper-compilation-targets': 7.15.0 + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3 - '@babel/plugin-transform-parameters': 7.14.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.0 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: + resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.10.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.16.0_@babel+core@7.12.9 dev: true /@babel/plugin-proposal-object-rest-spread/7.14.7_@babel+core@7.13.16: @@ -1349,14 +1850,31 @@ packages: '@babel/plugin-transform-parameters': 7.14.5_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-optional-catch-binding/7.14.5: - resolution: {integrity: sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==} + /@babel/plugin-proposal-object-rest-spread/7.16.0: + resolution: {integrity: sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/compat-data': 7.16.0 + '@babel/helper-compilation-targets': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3 + '@babel/plugin-transform-parameters': 7.16.0 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.16.0 + '@babel/core': 7.16.0 + '@babel/helper-compilation-targets': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-transform-parameters': 7.16.0_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-optional-catch-binding/7.14.5_@babel+core@7.13.16: @@ -1381,15 +1899,25 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-optional-chaining/7.14.5: - resolution: {integrity: sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==} + /@babel/plugin-proposal-optional-catch-binding/7.16.0: + resolution: {integrity: sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.14.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-optional-chaining/7.14.5_@babel+core@7.13.16: @@ -1416,16 +1944,27 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.15.0 dev: true - /@babel/plugin-proposal-private-methods/7.14.5: - resolution: {integrity: sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==} + /@babel/plugin-proposal-optional-chaining/7.16.0: + resolution: {integrity: sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-class-features-plugin': 7.15.0 '@babel/helper-plugin-utils': 7.14.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.0 dev: true /@babel/plugin-proposal-private-methods/7.14.5_@babel+core@7.13.16: @@ -1454,16 +1993,27 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.14.5: - resolution: {integrity: sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==} + /@babel/plugin-proposal-private-methods/7.16.0: + resolution: {integrity: sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-annotate-as-pure': 7.14.5 - '@babel/helper-create-class-features-plugin': 7.15.0 + '@babel/helper-create-class-features-plugin': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-methods/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5 transitivePeerDependencies: - supports-color dev: true @@ -1498,14 +2048,33 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.14.5: - resolution: {integrity: sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==} - engines: {node: '>=4'} + /@babel/plugin-proposal-private-property-in-object/7.16.0: + resolution: {integrity: sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.14.5 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/plugin-proposal-unicode-property-regex/7.14.5_@babel+core@7.13.16: @@ -1530,6 +2099,27 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-proposal-unicode-property-regex/7.16.0: + resolution: {integrity: sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-create-regexp-features-plugin': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-async-generators/7.8.4: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -1556,6 +2146,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.16.0: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.15.0: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -1565,6 +2164,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-class-properties/7.12.13: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -1591,6 +2199,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.16.0: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-class-static-block/7.14.5: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -1620,6 +2237,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.16.0: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-decorators/7.14.5_@babel+core@7.15.0: resolution: {integrity: sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==} engines: {node: '>=6.9.0'} @@ -1630,6 +2257,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-decorators/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-dynamic-import/7.8.3: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -1656,6 +2293,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-export-default-from/7.14.5_@babel+core@7.15.0: resolution: {integrity: sha512-snWDxjuaPEobRBnhpqEfZ8RMxDbHt8+87fiEioGuE+Uc0xAKgSD8QiuL3lF93hPVQfZFAcYwrrf+H5qUhike3Q==} engines: {node: '>=6.9.0'} @@ -1666,6 +2312,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-export-default-from/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-xllLOdBj77mFSw8s02I+2SSQGHOftbWTlGmagheuNk/gjQsk7IrYsR/EosXVAVpgIUFffLckB/iPRioQYLHSrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-export-namespace-from/7.8.3: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -1692,6 +2348,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.15.0: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -1701,6 +2366,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.16.0: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-json-strings/7.8.3: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -1727,21 +2401,21 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: - resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.12.9 + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-jsx/7.14.5: - resolution: {integrity: sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: + resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -1765,6 +2439,25 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-jsx/7.16.0: + resolution: {integrity: sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-syntax-jsx/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-logical-assignment-operators/7.10.4: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -1791,6 +2484,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.16.0: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -1817,6 +2519,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-numeric-separator/7.10.4: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -1843,6 +2554,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.16.0: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-object-rest-spread/7.8.3: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -1878,6 +2598,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-optional-catch-binding/7.8.3: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -1904,6 +2633,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-optional-chaining/7.8.3: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -1930,6 +2668,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-private-property-in-object/7.14.5: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -1959,6 +2706,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.16.0: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-top-level-await/7.14.5: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -1988,6 +2745,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.16.0: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-typescript/7.14.5_@babel+core@7.13.16: resolution: {integrity: sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==} engines: {node: '>=6.9.0'} @@ -2008,12 +2775,13 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-arrow-functions/7.14.5: - resolution: {integrity: sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==} + /@babel/plugin-syntax-typescript/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -2037,17 +2805,23 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-async-to-generator/7.14.5: - resolution: {integrity: sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==} + /@babel/plugin-transform-arrow-functions/7.16.0: + resolution: {integrity: sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-module-imports': 7.14.5 '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-remap-async-to-generator': 7.14.5 - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-transform-arrow-functions/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true /@babel/plugin-transform-async-to-generator/7.14.5_@babel+core@7.13.16: @@ -2078,13 +2852,31 @@ packages: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.14.5: - resolution: {integrity: sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==} + /@babel/plugin-transform-async-to-generator/7.16.0: + resolution: {integrity: sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/helper-module-imports': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-remap-async-to-generator': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-remap-async-to-generator': 7.16.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/plugin-transform-block-scoped-functions/7.14.5_@babel+core@7.13.16: @@ -2107,8 +2899,8 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-block-scoping/7.15.3: - resolution: {integrity: sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==} + /@babel/plugin-transform-block-scoped-functions/7.16.0: + resolution: {integrity: sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2116,6 +2908,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-block-scoped-functions/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-transform-block-scoping/7.15.3_@babel+core@7.13.16: resolution: {integrity: sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==} engines: {node: '>=6.9.0'} @@ -2136,21 +2938,23 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-classes/7.14.9: - resolution: {integrity: sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==} + /@babel/plugin-transform-block-scoping/7.16.0: + resolution: {integrity: sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-annotate-as-pure': 7.14.5 - '@babel/helper-function-name': 7.14.5 - '@babel/helper-optimise-call-expression': 7.14.5 '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-replace-supers': 7.15.0 - '@babel/helper-split-export-declaration': 7.14.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-transform-block-scoping/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true /@babel/plugin-transform-classes/7.14.9_@babel+core@7.13.16: @@ -2189,13 +2993,39 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.14.5: - resolution: {integrity: sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==} + /@babel/plugin-transform-classes/7.16.0: + resolution: {integrity: sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/plugin-transform-computed-properties/7.14.5_@babel+core@7.13.16: @@ -2218,8 +3048,8 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-destructuring/7.14.7: - resolution: {integrity: sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==} + /@babel/plugin-transform-computed-properties/7.16.0: + resolution: {integrity: sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2227,6 +3057,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-computed-properties/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-transform-destructuring/7.14.7_@babel+core@7.13.16: resolution: {integrity: sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==} engines: {node: '>=6.9.0'} @@ -2247,13 +3087,22 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-dotall-regex/7.14.5: - resolution: {integrity: sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==} + /@babel/plugin-transform-destructuring/7.16.0: + resolution: {integrity: sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.14.5 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-destructuring/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -2279,12 +3128,24 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-duplicate-keys/7.14.5: - resolution: {integrity: sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==} + /@babel/plugin-transform-dotall-regex/7.16.0: + resolution: {integrity: sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/helper-create-regexp-features-plugin': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-dotall-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -2308,13 +3169,22 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-exponentiation-operator/7.14.5: - resolution: {integrity: sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==} + /@babel/plugin-transform-duplicate-keys/7.16.0: + resolution: {integrity: sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-builder-binary-assignment-operator-visitor': 7.14.5 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -2340,12 +3210,24 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-for-of/7.14.5: - resolution: {integrity: sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==} + /@babel/plugin-transform-exponentiation-operator/7.16.0: + resolution: {integrity: sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -2369,13 +3251,22 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-function-name/7.14.5: - resolution: {integrity: sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==} + /@babel/plugin-transform-for-of/7.16.0: + resolution: {integrity: sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-function-name': 7.14.5 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-for-of/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -2401,12 +3292,24 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-literals/7.14.5: - resolution: {integrity: sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==} + /@babel/plugin-transform-function-name/7.16.0: + resolution: {integrity: sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-function-name': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-function-name/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 + '@babel/helper-function-name': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -2430,8 +3333,8 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-member-expression-literals/7.14.5: - resolution: {integrity: sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==} + /@babel/plugin-transform-literals/7.16.0: + resolution: {integrity: sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2439,6 +3342,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-literals/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-transform-member-expression-literals/7.14.5_@babel+core@7.13.16: resolution: {integrity: sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==} engines: {node: '>=6.9.0'} @@ -2459,17 +3372,23 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-modules-amd/7.14.5: - resolution: {integrity: sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==} + /@babel/plugin-transform-member-expression-literals/7.16.0: + resolution: {integrity: sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-module-transforms': 7.15.0 '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color + dev: true + + /@babel/plugin-transform-member-expression-literals/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true /@babel/plugin-transform-modules-amd/7.14.5_@babel+core@7.13.16: @@ -2500,15 +3419,28 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.15.0: - resolution: {integrity: sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==} + /@babel/plugin-transform-modules-amd/7.16.0: + resolution: {integrity: sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-module-transforms': 7.15.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-amd/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-simple-access': 7.14.8 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color @@ -2544,16 +3476,30 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.14.5: - resolution: {integrity: sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==} + /@babel/plugin-transform-modules-commonjs/7.16.0: + resolution: {integrity: sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-hoist-variables': 7.14.5 - '@babel/helper-module-transforms': 7.15.0 + '@babel/helper-module-transforms': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-validator-identifier': 7.14.9 + '@babel/helper-simple-access': 7.16.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-simple-access': 7.16.0 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color @@ -2591,14 +3537,33 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.14.5: - resolution: {integrity: sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==} + /@babel/plugin-transform-modules-systemjs/7.16.0: + resolution: {integrity: sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-module-transforms': 7.15.0 + '@babel/helper-hoist-variables': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-validator-identifier': 7.15.7 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-hoist-variables': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-validator-identifier': 7.15.7 + babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color dev: true @@ -2629,13 +3594,29 @@ packages: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.14.9: - resolution: {integrity: sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==} + /@babel/plugin-transform-modules-umd/7.16.0: + resolution: {integrity: sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.14.5 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + transitivePeerDependencies: + - supports-color dev: true /@babel/plugin-transform-named-capturing-groups-regex/7.14.9_@babel+core@7.13.16: @@ -2658,13 +3639,23 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.14.5_@babel+core@7.15.0 dev: true - /@babel/plugin-transform-new-target/7.14.5: - resolution: {integrity: sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==} + /@babel/plugin-transform-named-capturing-groups-regex/7.16.0: + resolution: {integrity: sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: - '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-create-regexp-features-plugin': 7.16.0 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.0 dev: true /@babel/plugin-transform-new-target/7.14.5_@babel+core@7.13.16: @@ -2687,6 +3678,25 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-new-target/7.16.0: + resolution: {integrity: sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-new-target/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-transform-object-assign/7.14.5_@babel+core@7.15.0: resolution: {integrity: sha512-lvhjk4UN9xJJYB1mI5KC0/o1D5EcJXdbhVe+4fSk08D6ZN+iuAIs7LJC+71h8av9Ew4+uRq9452v9R93SFmQlQ==} engines: {node: '>=6.9.0'} @@ -2697,16 +3707,14 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-object-super/7.14.5: - resolution: {integrity: sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==} + /@babel/plugin-transform-object-assign/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-TftKY6Hxo5Uf/EIoC3BKQyLvlH46tbtK4xub90vzi9+yS8z1+O/52YHyywCZvYeLPOvv//1j3BPokLuHTWPcbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-replace-supers': 7.15.0 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-object-super/7.14.5_@babel+core@7.13.16: @@ -2735,23 +3743,29 @@ packages: - supports-color dev: true - /@babel/plugin-transform-parameters/7.14.5: - resolution: {integrity: sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==} + /@babel/plugin-transform-object-super/7.16.0: + resolution: {integrity: sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-replace-supers': 7.16.0 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-parameters/7.14.5_@babel+core@7.12.9: - resolution: {integrity: sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==} + /@babel/plugin-transform-object-super/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.12.9 + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-replace-supers': 7.16.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/plugin-transform-parameters/7.14.5_@babel+core@7.13.16: @@ -2774,12 +3788,32 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-property-literals/7.14.5: - resolution: {integrity: sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==} + /@babel/plugin-transform-parameters/7.16.0: + resolution: {integrity: sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-parameters/7.16.0_@babel+core@7.12.9: + resolution: {integrity: sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-parameters/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -2803,6 +3837,25 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-property-literals/7.16.0: + resolution: {integrity: sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-property-literals/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-transform-react-display-name/7.15.1_@babel+core@7.15.0: resolution: {integrity: sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==} engines: {node: '>=6.9.0'} @@ -2813,6 +3866,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-react-display-name/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-transform-react-jsx-development/7.14.5_@babel+core@7.15.0: resolution: {integrity: sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==} engines: {node: '>=6.9.0'} @@ -2823,27 +3886,24 @@ packages: '@babel/plugin-transform-react-jsx': 7.14.9_@babel+core@7.15.0 dev: true - /@babel/plugin-transform-react-jsx-source/7.14.5_@babel+core@7.13.16: - resolution: {integrity: sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==} + /@babel/plugin-transform-react-jsx-development/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.14.5 + '@babel/core': 7.16.0 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 dev: true - /@babel/plugin-transform-react-jsx/7.14.9: - resolution: {integrity: sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==} + /@babel/plugin-transform-react-jsx-source/7.14.5_@babel+core@7.13.16: + resolution: {integrity: sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-annotate-as-pure': 7.14.5 - '@babel/helper-module-imports': 7.14.5 + '@babel/core': 7.13.16 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-jsx': 7.14.5 - '@babel/types': 7.15.0 dev: true /@babel/plugin-transform-react-jsx/7.14.9_@babel+core@7.13.16: @@ -2874,6 +3934,33 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/plugin-transform-react-jsx/7.16.0: + resolution: {integrity: sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-jsx': 7.16.0 + '@babel/types': 7.16.0 + dev: true + + /@babel/plugin-transform-react-jsx/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/types': 7.16.0 + dev: true + /@babel/plugin-transform-react-pure-annotations/7.14.5_@babel+core@7.15.0: resolution: {integrity: sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==} engines: {node: '>=6.9.0'} @@ -2885,13 +3972,15 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-regenerator/7.14.5: - resolution: {integrity: sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==} + /@babel/plugin-transform-react-pure-annotations/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - regenerator-transform: 0.14.5 + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true /@babel/plugin-transform-regenerator/7.14.5_@babel+core@7.13.16: @@ -2914,13 +4003,23 @@ packages: regenerator-transform: 0.14.5 dev: true - /@babel/plugin-transform-reserved-words/7.14.5: - resolution: {integrity: sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==} + /@babel/plugin-transform-regenerator/7.16.0: + resolution: {integrity: sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-plugin-utils': 7.14.5 + regenerator-transform: 0.14.5 + dev: true + + /@babel/plugin-transform-regenerator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + regenerator-transform: 0.14.5 dev: true /@babel/plugin-transform-reserved-words/7.14.5_@babel+core@7.13.16: @@ -2943,31 +4042,41 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-runtime/7.15.0: - resolution: {integrity: sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==} + /@babel/plugin-transform-reserved-words/7.16.0: + resolution: {integrity: sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-module-imports': 7.14.5 '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-polyfill-corejs2: 0.2.2 - babel-plugin-polyfill-corejs3: 0.2.4 - babel-plugin-polyfill-regenerator: 0.2.2 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-shorthand-properties/7.14.5: - resolution: {integrity: sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==} + /@babel/plugin-transform-reserved-words/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-runtime/7.16.0: + resolution: {integrity: sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + babel-plugin-polyfill-corejs2: 0.2.3 + babel-plugin-polyfill-corejs3: 0.3.0 + babel-plugin-polyfill-regenerator: 0.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-shorthand-properties/7.14.5_@babel+core@7.13.16: resolution: {integrity: sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==} engines: {node: '>=6.9.0'} @@ -2988,14 +4097,23 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-spread/7.14.6: - resolution: {integrity: sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==} + /@babel/plugin-transform-shorthand-properties/7.16.0: + resolution: {integrity: sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.14.5 + dev: true + + /@babel/plugin-transform-shorthand-properties/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true /@babel/plugin-transform-spread/7.14.6_@babel+core@7.13.16: @@ -3020,13 +4138,25 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.14.5 dev: true - /@babel/plugin-transform-sticky-regex/7.14.5: - resolution: {integrity: sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==} + /@babel/plugin-transform-spread/7.16.0: + resolution: {integrity: sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + dev: true + + /@babel/plugin-transform-spread/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 dev: true /@babel/plugin-transform-sticky-regex/7.14.5_@babel+core@7.13.16: @@ -3049,12 +4179,22 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-template-literals/7.14.5: - resolution: {integrity: sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==} + /@babel/plugin-transform-sticky-regex/7.16.0: + resolution: {integrity: sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-sticky-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -3078,8 +4218,8 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-typeof-symbol/7.14.5: - resolution: {integrity: sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==} + /@babel/plugin-transform-template-literals/7.16.0: + resolution: {integrity: sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3087,6 +4227,16 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-template-literals/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-transform-typeof-symbol/7.14.5_@babel+core@7.13.16: resolution: {integrity: sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==} engines: {node: '>=6.9.0'} @@ -3107,6 +4257,25 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true + /@babel/plugin-transform-typeof-symbol/7.16.0: + resolution: {integrity: sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-transform-typescript/7.15.0_@babel+core@7.13.16: resolution: {integrity: sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==} engines: {node: '>=6.9.0'} @@ -3135,13 +4304,18 @@ packages: - supports-color dev: true - /@babel/plugin-transform-unicode-escapes/7.14.5: - resolution: {integrity: sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==} + /@babel/plugin-transform-typescript/7.16.1_@babel+core@7.16.0: + resolution: {integrity: sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-typescript': 7.16.0_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/plugin-transform-unicode-escapes/7.14.5_@babel+core@7.13.16: @@ -3164,13 +4338,22 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-unicode-regex/7.14.5: - resolution: {integrity: sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==} + /@babel/plugin-transform-unicode-escapes/7.16.0: + resolution: {integrity: sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.14.5 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 dev: true @@ -3196,87 +4379,25 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/preset-env/7.15.0: - resolution: {integrity: sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==} + /@babel/plugin-transform-unicode-regex/7.16.0: + resolution: {integrity: sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.15.0 - '@babel/helper-compilation-targets': 7.15.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-unicode-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/helper-validator-option': 7.14.5 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.14.5 - '@babel/plugin-proposal-async-generator-functions': 7.14.9 - '@babel/plugin-proposal-class-properties': 7.14.5 - '@babel/plugin-proposal-class-static-block': 7.14.5 - '@babel/plugin-proposal-dynamic-import': 7.14.5 - '@babel/plugin-proposal-export-namespace-from': 7.14.5 - '@babel/plugin-proposal-json-strings': 7.14.5 - '@babel/plugin-proposal-logical-assignment-operators': 7.14.5 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.14.5 - '@babel/plugin-proposal-numeric-separator': 7.14.5 - '@babel/plugin-proposal-object-rest-spread': 7.14.7 - '@babel/plugin-proposal-optional-catch-binding': 7.14.5 - '@babel/plugin-proposal-optional-chaining': 7.14.5 - '@babel/plugin-proposal-private-methods': 7.14.5 - '@babel/plugin-proposal-private-property-in-object': 7.14.5 - '@babel/plugin-proposal-unicode-property-regex': 7.14.5 - '@babel/plugin-syntax-async-generators': 7.8.4 - '@babel/plugin-syntax-class-properties': 7.12.13 - '@babel/plugin-syntax-class-static-block': 7.14.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3 - '@babel/plugin-syntax-export-namespace-from': 7.8.3 - '@babel/plugin-syntax-json-strings': 7.8.3 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 - '@babel/plugin-syntax-numeric-separator': 7.10.4 - '@babel/plugin-syntax-object-rest-spread': 7.8.3 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3 - '@babel/plugin-syntax-optional-chaining': 7.8.3 - '@babel/plugin-syntax-private-property-in-object': 7.14.5 - '@babel/plugin-syntax-top-level-await': 7.14.5 - '@babel/plugin-transform-arrow-functions': 7.14.5 - '@babel/plugin-transform-async-to-generator': 7.14.5 - '@babel/plugin-transform-block-scoped-functions': 7.14.5 - '@babel/plugin-transform-block-scoping': 7.15.3 - '@babel/plugin-transform-classes': 7.14.9 - '@babel/plugin-transform-computed-properties': 7.14.5 - '@babel/plugin-transform-destructuring': 7.14.7 - '@babel/plugin-transform-dotall-regex': 7.14.5 - '@babel/plugin-transform-duplicate-keys': 7.14.5 - '@babel/plugin-transform-exponentiation-operator': 7.14.5 - '@babel/plugin-transform-for-of': 7.14.5 - '@babel/plugin-transform-function-name': 7.14.5 - '@babel/plugin-transform-literals': 7.14.5 - '@babel/plugin-transform-member-expression-literals': 7.14.5 - '@babel/plugin-transform-modules-amd': 7.14.5 - '@babel/plugin-transform-modules-commonjs': 7.15.0 - '@babel/plugin-transform-modules-systemjs': 7.14.5 - '@babel/plugin-transform-modules-umd': 7.14.5 - '@babel/plugin-transform-named-capturing-groups-regex': 7.14.9 - '@babel/plugin-transform-new-target': 7.14.5 - '@babel/plugin-transform-object-super': 7.14.5 - '@babel/plugin-transform-parameters': 7.14.5 - '@babel/plugin-transform-property-literals': 7.14.5 - '@babel/plugin-transform-regenerator': 7.14.5 - '@babel/plugin-transform-reserved-words': 7.14.5 - '@babel/plugin-transform-shorthand-properties': 7.14.5 - '@babel/plugin-transform-spread': 7.14.6 - '@babel/plugin-transform-sticky-regex': 7.14.5 - '@babel/plugin-transform-template-literals': 7.14.5 - '@babel/plugin-transform-typeof-symbol': 7.14.5 - '@babel/plugin-transform-unicode-escapes': 7.14.5 - '@babel/plugin-transform-unicode-regex': 7.14.5 - '@babel/preset-modules': 0.1.4 - '@babel/types': 7.15.0 - babel-plugin-polyfill-corejs2: 0.2.2 - babel-plugin-polyfill-corejs3: 0.2.4 - babel-plugin-polyfill-regenerator: 0.2.2 - core-js-compat: 3.16.2 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color dev: true /@babel/preset-env/7.15.0_@babel+core@7.13.16: @@ -3447,16 +4568,173 @@ packages: - supports-color dev: true - /@babel/preset-modules/0.1.4: - resolution: {integrity: sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==} + /@babel/preset-env/7.16.0: + resolution: {integrity: sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/compat-data': 7.16.0 + '@babel/helper-compilation-targets': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-proposal-unicode-property-regex': 7.14.5 - '@babel/plugin-transform-dotall-regex': 7.14.5 - '@babel/types': 7.15.0 - esutils: 2.0.3 + '@babel/helper-validator-option': 7.14.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.2 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.0 + '@babel/plugin-proposal-async-generator-functions': 7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0 + '@babel/plugin-proposal-class-static-block': 7.16.0 + '@babel/plugin-proposal-dynamic-import': 7.16.0 + '@babel/plugin-proposal-export-namespace-from': 7.16.0 + '@babel/plugin-proposal-json-strings': 7.16.0 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.0 + '@babel/plugin-proposal-numeric-separator': 7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0 + '@babel/plugin-proposal-optional-catch-binding': 7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0 + '@babel/plugin-proposal-private-methods': 7.16.0 + '@babel/plugin-proposal-private-property-in-object': 7.16.0 + '@babel/plugin-proposal-unicode-property-regex': 7.16.0 + '@babel/plugin-syntax-async-generators': 7.8.4 + '@babel/plugin-syntax-class-properties': 7.12.13 + '@babel/plugin-syntax-class-static-block': 7.14.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3 + '@babel/plugin-syntax-export-namespace-from': 7.8.3 + '@babel/plugin-syntax-json-strings': 7.8.3 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 + '@babel/plugin-syntax-numeric-separator': 7.10.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3 + '@babel/plugin-syntax-private-property-in-object': 7.14.5 + '@babel/plugin-syntax-top-level-await': 7.14.5 + '@babel/plugin-transform-arrow-functions': 7.16.0 + '@babel/plugin-transform-async-to-generator': 7.16.0 + '@babel/plugin-transform-block-scoped-functions': 7.16.0 + '@babel/plugin-transform-block-scoping': 7.16.0 + '@babel/plugin-transform-classes': 7.16.0 + '@babel/plugin-transform-computed-properties': 7.16.0 + '@babel/plugin-transform-destructuring': 7.16.0 + '@babel/plugin-transform-dotall-regex': 7.16.0 + '@babel/plugin-transform-duplicate-keys': 7.16.0 + '@babel/plugin-transform-exponentiation-operator': 7.16.0 + '@babel/plugin-transform-for-of': 7.16.0 + '@babel/plugin-transform-function-name': 7.16.0 + '@babel/plugin-transform-literals': 7.16.0 + '@babel/plugin-transform-member-expression-literals': 7.16.0 + '@babel/plugin-transform-modules-amd': 7.16.0 + '@babel/plugin-transform-modules-commonjs': 7.16.0 + '@babel/plugin-transform-modules-systemjs': 7.16.0 + '@babel/plugin-transform-modules-umd': 7.16.0 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.0 + '@babel/plugin-transform-new-target': 7.16.0 + '@babel/plugin-transform-object-super': 7.16.0 + '@babel/plugin-transform-parameters': 7.16.0 + '@babel/plugin-transform-property-literals': 7.16.0 + '@babel/plugin-transform-regenerator': 7.16.0 + '@babel/plugin-transform-reserved-words': 7.16.0 + '@babel/plugin-transform-shorthand-properties': 7.16.0 + '@babel/plugin-transform-spread': 7.16.0 + '@babel/plugin-transform-sticky-regex': 7.16.0 + '@babel/plugin-transform-template-literals': 7.16.0 + '@babel/plugin-transform-typeof-symbol': 7.16.0 + '@babel/plugin-transform-unicode-escapes': 7.16.0 + '@babel/plugin-transform-unicode-regex': 7.16.0 + '@babel/preset-modules': 0.1.5 + '@babel/types': 7.16.0 + babel-plugin-polyfill-corejs2: 0.2.3 + babel-plugin-polyfill-corejs3: 0.3.0 + babel-plugin-polyfill-regenerator: 0.2.3 + core-js-compat: 3.19.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-env/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.16.0 + '@babel/core': 7.16.0 + '@babel/helper-compilation-targets': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-validator-option': 7.14.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.2_@babel+core@7.16.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-async-generator-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-class-static-block': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-dynamic-import': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-export-namespace-from': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-json-strings': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-numeric-separator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-catch-binding': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-private-methods': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-private-property-in-object': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-unicode-property-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.0 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.0 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.0 + '@babel/plugin-transform-arrow-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-async-to-generator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-block-scoped-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-block-scoping': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-classes': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-computed-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-destructuring': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-dotall-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-duplicate-keys': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-exponentiation-operator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-for-of': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-function-name': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-literals': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-member-expression-literals': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-modules-amd': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-modules-commonjs': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-modules-systemjs': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-modules-umd': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-new-target': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-object-super': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-parameters': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-property-literals': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-regenerator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-reserved-words': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-shorthand-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-sticky-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-template-literals': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-typeof-symbol': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-unicode-escapes': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-unicode-regex': 7.16.0_@babel+core@7.16.0 + '@babel/preset-modules': 0.1.5_@babel+core@7.16.0 + '@babel/types': 7.16.0 + babel-plugin-polyfill-corejs2: 0.2.3_@babel+core@7.16.0 + babel-plugin-polyfill-corejs3: 0.3.0_@babel+core@7.16.0 + babel-plugin-polyfill-regenerator: 0.2.3_@babel+core@7.16.0 + core-js-compat: 3.19.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/preset-modules/0.1.4_@babel+core@7.13.16: @@ -3485,6 +4763,31 @@ packages: esutils: 2.0.3 dev: true + /@babel/preset-modules/0.1.5: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-proposal-unicode-property-regex': 7.16.0 + '@babel/plugin-transform-dotall-regex': 7.16.0 + '@babel/types': 7.16.0 + esutils: 2.0.3 + dev: true + + /@babel/preset-modules/0.1.5_@babel+core@7.16.0: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-proposal-unicode-property-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-dotall-regex': 7.16.0_@babel+core@7.16.0 + '@babel/types': 7.16.0 + esutils: 2.0.3 + dev: true + /@babel/preset-react/7.14.5_@babel+core@7.15.0: resolution: {integrity: sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==} engines: {node: '>=6.9.0'} @@ -3500,6 +4803,21 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.14.5_@babel+core@7.15.0 dev: true + /@babel/preset-react/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-validator-option': 7.14.5 + '@babel/plugin-transform-react-display-name': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-react-jsx-development': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-react-pure-annotations': 7.16.0_@babel+core@7.16.0 + dev: true + /@babel/preset-typescript/7.15.0_@babel+core@7.13.16: resolution: {integrity: sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==} engines: {node: '>=6.9.0'} @@ -3528,6 +4846,20 @@ packages: - supports-color dev: true + /@babel/preset-typescript/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-validator-option': 7.14.5 + '@babel/plugin-transform-typescript': 7.16.1_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/register/7.15.3_@babel+core@7.15.0: resolution: {integrity: sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw==} engines: {node: '>=6.9.0'} @@ -3542,6 +4874,20 @@ packages: source-map-support: 0.5.19 dev: true + /@babel/register/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-lzl4yfs0zVXnooeLE0AAfYaT7F3SPA8yB2Bj4W1BiZwLbMS3MZH35ZvCWSRHvneUugwuM+Wsnrj7h0F7UmU3NQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.1 + source-map-support: 0.5.20 + dev: true + /@babel/runtime-corejs3/7.15.3: resolution: {integrity: sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A==} engines: {node: '>=6.9.0'} @@ -3562,6 +4908,13 @@ packages: dependencies: regenerator-runtime: 0.13.9 + /@babel/runtime/7.16.0: + resolution: {integrity: sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.9 + dev: true + /@babel/template/7.14.5: resolution: {integrity: sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==} engines: {node: '>=6.9.0'} @@ -3571,6 +4924,15 @@ packages: '@babel/types': 7.15.0 dev: true + /@babel/template/7.16.0: + resolution: {integrity: sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/types': 7.16.0 + dev: true + /@babel/traverse/7.15.0: resolution: {integrity: sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==} engines: {node: '>=6.9.0'} @@ -3588,6 +4950,23 @@ packages: - supports-color dev: true + /@babel/traverse/7.16.0: + resolution: {integrity: sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-hoist-variables': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/types': 7.16.0 + debug: 4.3.2 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types/7.15.0: resolution: {integrity: sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==} engines: {node: '>=6.9.0'} @@ -3596,10 +4975,22 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types/7.16.0: + resolution: {integrity: sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.15.7 + to-fast-properties: 2.0.0 + dev: true + /@base2/pretty-print-object/1.0.0: resolution: {integrity: sha512-4Th98KlMHr5+JkxfcoDT//6vY8vM+iSPrLNpHhRyLx2CFYi8e2RfqPLdpbnpo0Q5lQC5hNB79yes07zb02fvCw==} dev: true + /@base2/pretty-print-object/1.0.1: + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + dev: true + /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -3624,6 +5015,11 @@ packages: resolution: {integrity: sha512-ooImbeXEBxf77cttbzA7X5rC5aAWm9UsXIGViFOnsqB+6M944GkB28S5R4UWRqjFd2iW4zGEkEifAU+q43pt2w==} dev: true + /@discoveryjs/json-ext/0.5.5: + resolution: {integrity: sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==} + engines: {node: '>=10.0.0'} + dev: true + /@emotion/cache/10.0.29: resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} dependencies: @@ -3638,7 +5034,7 @@ packages: peerDependencies: react: '>=16.3.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 '@emotion/cache': 10.0.29 '@emotion/css': 10.0.27 '@emotion/serialize': 0.11.16 @@ -3651,7 +5047,7 @@ packages: peerDependencies: react: '>=16.3.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 '@emotion/cache': 10.0.29 '@emotion/css': 10.0.27 '@emotion/serialize': 0.11.16 @@ -3689,7 +5085,7 @@ packages: '@emotion/memoize': 0.7.4 '@emotion/unitless': 0.7.5 '@emotion/utils': 0.11.3 - csstype: 2.6.17 + csstype: 2.6.18 dev: true /@emotion/sheet/0.9.4: @@ -3702,7 +5098,7 @@ packages: '@emotion/core': ^10.0.28 react: '>=16.3.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 '@emotion/core': 10.1.1_react@16.14.0 '@emotion/is-prop-valid': 0.8.8 '@emotion/serialize': 0.11.16 @@ -3716,7 +5112,7 @@ packages: '@emotion/core': ^10.0.28 react: '>=16.3.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 '@emotion/core': 10.1.1 '@emotion/is-prop-valid': 0.8.8 '@emotion/serialize': 0.11.16 @@ -3780,6 +5176,42 @@ packages: - supports-color dev: true + /@eslint/eslintrc/1.0.3: + resolution: {integrity: sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.2 + espree: 9.0.0 + globals: 13.12.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.0.4 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@gar/promisify/1.1.2: + resolution: {integrity: sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==} + dev: true + + /@humanwhocodes/config-array/0.6.0: + resolution: {integrity: sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.2 + minimatch: 3.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -3825,6 +5257,18 @@ packages: slash: 3.0.0 dev: true + /@jest/console/27.3.1: + resolution: {integrity: sha512-RkFNWmv0iui+qsOr/29q9dyfKTTT5DCuP31kUwg7rmOKPT/ozLeGLKJKVIiOfbiKyleUZKIrHwhmiZWVe8IMdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + chalk: 4.1.2 + jest-message-util: 27.3.1 + jest-util: 27.3.1 + slash: 3.0.0 + dev: true + /@jest/core/26.6.3: resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} engines: {node: '>= 10.14.2'} @@ -3865,6 +5309,51 @@ packages: - utf-8-validate dev: true + /@jest/core/27.3.1: + resolution: {integrity: sha512-DMNE90RR5QKx0EA+wqe3/TNEwiRpOkhshKNxtLxd4rt3IZpCt+RSL+FoJsGeblRZmqdK4upHA/mKKGPPRAifhg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.3.1 + '@jest/reporters': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.8 + jest-changed-files: 27.3.0 + jest-config: 27.3.1 + jest-haste-map: 27.3.1 + jest-message-util: 27.3.1 + jest-regex-util: 27.0.6 + jest-resolve: 27.3.1 + jest-resolve-dependencies: 27.3.1 + jest-runner: 27.3.1 + jest-runtime: 27.3.1 + jest-snapshot: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 + jest-watcher: 27.3.1 + micromatch: 4.0.4 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /@jest/environment/26.6.2: resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} engines: {node: '>= 10.14.2'} @@ -3875,6 +5364,16 @@ packages: jest-mock: 26.6.2 dev: true + /@jest/environment/27.3.1: + resolution: {integrity: sha512-BCKCj4mOVLme6Tanoyc9k0ultp3pnmuyHw73UHRPeeZxirsU/7E3HC4le/VDb/SMzE1JcPnto+XBKFOcoiJzVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + jest-mock: 27.3.0 + dev: true + /@jest/fake-timers/26.6.2: resolution: {integrity: sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==} engines: {node: '>= 10.14.2'} @@ -3887,6 +5386,18 @@ packages: jest-util: 26.6.2 dev: true + /@jest/fake-timers/27.3.1: + resolution: {integrity: sha512-M3ZFgwwlqJtWZ+QkBG5NmC23A9w+A6ZxNsO5nJxJsKYt4yguBd3i8TpjQz5NfCX91nEve1KqD9RA2Q+Q1uWqoA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 16.11.6 + jest-message-util: 27.3.1 + jest-mock: 27.3.0 + jest-util: 27.3.1 + dev: true + /@jest/globals/26.6.2: resolution: {integrity: sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==} engines: {node: '>= 10.14.2'} @@ -3896,6 +5407,15 @@ packages: expect: 26.6.2 dev: true + /@jest/globals/27.3.1: + resolution: {integrity: sha512-Q651FWiWQAIFiN+zS51xqhdZ8g9b88nGCobC87argAxA7nMfNQq0Q0i9zTfQYgLa6qFXk2cGANEqfK051CZ8Pg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.3.1 + '@jest/types': 27.2.5 + expect: 27.3.1 + dev: true + /@jest/reporters/26.6.2: resolution: {integrity: sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==} engines: {node: '>= 10.14.2'} @@ -3930,6 +5450,44 @@ packages: - supports-color dev: true + /@jest/reporters/27.3.1: + resolution: {integrity: sha512-m2YxPmL9Qn1emFVgZGEiMwDntDxRRQ2D58tiDQlwYTg5GvbFOKseYCcHtn0WsI8CG4vzPglo3nqbOiT8ySBT/w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.0 + graceful-fs: 4.2.8 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.0.5 + jest-haste-map: 27.3.1 + jest-resolve: 27.3.1 + jest-util: 27.3.1 + jest-worker: 27.3.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/source-map/26.6.2: resolution: {integrity: sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==} engines: {node: '>= 10.14.2'} @@ -3939,6 +5497,15 @@ packages: source-map: 0.6.1 dev: true + /@jest/source-map/27.0.6: + resolution: {integrity: sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.8 + source-map: 0.6.1 + dev: true + /@jest/test-result/26.6.2: resolution: {integrity: sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==} engines: {node: '>= 10.14.2'} @@ -3959,6 +5526,16 @@ packages: collect-v8-coverage: 1.0.1 dev: true + /@jest/test-result/27.3.1: + resolution: {integrity: sha512-mLn6Thm+w2yl0opM8J/QnPTqrfS4FoXsXF2WIWJb2O/GBSyResL71BRuMYbYRsGt7ELwS5JGcEcGb52BNrumgg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.3.1 + '@jest/types': 27.2.5 + '@types/istanbul-lib-coverage': 2.0.3 + collect-v8-coverage: 1.0.1 + dev: true + /@jest/test-sequencer/26.6.3: resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} engines: {node: '>= 10.14.2'} @@ -3976,13 +5553,25 @@ packages: - utf-8-validate dev: true + /@jest/test-sequencer/27.3.1: + resolution: {integrity: sha512-siySLo07IMEdSjA4fqEnxfIX8lB/lWYsBPwNFtkOvsFQvmBrL3yj3k3uFNZv/JDyApTakRpxbKLJ3CT8UGVCrA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.3.1 + graceful-fs: 4.2.8 + jest-haste-map: 27.3.1 + jest-runtime: 27.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/transform/26.6.2: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/core': 7.15.0 + '@babel/core': 7.16.0 '@jest/types': 26.6.2 - babel-plugin-istanbul: 6.0.0 + babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 1.8.0 fast-json-stable-stringify: 2.1.0 @@ -3999,13 +5588,36 @@ packages: - supports-color dev: true + /@jest/transform/27.3.1: + resolution: {integrity: sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.16.0 + '@jest/types': 27.2.5 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.8.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.8 + jest-haste-map: 27.3.1 + jest-regex-util: 27.0.6 + jest-util: 27.3.1 + micromatch: 4.0.4 + pirates: 4.0.1 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/types/26.6.2: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} engines: {node: '>= 10.14.2'} dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 14.17.10 + '@types/node': 16.11.6 '@types/yargs': 15.0.14 chalk: 4.1.2 dev: true @@ -4021,36 +5633,47 @@ packages: chalk: 4.1.2 dev: true - /@linaria/babel-preset/3.0.0-beta.4_@babel+core@7.13.16: - resolution: {integrity: sha512-Bjsk4VZUQXK3u04MuLlyP/+/tDd7bWeLXYCOnq4US9H2QFRdka97fm6hH34SRinoHm9fSPCHrj9d+KtY8ge2wg==} + /@jest/types/27.2.5: + resolution: {integrity: sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.3 + '@types/istanbul-reports': 3.0.1 + '@types/node': 16.11.6 + '@types/yargs': 16.0.4 + chalk: 4.1.2 + dev: true + + /@linaria/babel-preset/3.0.0-beta.13: + resolution: {integrity: sha512-UeurIwmORp1lG+f69bKquRug7ZFVSrQha6TJWvHmGQIFwFx5qpMCXJLhOp2dUpM4y7/NhbKYXqj58RtG3wi4ZQ==} peerDependencies: '@babel/core': '>=7' dependencies: - '@babel/core': 7.13.16 - '@babel/generator': 7.15.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.13.16 - '@babel/template': 7.14.5 - '@linaria/core': 3.0.0-beta.4 + '@babel/generator': 7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3 + '@babel/template': 7.16.0 + '@linaria/core': 3.0.0-beta.13 '@linaria/logger': 3.0.0-beta.3 cosmiconfig: 5.2.1 - source-map: 0.6.1 + source-map: 0.7.3 stylis: 3.5.4 transitivePeerDependencies: - supports-color dev: true - /@linaria/babel-preset/3.0.0-beta.7: - resolution: {integrity: sha512-NE5f//T9ywXZA+W+Pw1YjWKdzskUpaV7GVkxXhkxLM2la1+S4xOoZR1rzW77bR1C9GFFwzZTeb8XP85whb2ZqQ==} + /@linaria/babel-preset/3.0.0-beta.4_@babel+core@7.13.16: + resolution: {integrity: sha512-Bjsk4VZUQXK3u04MuLlyP/+/tDd7bWeLXYCOnq4US9H2QFRdka97fm6hH34SRinoHm9fSPCHrj9d+KtY8ge2wg==} peerDependencies: '@babel/core': '>=7' dependencies: + '@babel/core': 7.13.16 '@babel/generator': 7.15.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.13.16 '@babel/template': 7.14.5 '@linaria/core': 3.0.0-beta.4 '@linaria/logger': 3.0.0-beta.3 cosmiconfig: 5.2.1 - source-map: 0.7.3 + source-map: 0.6.1 stylis: 3.5.4 transitivePeerDependencies: - supports-color @@ -4074,17 +5697,21 @@ packages: - supports-color dev: true + /@linaria/core/3.0.0-beta.13: + resolution: {integrity: sha512-3zEi5plBCOsEzUneRVuQb+2SAx3qaC1dj0FfFAI6zIJQoDWu0dlSwKijMRack7oO9tUWrchfj3OkKQAd1LBdVg==} + dev: true + /@linaria/core/3.0.0-beta.4: resolution: {integrity: sha512-NzxeMDxRt57nR6tLFZ8xIstp5ld9JQPIyp9+TKtQZhoX3oJuUru+S4vXPr1Gach6VaqKKKT5T6fmJgJl9MMprw==} dev: true - /@linaria/esbuild/3.0.0-beta.7: - resolution: {integrity: sha512-ImgwFz/dEe3ea3s4m3QiZV7ssEv8oQVgeMxju0FrkEDg02mWBS8tvU3WTJy0hjb9mUfR8fqJbOZSV33dTrtcww==} + /@linaria/esbuild/3.0.0-beta.13: + resolution: {integrity: sha512-sHG2KNSQ8G96YdY0WgR8nmB49GOvlCMHCFOg2qV5vRgRgF5BepKenZn5a0f7O2KY+J/sp8NnhGe5YO0bFUeQaQ==} peerDependencies: '@babel/core': '>=7' dependencies: - '@linaria/babel-preset': 3.0.0-beta.7 - esbuild: 0.12.21 + '@linaria/babel-preset': 3.0.0-beta.13 + esbuild: 0.12.29 transitivePeerDependencies: - supports-color dev: true @@ -4097,12 +5724,12 @@ packages: - supports-color dev: true - /@linaria/preeval/3.0.0-beta.7: - resolution: {integrity: sha512-fTFgxtjBGKh9P2rsqhBnHTqFo1d8VzznmXKpILM0ClAclVn+FB+KJl+nWyEbQ8nT9/ceRoTwbdZHZ/M3DFHG+w==} + /@linaria/preeval/3.0.0-beta.13: + resolution: {integrity: sha512-0tia6DHxJ9h3/9LWWxseZw8z2wuB0OHwakQrDFV138m3ym3LwHnRalk9VUpIESnnFOiATya20+drUSx0GRxq/Q==} peerDependencies: '@babel/core': '>=7' dependencies: - '@linaria/babel-preset': 3.0.0-beta.7 + '@linaria/babel-preset': 3.0.0-beta.13 transitivePeerDependencies: - supports-color dev: true @@ -4128,19 +5755,20 @@ packages: - supports-color dev: true - /@linaria/shaker/3.0.0-beta.7: - resolution: {integrity: sha512-fWDbbKcS8EiAnoNhTQa+2Or7QyR3Ofyqjtcrb1aeLN2ecVI2u7B5jAZgVPg9euTnhQ2ieUU3G9hh1INkoGKS/A==} + /@linaria/shaker/3.0.0-beta.13: + resolution: {integrity: sha512-/ejyBA63pY5OnGK4VxrcD7FxYdQ/weRuPZyy8YEWgh0vVkyeXegwrfupfn+Nt7Lodnej+hrMexloKjxe2NTKfA==} peerDependencies: '@babel/core': '>=7' dependencies: - '@babel/generator': 7.15.0 - '@babel/plugin-transform-runtime': 7.15.0 - '@babel/plugin-transform-template-literals': 7.14.5 - '@babel/preset-env': 7.15.0 - '@linaria/babel-preset': 3.0.0-beta.7 + '@babel/generator': 7.16.0 + '@babel/plugin-transform-runtime': 7.16.0 + '@babel/plugin-transform-template-literals': 7.16.0 + '@babel/preset-env': 7.16.0 + '@linaria/babel-preset': 3.0.0-beta.13 '@linaria/logger': 3.0.0-beta.3 - '@linaria/preeval': 3.0.0-beta.7 + '@linaria/preeval': 3.0.0-beta.13 babel-plugin-transform-react-remove-prop-types: 0.4.24 + ts-invariant: 0.9.3 transitivePeerDependencies: - supports-color dev: true @@ -4324,7 +5952,14 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.12.0 + fastq: 1.13.0 + dev: true + + /@npmcli/fs/1.0.0: + resolution: {integrity: sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==} + dependencies: + '@gar/promisify': 1.1.2 + semver: 7.3.5 dev: true /@npmcli/move-file/1.1.2: @@ -4339,6 +5974,14 @@ packages: resolution: {integrity: sha512-0p1rCgM3LLbAdwBnc7gqgnvjHg9KpbhcSphergHShlkWz8EdPawoMJ3/VbezI0mGC5eKCDzMaPgF9Yca6cKvrg==} dev: true + /@polka/url/1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true + + /@popperjs/core/2.10.2: + resolution: {integrity: sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==} + dev: true + /@popperjs/core/2.9.3: resolution: {integrity: sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==} dev: true @@ -4350,10 +5993,21 @@ packages: preact: '>= 10.0.0' dependencies: kleur: 4.1.4 - loader-utils: 2.0.0 + loader-utils: 2.0.2 preact: 10.5.14 dev: true + /@preact/async-loader/3.0.1_preact@10.5.15: + resolution: {integrity: sha512-BoUN24hxEfAQYnWjliAmkZLuliv+ONQi7AWn+/+VOJHTIHmbFiXrvmSxITf7PDkKiK0a5xy4OErZtVVLlk96Tg==} + engines: {node: '>=8'} + peerDependencies: + preact: '>= 10.0.0' + dependencies: + kleur: 4.1.4 + loader-utils: 2.0.2 + preact: 10.5.15 + dev: true + /@prefresh/babel-plugin/0.4.1: resolution: {integrity: sha512-gj3ekiYtHlZNz0zFI1z6a9mcYX80Qacw84+2++7V1skvO7kQoV2ux56r8bJkTBbKMVxwAgaYrxxIdUCYlclE7Q==} dev: true @@ -4366,10 +6020,32 @@ packages: preact: 10.5.14 dev: true + /@prefresh/core/1.3.2_preact@10.5.15: + resolution: {integrity: sha512-Iv+uI698KDgWsrKpLvOgN3hmAMyvhVgn09mcnhZ98BUNdg/qrxE7tcUf5yFCImkgqED5/Dcn8G5hFy4IikEDvg==} + peerDependencies: + preact: ^10.0.0 + dependencies: + preact: 10.5.15 + dev: true + /@prefresh/utils/1.1.1: resolution: {integrity: sha512-MUhT5m2XNN5NsZl4GnpuvlzLo6VSTa/+wBfBd3fiWUvHGhv0GF9hnA1pd//v0uJaKwUnVRQ1hYElxCV7DtYsCQ==} dev: true + /@prefresh/webpack/3.3.2_7b676851c8ef63627f17dcf4dd469116: + resolution: {integrity: sha512-1cX0t5G7IXWO2164sl2O32G02BzDl6C4UUZWfDb0x1CQM1g3It9PSLWd+rIlHfSg4MEU9YHM8e6/OK8uavRJhA==} + peerDependencies: + '@prefresh/babel-plugin': ^0.4.0 + preact: ^10.4.0 + webpack: ^4.0.0 || ^5.0.0 + dependencies: + '@prefresh/babel-plugin': 0.4.1 + '@prefresh/core': 1.3.2_preact@10.5.15 + '@prefresh/utils': 1.1.1 + preact: 10.5.15 + webpack: 4.46.0 + dev: true + /@prefresh/webpack/3.3.2_b4d84c08f02729896cbfdece19209372: resolution: {integrity: sha512-1cX0t5G7IXWO2164sl2O32G02BzDl6C4UUZWfDb0x1CQM1g3It9PSLWd+rIlHfSg4MEU9YHM8e6/OK8uavRJhA==} peerDependencies: @@ -4432,11 +6108,28 @@ packages: optional: true dependencies: '@babel/core': 7.15.0 - '@babel/helper-module-imports': 7.14.5 + '@babel/helper-module-imports': 7.16.0 '@rollup/pluginutils': 3.1.0_rollup@2.56.2 rollup: 2.56.2 dev: true + /@rollup/plugin-babel/5.3.0_@babel+core@7.16.0+rollup@2.59.0: + resolution: {integrity: sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@rollup/pluginutils': 3.1.0_rollup@2.59.0 + rollup: 2.59.0 + dev: true + /@rollup/plugin-commonjs/17.0.0_rollup@2.37.1: resolution: {integrity: sha512-/omBIJG1nHQc+bgkYDuLpb/V08QyutP9amOrJRUSlYJZP+b/68gM//D8sxJe3Yry2QnYIr3QjR3x4AlxJEN3GA==} engines: {node: '>= 8.0.0'} @@ -4501,6 +6194,22 @@ packages: rollup: 2.56.2 dev: true + /@rollup/plugin-commonjs/21.0.1_rollup@2.59.0: + resolution: {integrity: sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^2.38.3 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.59.0 + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.1.7 + is-reference: 1.2.1 + magic-string: 0.25.7 + resolve: 1.20.0 + rollup: 2.59.0 + dev: true + /@rollup/plugin-image/2.1.0_rollup@2.56.2: resolution: {integrity: sha512-IiRhjv65A4Rb/9R+gTP2JdIciumkc8c+3xFoUfw3PUkX77SqqzvJ028AfX856E3ZdExMrqY9C9ZVXN46w6rh9A==} engines: {node: '>= 8.0.0'} @@ -4539,6 +6248,15 @@ packages: rollup: 2.56.2 dev: true + /@rollup/plugin-json/4.1.0_rollup@2.59.0: + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.59.0 + rollup: 2.59.0 + dev: true + /@rollup/plugin-node-resolve/11.1.0_rollup@2.37.1: resolution: {integrity: sha512-ouBBppRdWJKCllDXGzJ7ZIkYbaq+5TmyP0smt1vdJCFfoZhLi31vhpmjLhyo8lreHf4RoeSNllaWrvSqHpHRog==} engines: {node: '>= 10.0.0'} @@ -4599,6 +6317,36 @@ packages: rollup: 2.56.2 dev: true + /@rollup/plugin-node-resolve/11.2.1_rollup@2.59.0: + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.59.0 + '@types/resolve': 1.17.1 + builtin-modules: 3.2.0 + deepmerge: 4.2.2 + is-module: 1.0.0 + resolve: 1.20.0 + rollup: 2.59.0 + dev: true + + /@rollup/plugin-node-resolve/13.0.6_rollup@2.59.0: + resolution: {integrity: sha512-sFsPDMPd4gMqnh2gS0uIxELnoRUp5kBl5knxD2EO0778G1oOJv4G1vyT2cpWz75OU2jDVcXhjVUuTAczGyFNKA==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.59.0 + '@types/resolve': 1.17.1 + builtin-modules: 3.2.0 + deepmerge: 4.2.2 + is-module: 1.0.0 + resolve: 1.20.0 + rollup: 2.59.0 + dev: true + /@rollup/plugin-replace/2.3.4_rollup@2.37.1: resolution: {integrity: sha512-waBhMzyAtjCL1GwZes2jaE9MjuQ/DQF2BatH3fRivUF3z0JBFrU0U6iBNC/4WR+2rLKhaAhPWDNPYp4mI6RqdQ==} peerDependencies: @@ -4629,6 +6377,16 @@ packages: rollup: 2.56.2 dev: true + /@rollup/plugin-replace/2.4.2_rollup@2.59.0: + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.59.0 + magic-string: 0.25.7 + rollup: 2.59.0 + dev: true + /@rollup/pluginutils/3.1.0_rollup@2.37.1: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} @@ -4665,6 +6423,18 @@ packages: rollup: 2.56.2 dev: true + /@rollup/pluginutils/3.1.0_rollup@2.59.0: + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.2.2 + rollup: 2.59.0 + dev: true + /@rollup/pluginutils/4.1.1: resolution: {integrity: sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==} engines: {node: '>= 8.0.0'} @@ -4721,6 +6491,43 @@ packages: '@sinonjs/commons': 1.8.3 dev: true + /@sinonjs/fake-timers/8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.3 + dev: true + + /@storybook/addon-a11y/6.3.12: + resolution: {integrity: sha512-q1NdRHFJV6sLEEJw0hatCc5ZIthELqM/AWdrEWDyhcJNyiq7Tq4nKqQBMTQSYwHiUAmxVgw7i4oa1vM2M51/3g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/channels': 6.3.12 + '@storybook/client-api': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/theming': 6.3.12 + axe-core: 4.3.5 + core-js: 3.19.1 + global: 4.4.0 + lodash: 4.17.21 + react-sizeme: 3.0.2 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/addon-a11y/6.3.7: resolution: {integrity: sha512-Z5Lhxm8r5CkPW9FYf6zmAk9c7IhUeUQZxKZeEWGZdOvcjQ32rtg4IYvO2SHgWNrEKBdxxFm3pMiyK3wylQLfsQ==} peerDependencies: @@ -4752,6 +6559,38 @@ packages: - '@types/react' dev: true + /@storybook/addon-actions/6.3.12: + resolution: {integrity: sha512-mzuN4Ano4eyicwycM2PueGzzUCAEzt9/6vyptWEIVJu0sjK0J9KtBRlqFi1xGQxmCfimDR/n/vWBBkc7fp2uJA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/client-api': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/theming': 6.3.12 + core-js: 3.19.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + polished: 4.1.3 + prop-types: 15.7.2 + react-inspector: 5.1.1 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + uuid-browser: 3.1.0 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/addon-actions/6.3.7: resolution: {integrity: sha512-CEAmztbVt47Gw1o6Iw0VP20tuvISCEKk9CS/rCjHtb4ubby6+j/bkp3pkEUQIbyLdHiLWFMz0ZJdyA/U6T6jCw==} peerDependencies: @@ -4784,6 +6623,33 @@ packages: - '@types/react' dev: true + /@storybook/addon-backgrounds/6.3.12: + resolution: {integrity: sha512-51cHBx0HV7K/oRofJ/1pE05qti6sciIo8m4iPred1OezXIrJ/ckzP+gApdaUdzgcLAr6/MXQWLk0sJuImClQ6w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/theming': 6.3.12 + core-js: 3.19.1 + global: 4.4.0 + memoizerific: 1.11.3 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/addon-backgrounds/6.3.7: resolution: {integrity: sha512-NH95pDNILgCXeegbckG+P3zxT5SPmgkAq29P+e3gX7YBOTc6885YCFMJLFpuDMwW4lA0ovXosp4PaUHLsBnLDg==} peerDependencies: @@ -4811,6 +6677,29 @@ packages: - '@types/react' dev: true + /@storybook/addon-controls/6.3.12: + resolution: {integrity: sha512-WO/PbygE4sDg3BbstJ49q0uM3Xu5Nw4lnHR5N4hXSvRAulZt1d1nhphRTHjfX+CW+uBcfzkq9bksm6nKuwmOyw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/client-api': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/node-logger': 6.3.12 + '@storybook/theming': 6.3.12 + core-js: 3.19.1 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/addon-controls/6.3.7: resolution: {integrity: sha512-VHOv5XZ0MQ45k6X7AUrMIxGkm7sgIiPwsvajnoeMe7UwS3ngbTb0Q0raLqI/L5jLM/jyQwfpUO9isA6cztGTEQ==} peerDependencies: @@ -4834,13 +6723,13 @@ packages: - '@types/react' dev: true - /@storybook/addon-docs/6.3.7_typescript@3.9.10: - resolution: {integrity: sha512-cyuyoLuB5ELhbrXgnZneDCHqNq1wSdWZ4dzdHy1E5WwLPEhLlD6INfEsm8gnDIb4IncYuzMhK3XYBDd7d3ijOg==} + /@storybook/addon-docs/6.3.12_eslint@8.1.0+typescript@4.4.4: + resolution: {integrity: sha512-iUrqJBMTOn2PgN8AWNQkfxfIPkh8pEg27t8UndMgfOpeGK/VWGw2UEifnA82flvntcilT4McxmVbRHkeBY9K5A==} peerDependencies: - '@storybook/angular': 6.3.7 - '@storybook/vue': 6.3.7 - '@storybook/vue3': 6.3.7 - '@storybook/web-components': 6.3.7 + '@storybook/angular': 6.3.12 + '@storybook/vue': 6.3.12 + '@storybook/vue3': 6.3.12 + '@storybook/web-components': 6.3.12 lit: ^2.0.0-rc.1 lit-html: ^1.4.1 || ^2.0.0-rc.3 react: ^16.8.0 || ^17.0.0 @@ -4875,45 +6764,45 @@ packages: webpack: optional: true dependencies: - '@babel/core': 7.15.0 - '@babel/generator': 7.15.0 - '@babel/parser': 7.15.3 - '@babel/plugin-transform-react-jsx': 7.14.9_@babel+core@7.15.0 - '@babel/preset-env': 7.15.0_@babel+core@7.15.0 + '@babel/core': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 '@jest/transform': 26.6.2 '@mdx-js/loader': 1.6.22 '@mdx-js/mdx': 1.6.22 '@mdx-js/react': 1.6.22 - '@storybook/addons': 6.3.7 - '@storybook/api': 6.3.7 - '@storybook/builder-webpack4': 6.3.7_typescript@3.9.10 - '@storybook/client-api': 6.3.7 - '@storybook/client-logger': 6.3.7 - '@storybook/components': 6.3.7 - '@storybook/core': 6.3.7_36f75bb62e0c484c1a06658ad2872463 - '@storybook/core-events': 6.3.7 + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/builder-webpack4': 6.3.12_eslint@8.1.0+typescript@4.4.4 + '@storybook/client-api': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/core': 6.3.12_7f5de251797ed618e165bdd143385062 + '@storybook/core-events': 6.3.12 '@storybook/csf': 0.0.1 - '@storybook/csf-tools': 6.3.7_@babel+core@7.15.0 - '@storybook/node-logger': 6.3.7 - '@storybook/postinstall': 6.3.7 - '@storybook/source-loader': 6.3.7 - '@storybook/theming': 6.3.7 + '@storybook/csf-tools': 6.3.12_@babel+core@7.16.0 + '@storybook/node-logger': 6.3.12 + '@storybook/postinstall': 6.3.12 + '@storybook/source-loader': 6.3.12 + '@storybook/theming': 6.3.12 acorn: 7.4.1 acorn-jsx: 5.3.2_acorn@7.4.1 acorn-walk: 7.2.0 - core-js: 3.16.2 + core-js: 3.19.1 doctrine: 3.0.0 escodegen: 2.0.0 fast-deep-equal: 3.1.3 global: 4.4.0 html-tags: 3.1.0 js-string-escape: 1.0.1 - loader-utils: 2.0.0 + loader-utils: 2.0.2 lodash: 4.17.21 p-limit: 3.1.0 prettier: 2.2.1 prop-types: 15.7.2 - react-element-to-jsx-string: 14.3.2 + react-element-to-jsx-string: 14.3.4 regenerator-runtime: 0.13.9 remark-external-links: 8.0.0 remark-slug: 6.1.0 @@ -4923,8 +6812,10 @@ packages: - '@storybook/builder-webpack5' - '@storybook/manager-webpack5' - '@types/react' + - eslint - supports-color - typescript + - vue-template-compiler - webpack-cli - webpack-command dev: true @@ -5024,12 +6915,12 @@ packages: - webpack-command dev: true - /@storybook/addon-essentials/6.3.7_d95124e751df81c32a1d4f8e491e43a1: - resolution: {integrity: sha512-ZWAW3qMFrrpfSekmCZibp/ivnohFLJdJweiIA0CLnuCNuuK9kQdpFahWdvyBy5NlCj3UJwB7epTZYZyHqYW7UQ==} + /@storybook/addon-essentials/6.3.12_eslint@8.1.0+typescript@4.4.4: + resolution: {integrity: sha512-PK0pPE0xkq00kcbBcFwu/5JGHQTu4GvLIHfwwlEGx6GWNQ05l6Q+1Z4nE7xJGv2PSseSx3CKcjn8qykNLe6O6g==} peerDependencies: '@babel/core': ^7.9.6 - '@storybook/vue': 6.3.7 - '@storybook/web-components': 6.3.7 + '@storybook/vue': 6.3.12 + '@storybook/web-components': 6.3.12 babel-loader: ^8.0.0 lit-html: ^1.4.1 || ^2.0.0-rc.3 react: ^16.8.0 || ^17.0.0 @@ -5049,19 +6940,17 @@ packages: webpack: optional: true dependencies: - '@babel/core': 7.13.16 - '@storybook/addon-actions': 6.3.7 - '@storybook/addon-backgrounds': 6.3.7 - '@storybook/addon-controls': 6.3.7 - '@storybook/addon-docs': 6.3.7_typescript@4.3.5 - '@storybook/addon-measure': 2.0.0_a4b77c99d63b159b69a1438c89904ed9 - '@storybook/addon-toolbars': 6.3.7 - '@storybook/addon-viewport': 6.3.7 - '@storybook/addons': 6.3.7 - '@storybook/api': 6.3.7 - '@storybook/node-logger': 6.3.7 - babel-loader: 8.2.2_@babel+core@7.13.16 - core-js: 3.16.2 + '@storybook/addon-actions': 6.3.12 + '@storybook/addon-backgrounds': 6.3.12 + '@storybook/addon-controls': 6.3.12 + '@storybook/addon-docs': 6.3.12_eslint@8.1.0+typescript@4.4.4 + '@storybook/addon-measure': 2.0.0_82d9b0872a2218920e65ea68c1250a0f + '@storybook/addon-toolbars': 6.3.12 + '@storybook/addon-viewport': 6.3.12 + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/node-logger': 6.3.12 + core-js: 3.19.1 regenerator-runtime: 0.13.9 storybook-addon-outline: 1.4.1 ts-dedent: 2.2.0 @@ -5074,17 +6963,19 @@ packages: - '@storybook/theming' - '@storybook/vue3' - '@types/react' + - eslint - lit - supports-color - svelte - sveltedoc-parser - typescript - vue + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/addon-essentials/6.3.7_typescript@3.9.10: + /@storybook/addon-essentials/6.3.7_d95124e751df81c32a1d4f8e491e43a1: resolution: {integrity: sha512-ZWAW3qMFrrpfSekmCZibp/ivnohFLJdJweiIA0CLnuCNuuK9kQdpFahWdvyBy5NlCj3UJwB7epTZYZyHqYW7UQ==} peerDependencies: '@babel/core': ^7.9.6 @@ -5109,16 +7000,18 @@ packages: webpack: optional: true dependencies: + '@babel/core': 7.13.16 '@storybook/addon-actions': 6.3.7 '@storybook/addon-backgrounds': 6.3.7 '@storybook/addon-controls': 6.3.7 - '@storybook/addon-docs': 6.3.7_typescript@3.9.10 + '@storybook/addon-docs': 6.3.7_typescript@4.3.5 '@storybook/addon-measure': 2.0.0_a4b77c99d63b159b69a1438c89904ed9 '@storybook/addon-toolbars': 6.3.7 '@storybook/addon-viewport': 6.3.7 '@storybook/addons': 6.3.7 '@storybook/api': 6.3.7 '@storybook/node-logger': 6.3.7 + babel-loader: 8.2.2_@babel+core@7.13.16 core-js: 3.16.2 regenerator-runtime: 0.13.9 storybook-addon-outline: 1.4.1 @@ -5159,7 +7052,7 @@ packages: '@storybook/csf': 0.0.1 '@storybook/router': 6.3.12 '@types/qs': 6.9.7 - core-js: 3.16.2 + core-js: 3.19.1 global: 4.4.0 prop-types: 15.7.2 qs: 6.10.1 @@ -5167,6 +7060,26 @@ packages: ts-dedent: 2.2.0 dev: true + /@storybook/addon-measure/2.0.0_82d9b0872a2218920e65ea68c1250a0f: + resolution: {integrity: sha512-ZhdT++cX+L9LwjhGYggvYUUVQH/MGn2rwbrAwCMzA/f2QTFvkjxzX8nDgMxIhaLCDC+gHIxfJG2wrWN0jkBr3g==} + peerDependencies: + '@storybook/addons': ^6.3.0 + '@storybook/api': ^6.3.0 + '@storybook/components': ^6.3.0 + '@storybook/core-events': ^6.3.0 + '@storybook/theming': ^6.3.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + dev: true + /@storybook/addon-measure/2.0.0_a4b77c99d63b159b69a1438c89904ed9: resolution: {integrity: sha512-ZhdT++cX+L9LwjhGYggvYUUVQH/MGn2rwbrAwCMzA/f2QTFvkjxzX8nDgMxIhaLCDC+gHIxfJG2wrWN0jkBr3g==} peerDependencies: @@ -5187,6 +7100,28 @@ packages: '@storybook/api': 6.3.7 dev: true + /@storybook/addon-toolbars/6.3.12: + resolution: {integrity: sha512-8GvP6zmAfLPRnYRARSaIwLkQClLIRbflRh4HZoFk6IMjQLXZb4NL3JS5OLFKG+HRMMU2UQzfoSDqjI7k7ptyRw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/client-api': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/theming': 6.3.12 + core-js: 3.19.1 + regenerator-runtime: 0.13.9 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/addon-toolbars/6.3.7: resolution: {integrity: sha512-UTIurbl2WXj/jSOj7ndqQ/WtG7kSpGp62T7gwEZTZ+h/3sJn+bixofBD/7+sXa4hWW07YgTXV547DMhzp5bygg==} peerDependencies: @@ -5209,6 +7144,32 @@ packages: - '@types/react' dev: true + /@storybook/addon-viewport/6.3.12: + resolution: {integrity: sha512-TRjyfm85xouOPmXxeLdEIzXLfJZZ1ePQ7p/5yphDGBHdxMU4m4qiZr8wYpUaxHsRu/UB3dKfaOyGT+ivogbnbw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/theming': 6.3.12 + core-js: 3.19.1 + global: 4.4.0 + memoizerific: 1.11.3 + prop-types: 15.7.2 + regenerator-runtime: 0.13.9 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/addon-viewport/6.3.7: resolution: {integrity: sha512-Hdv2QoVVfe/YuMVQKVVnfCCuEoTqTa8Ck7AOKz31VSAliBFhXewP51oKhw9F6mTyvCozMHX6EBtBzN06KyrPyw==} peerDependencies: @@ -5247,11 +7208,30 @@ packages: '@storybook/core-events': 6.3.12 '@storybook/router': 6.3.12 '@storybook/theming': 6.3.12 - core-js: 3.16.2 + core-js: 3.19.1 global: 4.4.0 regenerator-runtime: 0.13.9 dev: true + /@storybook/addons/6.3.12_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-UgoMyr7Qr0FS3ezt8u6hMEcHgyynQS9ucr5mAwZky3wpXRPFyUTmMto9r4BBUdqyUvTUj/LRKIcmLBfj+/l0Fg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/api': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/channels': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/router': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/theming': 6.3.12_react-dom@16.14.0+react@16.14.0 + core-js: 3.19.1 + global: 4.4.0 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + dev: true + /@storybook/addons/6.3.7: resolution: {integrity: sha512-9stVjTcc52bqqh7YQex/LpSjJ4e2Czm4/ZYDjIiNy0p4OZEx+yLhL5mZzMWh2NQd6vv+pHASBSxf2IeaR5511A==} peerDependencies: @@ -5303,7 +7283,7 @@ packages: '@storybook/semver': 7.3.2 '@storybook/theming': 6.3.12 '@types/reach__router': 1.3.9 - core-js: 3.16.2 + core-js: 3.19.1 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -5316,6 +7296,36 @@ packages: util-deprecate: 1.0.2 dev: true + /@storybook/api/6.3.12_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-LScRXUeCWEW/OP+jiooNMQICVdusv7azTmULxtm72fhkXFRiQs2CdRNTiqNg46JLLC9z95f1W+pGK66X6HiiQA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@reach/router': 1.3.4_react-dom@16.14.0+react@16.14.0 + '@storybook/channels': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/csf': 0.0.1 + '@storybook/router': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@types/reach__router': 1.3.9 + core-js: 3.19.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + store2: 2.12.0 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + /@storybook/api/6.3.7: resolution: {integrity: sha512-57al8mxmE9agXZGo8syRQ8UhvGnDC9zkuwkBPXchESYYVkm3Mc54RTvdAOYDiy85VS4JxiGOywHayCaRwgUddQ==} peerDependencies: @@ -5374,8 +7384,8 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/builder-webpack4/6.3.7_6b8328ae33be7bccbaedcbeca6bc1253: - resolution: {integrity: sha512-M5envblMzAUrNqP1+ouKiL8iSIW/90+kBRU2QeWlZoZl1ib+fiFoKk06cgbaC70Bx1lU8nOnI/VBvB5pLhXLaw==} + /@storybook/builder-webpack4/6.3.12_e909896d3b3be82f296f6253d3893b12: + resolution: {integrity: sha512-Dlm5Fc1svqpFDnVPZdAaEBiM/IDZHMV3RfEGbUTY/ZC0q8b/Ug1czzp/w0aTIjOFRuBDcG6IcplikaqHL8CJLg==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -5384,63 +7394,63 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.15.0 - '@babel/plugin-proposal-class-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-decorators': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-export-default-from': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-object-rest-spread': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-proposal-optional-chaining': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-private-methods': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.15.0 - '@babel/plugin-transform-arrow-functions': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-block-scoping': 7.15.3_@babel+core@7.15.0 - '@babel/plugin-transform-classes': 7.14.9_@babel+core@7.15.0 - '@babel/plugin-transform-destructuring': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-transform-for-of': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-parameters': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-shorthand-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-spread': 7.14.6_@babel+core@7.15.0 - '@babel/plugin-transform-template-literals': 7.14.5_@babel+core@7.15.0 - '@babel/preset-env': 7.15.0_@babel+core@7.15.0 - '@babel/preset-react': 7.14.5_@babel+core@7.15.0 - '@babel/preset-typescript': 7.15.0_@babel+core@7.15.0 - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/api': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/channel-postmessage': 6.3.7 - '@storybook/channels': 6.3.7 - '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/client-logger': 6.3.7 - '@storybook/components': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/core-common': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 - '@storybook/core-events': 6.3.7 - '@storybook/node-logger': 6.3.7 - '@storybook/router': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@babel/core': 7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-decorators': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-export-default-from': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-private-methods': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-transform-arrow-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-block-scoping': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-classes': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-destructuring': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-for-of': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-parameters': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-shorthand-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-template-literals': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/preset-react': 7.16.0_@babel+core@7.16.0 + '@babel/preset-typescript': 7.16.0_@babel+core@7.16.0 + '@storybook/addons': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/api': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.3.12 + '@storybook/channels': 6.3.12 + '@storybook/client-api': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/client-logger': 6.3.12 + '@storybook/components': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/core-common': 6.3.12_e909896d3b3be82f296f6253d3893b12 + '@storybook/core-events': 6.3.12 + '@storybook/node-logger': 6.3.12 + '@storybook/router': 6.3.12_react-dom@16.14.0+react@16.14.0 '@storybook/semver': 7.3.2 - '@storybook/theming': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@types/node': 14.17.10 - '@types/webpack': 4.41.30 - autoprefixer: 9.8.6 - babel-loader: 8.2.2_be352a5a80662835a7707f972edfcfde + '@storybook/theming': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@types/node': 14.17.32 + '@types/webpack': 4.41.31 + autoprefixer: 9.8.8 + babel-loader: 8.2.3_1bd60a6cd0f7024f034efd75ae733a3f babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.15.0 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.16.0 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.16.2 + core-js: 3.19.1 css-loader: 3.6.0_webpack@4.46.0 dotenv-webpack: 1.8.0_webpack@4.46.0 file-loader: 6.2.0_webpack@4.46.0 find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 fs-extra: 9.1.0 - glob: 7.1.7 - glob-promise: 3.4.0_glob@7.1.7 + glob: 7.2.0 + glob-promise: 3.4.0_glob@7.2.0 global: 4.4.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 - pnp-webpack-plugin: 1.6.4_typescript@3.9.10 - postcss: 7.0.36 + pnp-webpack-plugin: 1.6.4_typescript@4.4.4 + postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0_postcss@7.0.36+webpack@4.46.0 + postcss-loader: 4.3.0_postcss@7.0.39+webpack@4.46.0 raw-loader: 4.0.2_webpack@4.46.0 react: 16.14.0 react-dev-utils: 11.0.4 @@ -5449,23 +7459,25 @@ packages: style-loader: 1.3.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.4.4 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 webpack-dev-middleware: 3.7.3_webpack@4.46.0 webpack-filter-warnings-plugin: 1.2.1_webpack@4.46.0 - webpack-hot-middleware: 2.25.0 + webpack-hot-middleware: 2.25.1 webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - '@types/react' + - eslint - supports-color + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/builder-webpack4/6.3.7_8073bd74a106ff14517e8eecceb690e6: - resolution: {integrity: sha512-M5envblMzAUrNqP1+ouKiL8iSIW/90+kBRU2QeWlZoZl1ib+fiFoKk06cgbaC70Bx1lU8nOnI/VBvB5pLhXLaw==} + /@storybook/builder-webpack4/6.3.12_eslint@8.1.0+typescript@4.4.4: + resolution: {integrity: sha512-Dlm5Fc1svqpFDnVPZdAaEBiM/IDZHMV3RfEGbUTY/ZC0q8b/Ug1czzp/w0aTIjOFRuBDcG6IcplikaqHL8CJLg==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -5474,87 +7486,87 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.15.0 - '@babel/plugin-proposal-class-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-decorators': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-export-default-from': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-object-rest-spread': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-proposal-optional-chaining': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-private-methods': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.15.0 - '@babel/plugin-transform-arrow-functions': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-block-scoping': 7.15.3_@babel+core@7.15.0 - '@babel/plugin-transform-classes': 7.14.9_@babel+core@7.15.0 - '@babel/plugin-transform-destructuring': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-transform-for-of': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-parameters': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-shorthand-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-spread': 7.14.6_@babel+core@7.15.0 - '@babel/plugin-transform-template-literals': 7.14.5_@babel+core@7.15.0 - '@babel/preset-env': 7.15.0_@babel+core@7.15.0 - '@babel/preset-react': 7.14.5_@babel+core@7.15.0 - '@babel/preset-typescript': 7.15.0_@babel+core@7.15.0 - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/api': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/channel-postmessage': 6.3.7 - '@storybook/channels': 6.3.7 - '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/client-logger': 6.3.7 - '@storybook/components': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/core-common': 6.3.7_8073bd74a106ff14517e8eecceb690e6 - '@storybook/core-events': 6.3.7 - '@storybook/node-logger': 6.3.7 - '@storybook/router': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@babel/core': 7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-decorators': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-export-default-from': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-private-methods': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-transform-arrow-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-block-scoping': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-classes': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-destructuring': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-for-of': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-parameters': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-shorthand-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-template-literals': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/preset-react': 7.16.0_@babel+core@7.16.0 + '@babel/preset-typescript': 7.16.0_@babel+core@7.16.0 + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/channel-postmessage': 6.3.12 + '@storybook/channels': 6.3.12 + '@storybook/client-api': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/core-common': 6.3.12_eslint@8.1.0+typescript@4.4.4 + '@storybook/core-events': 6.3.12 + '@storybook/node-logger': 6.3.12 + '@storybook/router': 6.3.12 '@storybook/semver': 7.3.2 - '@storybook/theming': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@types/node': 14.17.10 - '@types/webpack': 4.41.30 - autoprefixer: 9.8.6 - babel-loader: 8.2.2_be352a5a80662835a7707f972edfcfde + '@storybook/theming': 6.3.12 + '@storybook/ui': 6.3.12 + '@types/node': 14.17.32 + '@types/webpack': 4.41.31 + autoprefixer: 9.8.8 + babel-loader: 8.2.3_1bd60a6cd0f7024f034efd75ae733a3f babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.15.0 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.16.0 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.16.2 + core-js: 3.19.1 css-loader: 3.6.0_webpack@4.46.0 dotenv-webpack: 1.8.0_webpack@4.46.0 file-loader: 6.2.0_webpack@4.46.0 find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 fs-extra: 9.1.0 - glob: 7.1.7 - glob-promise: 3.4.0_glob@7.1.7 + glob: 7.2.0 + glob-promise: 3.4.0_glob@7.2.0 global: 4.4.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 - pnp-webpack-plugin: 1.6.4_typescript@4.3.5 - postcss: 7.0.36 + pnp-webpack-plugin: 1.6.4_typescript@4.4.4 + postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0_postcss@7.0.36+webpack@4.46.0 + postcss-loader: 4.3.0_postcss@7.0.39+webpack@4.46.0 raw-loader: 4.0.2_webpack@4.46.0 - react: 16.14.0 react-dev-utils: 11.0.4 - react-dom: 16.14.0_react@16.14.0 stable: 0.1.8 style-loader: 1.3.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 - typescript: 4.3.5 + typescript: 4.4.4 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 webpack-dev-middleware: 3.7.3_webpack@4.46.0 webpack-filter-warnings-plugin: 1.2.1_webpack@4.46.0 - webpack-hot-middleware: 2.25.0 + webpack-hot-middleware: 2.25.1 webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - '@types/react' + - eslint - supports-color + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/builder-webpack4/6.3.7_typescript@3.9.10: + /@storybook/builder-webpack4/6.3.7_8073bd74a106ff14517e8eecceb690e6: resolution: {integrity: sha512-M5envblMzAUrNqP1+ouKiL8iSIW/90+kBRU2QeWlZoZl1ib+fiFoKk06cgbaC70Bx1lU8nOnI/VBvB5pLhXLaw==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -5585,20 +7597,20 @@ packages: '@babel/preset-env': 7.15.0_@babel+core@7.15.0 '@babel/preset-react': 7.14.5_@babel+core@7.15.0 '@babel/preset-typescript': 7.15.0_@babel+core@7.15.0 - '@storybook/addons': 6.3.7 - '@storybook/api': 6.3.7 + '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/api': 6.3.7_react-dom@16.14.0+react@16.14.0 '@storybook/channel-postmessage': 6.3.7 '@storybook/channels': 6.3.7 - '@storybook/client-api': 6.3.7 + '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 '@storybook/client-logger': 6.3.7 - '@storybook/components': 6.3.7 - '@storybook/core-common': 6.3.7_typescript@3.9.10 + '@storybook/components': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/core-common': 6.3.7_8073bd74a106ff14517e8eecceb690e6 '@storybook/core-events': 6.3.7 '@storybook/node-logger': 6.3.7 - '@storybook/router': 6.3.7 + '@storybook/router': 6.3.7_react-dom@16.14.0+react@16.14.0 '@storybook/semver': 7.3.2 - '@storybook/theming': 6.3.7 - '@storybook/ui': 6.3.7 + '@storybook/theming': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 '@types/node': 14.17.10 '@types/webpack': 4.41.30 autoprefixer: 9.8.6 @@ -5617,17 +7629,19 @@ packages: glob-promise: 3.4.0_glob@7.1.7 global: 4.4.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 - pnp-webpack-plugin: 1.6.4_typescript@3.9.10 + pnp-webpack-plugin: 1.6.4_typescript@4.3.5 postcss: 7.0.36 postcss-flexbugs-fixes: 4.2.1 postcss-loader: 4.3.0_postcss@7.0.36+webpack@4.46.0 raw-loader: 4.0.2_webpack@4.46.0 + react: 16.14.0 react-dev-utils: 11.0.4 + react-dom: 16.14.0_react@16.14.0 stable: 0.1.8 style-loader: 1.3.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.3.5 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -5730,6 +7744,18 @@ packages: - webpack-command dev: true + /@storybook/channel-postmessage/6.3.12: + resolution: {integrity: sha512-Ou/2Ga3JRTZ/4sSv7ikMgUgLTeZMsXXWLXuscz4oaYhmOqAU9CrJw0G1NitwBgK/+qC83lEFSLujHkWcoQDOKg==} + dependencies: + '@storybook/channels': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 + core-js: 3.19.1 + global: 4.4.0 + qs: 6.10.1 + telejson: 5.3.3 + dev: true + /@storybook/channel-postmessage/6.3.7: resolution: {integrity: sha512-Cmw8HRkeSF1yUFLfEIUIkUICyCXX8x5Ol/5QPbiW9HPE2hbZtYROCcg4bmWqdq59N0Tp9FQNSn+9ZygPgqQtNw==} dependencies: @@ -5745,7 +7771,7 @@ packages: /@storybook/channels/6.3.12: resolution: {integrity: sha512-l4sA+g1PdUV8YCbgs47fIKREdEQAKNdQIZw0b7BfTvY9t0x5yfBywgQhYON/lIeiNGz2OlIuD+VUtqYfCtNSyw==} dependencies: - core-js: 3.16.2 + core-js: 3.19.1 ts-dedent: 2.2.0 util-deprecate: 1.0.2 dev: true @@ -5758,6 +7784,60 @@ packages: util-deprecate: 1.0.2 dev: true + /@storybook/client-api/6.3.12: + resolution: {integrity: sha512-xnW+lKKK2T774z+rOr9Wopt1aYTStfb86PSs9p3Fpnc2Btcftln+C3NtiHZl8Ccqft8Mz/chLGgewRui6tNI8g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/channel-postmessage': 6.3.12 + '@storybook/channels': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/csf': 0.0.1 + '@types/qs': 6.9.7 + '@types/webpack-env': 1.16.3 + core-js: 3.19.1 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.1 + regenerator-runtime: 0.13.9 + stable: 0.1.8 + store2: 2.12.0 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/client-api/6.3.12_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-xnW+lKKK2T774z+rOr9Wopt1aYTStfb86PSs9p3Fpnc2Btcftln+C3NtiHZl8Ccqft8Mz/chLGgewRui6tNI8g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.3.12 + '@storybook/channels': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/csf': 0.0.1 + '@types/qs': 6.9.7 + '@types/webpack-env': 1.16.3 + core-js: 3.19.1 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + stable: 0.1.8 + store2: 2.12.0 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + /@storybook/client-api/6.3.7: resolution: {integrity: sha512-8wOH19cMIwIIYhZy5O5Wl8JT1QOL5kNuamp9GPmg5ff4DtnG+/uUslskRvsnKyjPvl+WbIlZtBVWBiawVdd/yQ==} peerDependencies: @@ -5815,7 +7895,7 @@ packages: /@storybook/client-logger/6.3.12: resolution: {integrity: sha512-zNDsamZvHnuqLznDdP9dUeGgQ9TyFh4ray3t1VGO7ZqWVZ2xtVCCXjDvMnOXI2ifMpX5UsrOvshIPeE9fMBmiQ==} dependencies: - core-js: 3.16.2 + core-js: 3.19.1 global: 4.4.0 dev: true @@ -5826,6 +7906,76 @@ packages: global: 4.4.0 dev: true + /@storybook/components/6.3.12: + resolution: {integrity: sha512-kdQt8toUjynYAxDLrJzuG7YSNL6as1wJoyzNUaCfG06YPhvIAlKo7le9tS2mThVFN5e9nbKrW3N1V1sp6ypZXQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@popperjs/core': 2.10.2 + '@storybook/client-logger': 6.3.12 + '@storybook/csf': 0.0.1 + '@storybook/theming': 6.3.12 + '@types/color-convert': 2.0.0 + '@types/overlayscrollbars': 1.12.1 + '@types/react-syntax-highlighter': 11.0.5 + color-convert: 2.0.1 + core-js: 3.19.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 7.1.3 + memoizerific: 1.11.3 + overlayscrollbars: 1.13.1 + polished: 4.1.3 + prop-types: 15.7.2 + react-colorful: 5.5.0 + react-popper-tooltip: 3.1.1 + react-syntax-highlighter: 13.5.3 + react-textarea-autosize: 8.3.3 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/components/6.3.12_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-kdQt8toUjynYAxDLrJzuG7YSNL6as1wJoyzNUaCfG06YPhvIAlKo7le9tS2mThVFN5e9nbKrW3N1V1sp6ypZXQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@popperjs/core': 2.10.2 + '@storybook/client-logger': 6.3.12 + '@storybook/csf': 0.0.1 + '@storybook/theming': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@types/color-convert': 2.0.0 + '@types/overlayscrollbars': 1.12.1 + '@types/react-syntax-highlighter': 11.0.5 + color-convert: 2.0.1 + core-js: 3.19.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 7.1.3_react@16.14.0 + memoizerific: 1.11.3 + overlayscrollbars: 1.13.1 + polished: 4.1.3 + prop-types: 15.7.2 + react: 16.14.0 + react-colorful: 5.5.0_react-dom@16.14.0+react@16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-popper-tooltip: 3.1.1_react-dom@16.14.0+react@16.14.0 + react-syntax-highlighter: 13.5.3_react@16.14.0 + react-textarea-autosize: 8.3.3_react@16.14.0 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/components/6.3.7: resolution: {integrity: sha512-O7LIg9Z18G0AJqXX7Shcj0uHqwXlSA5UkHgaz9A7mqqqJNl6m6FwwTWcxR1acUfYVNkO+czgpqZHNrOF6rky1A==} peerDependencies: @@ -5896,8 +8046,8 @@ packages: - '@types/react' dev: true - /@storybook/core-client/6.3.7_3c33386fd9b1d5f07f48f07869b17b73: - resolution: {integrity: sha512-M/4A65yV+Y4lsCQXX4BtQO/i3BcMPrU5FkDG8qJd3dkcx2fUlFvGWqQPkcTZE+MPVvMEGl/AsEZSADzah9+dAg==} + /@storybook/core-client/6.3.12_98e8b17cafa08f66f5b84f6b58d34f3e: + resolution: {integrity: sha512-8Smd9BgZHJpAdevLKQYinwtjSyCZAuBMoetP4P5hnn53mWl0NFbrHFaAdT+yNchDLZQUbf7Y18VmIqEH+RCR5w==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -5907,16 +8057,16 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/channel-postmessage': 6.3.7 - '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/client-logger': 6.3.7 - '@storybook/core-events': 6.3.7 + '@storybook/addons': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.3.12 + '@storybook/client-api': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 '@storybook/csf': 0.0.1 - '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.3.12_react-dom@16.14.0+react@16.14.0 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.16.2 + core-js: 3.19.1 global: 4.4.0 lodash: 4.17.21 qs: 6.10.1 @@ -5924,16 +8074,15 @@ packages: react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.4.4 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 4.46.0 transitivePeerDependencies: - '@types/react' dev: true - /@storybook/core-client/6.3.7_6b8328ae33be7bccbaedcbeca6bc1253: - resolution: {integrity: sha512-M/4A65yV+Y4lsCQXX4BtQO/i3BcMPrU5FkDG8qJd3dkcx2fUlFvGWqQPkcTZE+MPVvMEGl/AsEZSADzah9+dAg==} + /@storybook/core-client/6.3.12_f0cf51d5cae459eb9eaddb66e491ac01: + resolution: {integrity: sha512-8Smd9BgZHJpAdevLKQYinwtjSyCZAuBMoetP4P5hnn53mWl0NFbrHFaAdT+yNchDLZQUbf7Y18VmIqEH+RCR5w==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -5943,16 +8092,16 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/channel-postmessage': 6.3.7 - '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/client-logger': 6.3.7 - '@storybook/core-events': 6.3.7 + '@storybook/addons': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.3.12 + '@storybook/client-api': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 '@storybook/csf': 0.0.1 - '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.3.12_react-dom@16.14.0+react@16.14.0 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.16.2 + core-js: 3.19.1 global: 4.4.0 lodash: 4.17.21 qs: 6.10.1 @@ -5960,15 +8109,16 @@ packages: react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.4.4 unfetch: 4.2.0 util-deprecate: 1.0.2 + webpack: 4.46.0 transitivePeerDependencies: - '@types/react' dev: true - /@storybook/core-client/6.3.7_70d39b49be06a92d1ddadaf2d0a6de02: - resolution: {integrity: sha512-M/4A65yV+Y4lsCQXX4BtQO/i3BcMPrU5FkDG8qJd3dkcx2fUlFvGWqQPkcTZE+MPVvMEGl/AsEZSADzah9+dAg==} + /@storybook/core-client/6.3.12_typescript@4.4.4: + resolution: {integrity: sha512-8Smd9BgZHJpAdevLKQYinwtjSyCZAuBMoetP4P5hnn53mWl0NFbrHFaAdT+yNchDLZQUbf7Y18VmIqEH+RCR5w==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -5978,33 +8128,30 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/channel-postmessage': 6.3.7 - '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/client-logger': 6.3.7 - '@storybook/core-events': 6.3.7 + '@storybook/addons': 6.3.12 + '@storybook/channel-postmessage': 6.3.12 + '@storybook/client-api': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 '@storybook/csf': 0.0.1 - '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.3.12 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.16.2 + core-js: 3.19.1 global: 4.4.0 lodash: 4.17.21 qs: 6.10.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - typescript: 4.3.5 + typescript: 4.4.4 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 4.46.0 transitivePeerDependencies: - '@types/react' dev: true - /@storybook/core-client/6.3.7_8073bd74a106ff14517e8eecceb690e6: - resolution: {integrity: sha512-M/4A65yV+Y4lsCQXX4BtQO/i3BcMPrU5FkDG8qJd3dkcx2fUlFvGWqQPkcTZE+MPVvMEGl/AsEZSADzah9+dAg==} + /@storybook/core-client/6.3.12_typescript@4.4.4+webpack@4.46.0: + resolution: {integrity: sha512-8Smd9BgZHJpAdevLKQYinwtjSyCZAuBMoetP4P5hnn53mWl0NFbrHFaAdT+yNchDLZQUbf7Y18VmIqEH+RCR5w==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -6014,31 +8161,30 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/channel-postmessage': 6.3.7 - '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/client-logger': 6.3.7 - '@storybook/core-events': 6.3.7 + '@storybook/addons': 6.3.12 + '@storybook/channel-postmessage': 6.3.12 + '@storybook/client-api': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/core-events': 6.3.12 '@storybook/csf': 0.0.1 - '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.3.12 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.16.2 + core-js: 3.19.1 global: 4.4.0 lodash: 4.17.21 qs: 6.10.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - typescript: 4.3.5 + typescript: 4.4.4 unfetch: 4.2.0 util-deprecate: 1.0.2 + webpack: 4.46.0 transitivePeerDependencies: - '@types/react' dev: true - /@storybook/core-client/6.3.7_typescript@3.9.10: + /@storybook/core-client/6.3.7_70d39b49be06a92d1ddadaf2d0a6de02: resolution: {integrity: sha512-M/4A65yV+Y4lsCQXX4BtQO/i3BcMPrU5FkDG8qJd3dkcx2fUlFvGWqQPkcTZE+MPVvMEGl/AsEZSADzah9+dAg==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -6049,29 +8195,32 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.3.7 + '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 '@storybook/channel-postmessage': 6.3.7 - '@storybook/client-api': 6.3.7 + '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 '@storybook/client-logger': 6.3.7 '@storybook/core-events': 6.3.7 '@storybook/csf': 0.0.1 - '@storybook/ui': 6.3.7 + '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.16.2 global: 4.4.0 lodash: 4.17.21 qs: 6.10.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.3.5 unfetch: 4.2.0 util-deprecate: 1.0.2 + webpack: 4.46.0 transitivePeerDependencies: - '@types/react' dev: true - /@storybook/core-client/6.3.7_typescript@3.9.10+webpack@4.46.0: + /@storybook/core-client/6.3.7_8073bd74a106ff14517e8eecceb690e6: resolution: {integrity: sha512-M/4A65yV+Y4lsCQXX4BtQO/i3BcMPrU5FkDG8qJd3dkcx2fUlFvGWqQPkcTZE+MPVvMEGl/AsEZSADzah9+dAg==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -6082,25 +8231,26 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.3.7 + '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 '@storybook/channel-postmessage': 6.3.7 - '@storybook/client-api': 6.3.7 + '@storybook/client-api': 6.3.7_react-dom@16.14.0+react@16.14.0 '@storybook/client-logger': 6.3.7 '@storybook/core-events': 6.3.7 '@storybook/csf': 0.0.1 - '@storybook/ui': 6.3.7 + '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.16.2 global: 4.4.0 lodash: 4.17.21 qs: 6.10.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.3.5 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 4.46.0 transitivePeerDependencies: - '@types/react' dev: true @@ -6172,8 +8322,8 @@ packages: - '@types/react' dev: true - /@storybook/core-common/6.3.7_6b8328ae33be7bccbaedcbeca6bc1253: - resolution: {integrity: sha512-exLoqRPPsAefwyjbsQBLNFrlPCcv69Q/pclqmIm7FqAPR7f3CKP1rqsHY0PnemizTL/+cLX5S7mY90gI6wpNug==} + /@storybook/core-common/6.3.12_e909896d3b3be82f296f6253d3893b12: + resolution: {integrity: sha512-xlHs2QXELq/moB4MuXjYOczaxU64BIseHsnFBLyboJYN6Yso3qihW5RB7cuJlGohkjb4JwY74dvfT4Ww66rkBA==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -6182,43 +8332,43 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.15.0 - '@babel/plugin-proposal-class-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-decorators': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-export-default-from': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-object-rest-spread': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-proposal-optional-chaining': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-private-methods': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.15.0 - '@babel/plugin-transform-arrow-functions': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-block-scoping': 7.15.3_@babel+core@7.15.0 - '@babel/plugin-transform-classes': 7.14.9_@babel+core@7.15.0 - '@babel/plugin-transform-destructuring': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-transform-for-of': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-parameters': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-shorthand-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-spread': 7.14.6_@babel+core@7.15.0 - '@babel/preset-env': 7.15.0_@babel+core@7.15.0 - '@babel/preset-react': 7.14.5_@babel+core@7.15.0 - '@babel/preset-typescript': 7.15.0_@babel+core@7.15.0 - '@babel/register': 7.15.3_@babel+core@7.15.0 - '@storybook/node-logger': 6.3.7 + '@babel/core': 7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-decorators': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-export-default-from': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-private-methods': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-transform-arrow-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-block-scoping': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-classes': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-destructuring': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-for-of': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-parameters': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-shorthand-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-spread': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/preset-react': 7.16.0_@babel+core@7.16.0 + '@babel/preset-typescript': 7.16.0_@babel+core@7.16.0 + '@babel/register': 7.16.0_@babel+core@7.16.0 + '@storybook/node-logger': 6.3.12 '@storybook/semver': 7.3.2 '@types/glob-base': 0.3.0 '@types/micromatch': 4.0.2 - '@types/node': 14.17.10 + '@types/node': 14.17.32 '@types/pretty-hrtime': 1.0.1 - babel-loader: 8.2.2_be352a5a80662835a7707f972edfcfde + babel-loader: 8.2.3_1bd60a6cd0f7024f034efd75ae733a3f babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.15.0 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.16.0 chalk: 4.1.2 - core-js: 3.16.2 + core-js: 3.19.1 express: 4.17.1 file-system-cache: 1.0.5 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.3.2 - glob: 7.1.7 + fork-ts-checker-webpack-plugin: 6.4.0_831eeee51b9dc6506e4e2983e1c7fb45 + glob: 7.2.0 glob-base: 0.3.0 interpret: 2.2.0 json5: 2.2.0 @@ -6230,17 +8380,19 @@ packages: react-dom: 16.14.0_react@16.14.0 resolve-from: 5.0.0 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.4.4 util-deprecate: 1.0.2 webpack: 4.46.0 transitivePeerDependencies: + - eslint - supports-color + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/core-common/6.3.7_8073bd74a106ff14517e8eecceb690e6: - resolution: {integrity: sha512-exLoqRPPsAefwyjbsQBLNFrlPCcv69Q/pclqmIm7FqAPR7f3CKP1rqsHY0PnemizTL/+cLX5S7mY90gI6wpNug==} + /@storybook/core-common/6.3.12_eslint@8.1.0+typescript@4.4.4: + resolution: {integrity: sha512-xlHs2QXELq/moB4MuXjYOczaxU64BIseHsnFBLyboJYN6Yso3qihW5RB7cuJlGohkjb4JwY74dvfT4Ww66rkBA==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -6249,43 +8401,43 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.15.0 - '@babel/plugin-proposal-class-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-decorators': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-export-default-from': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-object-rest-spread': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-proposal-optional-chaining': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-private-methods': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.15.0 - '@babel/plugin-transform-arrow-functions': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-block-scoping': 7.15.3_@babel+core@7.15.0 - '@babel/plugin-transform-classes': 7.14.9_@babel+core@7.15.0 - '@babel/plugin-transform-destructuring': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-transform-for-of': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-parameters': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-shorthand-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-spread': 7.14.6_@babel+core@7.15.0 - '@babel/preset-env': 7.15.0_@babel+core@7.15.0 - '@babel/preset-react': 7.14.5_@babel+core@7.15.0 - '@babel/preset-typescript': 7.15.0_@babel+core@7.15.0 - '@babel/register': 7.15.3_@babel+core@7.15.0 - '@storybook/node-logger': 6.3.7 + '@babel/core': 7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-decorators': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-export-default-from': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-private-methods': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-transform-arrow-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-block-scoping': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-classes': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-destructuring': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-for-of': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-parameters': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-shorthand-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-spread': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/preset-react': 7.16.0_@babel+core@7.16.0 + '@babel/preset-typescript': 7.16.0_@babel+core@7.16.0 + '@babel/register': 7.16.0_@babel+core@7.16.0 + '@storybook/node-logger': 6.3.12 '@storybook/semver': 7.3.2 '@types/glob-base': 0.3.0 '@types/micromatch': 4.0.2 - '@types/node': 14.17.10 + '@types/node': 14.17.32 '@types/pretty-hrtime': 1.0.1 - babel-loader: 8.2.2_be352a5a80662835a7707f972edfcfde + babel-loader: 8.2.3_1bd60a6cd0f7024f034efd75ae733a3f babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.15.0 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.16.0 chalk: 4.1.2 - core-js: 3.16.2 + core-js: 3.19.1 express: 4.17.1 file-system-cache: 1.0.5 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.3.2 - glob: 7.1.7 + fork-ts-checker-webpack-plugin: 6.4.0_831eeee51b9dc6506e4e2983e1c7fb45 + glob: 7.2.0 glob-base: 0.3.0 interpret: 2.2.0 json5: 2.2.0 @@ -6293,20 +8445,20 @@ packages: micromatch: 4.0.4 pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 resolve-from: 5.0.0 ts-dedent: 2.2.0 - typescript: 4.3.5 + typescript: 4.4.4 util-deprecate: 1.0.2 webpack: 4.46.0 transitivePeerDependencies: + - eslint - supports-color + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/core-common/6.3.7_typescript@3.9.10: + /@storybook/core-common/6.3.7_8073bd74a106ff14517e8eecceb690e6: resolution: {integrity: sha512-exLoqRPPsAefwyjbsQBLNFrlPCcv69Q/pclqmIm7FqAPR7f3CKP1rqsHY0PnemizTL/+cLX5S7mY90gI6wpNug==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -6360,9 +8512,11 @@ packages: micromatch: 4.0.4 pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 resolve-from: 5.0.0 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.3.5 util-deprecate: 1.0.2 webpack: 4.46.0 transitivePeerDependencies: @@ -6439,7 +8593,7 @@ packages: /@storybook/core-events/6.3.12: resolution: {integrity: sha512-SXfD7xUUMazaeFkB92qOTUV8Y/RghE4SkEYe5slAdjeocSaH7Nz2WV0rqNEgChg0AQc+JUI66no8L9g0+lw4Gw==} dependencies: - core-js: 3.16.2 + core-js: 3.19.1 dev: true /@storybook/core-events/6.3.7: @@ -6448,11 +8602,11 @@ packages: core-js: 3.16.2 dev: true - /@storybook/core-server/6.3.7_36f75bb62e0c484c1a06658ad2872463: - resolution: {integrity: sha512-m5OPD/rmZA7KFewkXzXD46/i1ngUoFO4LWOiAY/wR6RQGjYXGMhSa5UYFF6MNwSbiGS5YieHkR5crB1HP47AhQ==} + /@storybook/core-server/6.3.12_7f5de251797ed618e165bdd143385062: + resolution: {integrity: sha512-T/Mdyi1FVkUycdyOnhXvoo3d9nYXLQFkmaJkltxBFLzAePAJUSgAsPL9odNC3+p8Nr2/UDsDzvu/Ow0IF0mzLQ==} peerDependencies: - '@storybook/builder-webpack5': 6.3.7 - '@storybook/manager-webpack5': 6.3.7 + '@storybook/builder-webpack5': 6.3.12 + '@storybook/manager-webpack5': 6.3.12 react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 typescript: '*' @@ -6464,24 +8618,25 @@ packages: typescript: optional: true dependencies: - '@storybook/builder-webpack4': 6.3.7_typescript@3.9.10 - '@storybook/core-client': 6.3.7_typescript@3.9.10+webpack@4.46.0 - '@storybook/core-common': 6.3.7_typescript@3.9.10 - '@storybook/csf-tools': 6.3.7_@babel+core@7.15.0 - '@storybook/manager-webpack4': 6.3.7_typescript@3.9.10 - '@storybook/node-logger': 6.3.7 + '@discoveryjs/json-ext': 0.5.5 + '@storybook/builder-webpack4': 6.3.12_eslint@8.1.0+typescript@4.4.4 + '@storybook/core-client': 6.3.12_typescript@4.4.4+webpack@4.46.0 + '@storybook/core-common': 6.3.12_eslint@8.1.0+typescript@4.4.4 + '@storybook/csf-tools': 6.3.12_@babel+core@7.16.0 + '@storybook/manager-webpack4': 6.3.12_eslint@8.1.0+typescript@4.4.4 + '@storybook/node-logger': 6.3.12 '@storybook/semver': 7.3.2 - '@types/node': 14.17.10 + '@types/node': 14.17.32 '@types/node-fetch': 2.5.12 '@types/pretty-hrtime': 1.0.1 - '@types/webpack': 4.41.30 + '@types/webpack': 4.41.31 better-opn: 2.1.1 boxen: 4.2.0 chalk: 4.1.2 cli-table3: 0.6.0 commander: 6.2.1 compression: 1.7.4 - core-js: 3.16.2 + core-js: 3.19.1 cpy: 8.1.2 detect-port: 1.3.0 express: 4.17.1 @@ -6489,28 +8644,30 @@ packages: fs-extra: 9.1.0 globby: 11.0.4 ip: 1.1.5 - node-fetch: 2.6.1 + node-fetch: 2.6.6 pretty-hrtime: 1.0.3 - prompts: 2.4.1 + prompts: 2.4.2 regenerator-runtime: 0.13.9 serve-favicon: 2.5.0 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.4.4 util-deprecate: 1.0.2 webpack: 4.46.0 transitivePeerDependencies: - '@babel/core' - '@types/react' + - eslint - supports-color + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/core-server/6.3.7_6b8328ae33be7bccbaedcbeca6bc1253: - resolution: {integrity: sha512-m5OPD/rmZA7KFewkXzXD46/i1ngUoFO4LWOiAY/wR6RQGjYXGMhSa5UYFF6MNwSbiGS5YieHkR5crB1HP47AhQ==} + /@storybook/core-server/6.3.12_e909896d3b3be82f296f6253d3893b12: + resolution: {integrity: sha512-T/Mdyi1FVkUycdyOnhXvoo3d9nYXLQFkmaJkltxBFLzAePAJUSgAsPL9odNC3+p8Nr2/UDsDzvu/Ow0IF0mzLQ==} peerDependencies: - '@storybook/builder-webpack5': 6.3.7 - '@storybook/manager-webpack5': 6.3.7 + '@storybook/builder-webpack5': 6.3.12 + '@storybook/manager-webpack5': 6.3.12 react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 typescript: '*' @@ -6522,24 +8679,25 @@ packages: typescript: optional: true dependencies: - '@storybook/builder-webpack4': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 - '@storybook/core-client': 6.3.7_3c33386fd9b1d5f07f48f07869b17b73 - '@storybook/core-common': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 - '@storybook/csf-tools': 6.3.7 - '@storybook/manager-webpack4': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 - '@storybook/node-logger': 6.3.7 + '@discoveryjs/json-ext': 0.5.5 + '@storybook/builder-webpack4': 6.3.12_e909896d3b3be82f296f6253d3893b12 + '@storybook/core-client': 6.3.12_f0cf51d5cae459eb9eaddb66e491ac01 + '@storybook/core-common': 6.3.12_e909896d3b3be82f296f6253d3893b12 + '@storybook/csf-tools': 6.3.12 + '@storybook/manager-webpack4': 6.3.12_e909896d3b3be82f296f6253d3893b12 + '@storybook/node-logger': 6.3.12 '@storybook/semver': 7.3.2 - '@types/node': 14.17.10 + '@types/node': 14.17.32 '@types/node-fetch': 2.5.12 '@types/pretty-hrtime': 1.0.1 - '@types/webpack': 4.41.30 + '@types/webpack': 4.41.31 better-opn: 2.1.1 boxen: 4.2.0 chalk: 4.1.2 cli-table3: 0.6.0 commander: 6.2.1 compression: 1.7.4 - core-js: 3.16.2 + core-js: 3.19.1 cpy: 8.1.2 detect-port: 1.3.0 express: 4.17.1 @@ -6547,21 +8705,23 @@ packages: fs-extra: 9.1.0 globby: 11.0.4 ip: 1.1.5 - node-fetch: 2.6.1 + node-fetch: 2.6.6 pretty-hrtime: 1.0.3 - prompts: 2.4.1 + prompts: 2.4.2 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 serve-favicon: 2.5.0 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.4.4 util-deprecate: 1.0.2 webpack: 4.46.0 transitivePeerDependencies: - '@babel/core' - '@types/react' + - eslint - supports-color + - vue-template-compiler - webpack-cli - webpack-command dev: true @@ -6684,10 +8844,10 @@ packages: - webpack-command dev: true - /@storybook/core/6.3.7_36f75bb62e0c484c1a06658ad2872463: - resolution: {integrity: sha512-YTVLPXqgyBg7TALNxQ+cd+GtCm/NFjxr/qQ1mss1T9GCMR0IjE0d0trgOVHHLAO8jCVlK8DeuqZCCgZFTXulRw==} + /@storybook/core/6.3.12_7f5de251797ed618e165bdd143385062: + resolution: {integrity: sha512-FJm2ns8wk85hXWKslLWiUWRWwS9KWRq7jlkN6M9p57ghFseSGr4W71Orcoab4P3M7jI97l5yqBfppbscinE74g==} peerDependencies: - '@storybook/builder-webpack5': 6.3.7 + '@storybook/builder-webpack5': 6.3.12 react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 typescript: '*' @@ -6697,23 +8857,25 @@ packages: typescript: optional: true dependencies: - '@storybook/core-client': 6.3.7_typescript@3.9.10 - '@storybook/core-server': 6.3.7_36f75bb62e0c484c1a06658ad2872463 - typescript: 3.9.10 + '@storybook/core-client': 6.3.12_typescript@4.4.4 + '@storybook/core-server': 6.3.12_7f5de251797ed618e165bdd143385062 + typescript: 4.4.4 transitivePeerDependencies: - '@babel/core' - '@storybook/manager-webpack5' - '@types/react' + - eslint - supports-color + - vue-template-compiler - webpack - webpack-cli - webpack-command dev: true - /@storybook/core/6.3.7_6b8328ae33be7bccbaedcbeca6bc1253: - resolution: {integrity: sha512-YTVLPXqgyBg7TALNxQ+cd+GtCm/NFjxr/qQ1mss1T9GCMR0IjE0d0trgOVHHLAO8jCVlK8DeuqZCCgZFTXulRw==} + /@storybook/core/6.3.12_e909896d3b3be82f296f6253d3893b12: + resolution: {integrity: sha512-FJm2ns8wk85hXWKslLWiUWRWwS9KWRq7jlkN6M9p57ghFseSGr4W71Orcoab4P3M7jI97l5yqBfppbscinE74g==} peerDependencies: - '@storybook/builder-webpack5': 6.3.7 + '@storybook/builder-webpack5': 6.3.12 react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 typescript: '*' @@ -6723,16 +8885,18 @@ packages: typescript: optional: true dependencies: - '@storybook/core-client': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 - '@storybook/core-server': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 + '@storybook/core-client': 6.3.12_98e8b17cafa08f66f5b84f6b58d34f3e + '@storybook/core-server': 6.3.12_e909896d3b3be82f296f6253d3893b12 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 - typescript: 3.9.10 + typescript: 4.4.4 transitivePeerDependencies: - '@babel/core' - '@storybook/manager-webpack5' - '@types/react' + - eslint - supports-color + - vue-template-compiler - webpack - webpack-cli - webpack-command @@ -6792,18 +8956,40 @@ packages: - webpack-command dev: true - /@storybook/csf-tools/6.3.7: - resolution: {integrity: sha512-A7yGsrYwh+vwVpmG8dHpEimX021RbZd9VzoREcILH56u8atssdh/rseljyWlRes3Sr4QgtLvDB7ggoJ+XDZH7w==} + /@storybook/csf-tools/6.3.12: + resolution: {integrity: sha512-wNrX+99ajAXxLo0iRwrqw65MLvCV6SFC0XoPLYrtBvyKr+hXOOnzIhO2f5BNEii8velpC2gl2gcLKeacpVYLqA==} dependencies: - '@babel/generator': 7.15.0 - '@babel/parser': 7.15.3 - '@babel/plugin-transform-react-jsx': 7.14.9 - '@babel/preset-env': 7.15.0 - '@babel/traverse': 7.15.0 - '@babel/types': 7.15.0 + '@babel/generator': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/plugin-transform-react-jsx': 7.16.0 + '@babel/preset-env': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 '@mdx-js/mdx': 1.6.22 '@storybook/csf': 0.0.1 - core-js: 3.16.2 + core-js: 3.19.1 + fs-extra: 9.1.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + prettier: 2.2.1 + regenerator-runtime: 0.13.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true + + /@storybook/csf-tools/6.3.12_@babel+core@7.16.0: + resolution: {integrity: sha512-wNrX+99ajAXxLo0iRwrqw65MLvCV6SFC0XoPLYrtBvyKr+hXOOnzIhO2f5BNEii8velpC2gl2gcLKeacpVYLqA==} + dependencies: + '@babel/generator': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + '@mdx-js/mdx': 1.6.22 + '@storybook/csf': 0.0.1 + core-js: 3.19.1 fs-extra: 9.1.0 js-string-escape: 1.0.1 lodash: 4.17.21 @@ -6864,8 +9050,8 @@ packages: lodash: 4.17.21 dev: true - /@storybook/manager-webpack4/6.3.7_6b8328ae33be7bccbaedcbeca6bc1253: - resolution: {integrity: sha512-cwUdO3oklEtx6y+ZOl2zHvflICK85emiXBQGgRcCsnwWQRBZOMh+tCgOSZj4jmISVpT52RtT9woG4jKe15KBig==} + /@storybook/manager-webpack4/6.3.12_e909896d3b3be82f296f6253d3893b12: + resolution: {integrity: sha512-OkPYNrHXg2yZfKmEfTokP6iKx4OLTr0gdI5yehi/bLEuQCSHeruxBc70Dxm1GBk1Mrf821wD9WqMXNDjY5Qtug==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -6874,21 +9060,21 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.15.0 - '@babel/plugin-transform-template-literals': 7.14.5_@babel+core@7.15.0 - '@babel/preset-react': 7.14.5_@babel+core@7.15.0 - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/core-client': 6.3.7_3c33386fd9b1d5f07f48f07869b17b73 - '@storybook/core-common': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 - '@storybook/node-logger': 6.3.7 - '@storybook/theming': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@types/node': 14.17.10 - '@types/webpack': 4.41.30 - babel-loader: 8.2.2_be352a5a80662835a7707f972edfcfde + '@babel/core': 7.16.0 + '@babel/plugin-transform-template-literals': 7.16.0_@babel+core@7.16.0 + '@babel/preset-react': 7.16.0_@babel+core@7.16.0 + '@storybook/addons': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/core-client': 6.3.12_f0cf51d5cae459eb9eaddb66e491ac01 + '@storybook/core-common': 6.3.12_e909896d3b3be82f296f6253d3893b12 + '@storybook/node-logger': 6.3.12 + '@storybook/theming': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@types/node': 14.17.32 + '@types/webpack': 4.41.31 + babel-loader: 8.2.3_1bd60a6cd0f7024f034efd75ae733a3f case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.16.2 + core-js: 3.19.1 css-loader: 3.6.0_webpack@4.46.0 dotenv-webpack: 1.8.0_webpack@4.46.0 express: 4.17.1 @@ -6897,8 +9083,8 @@ packages: find-up: 5.0.0 fs-extra: 9.1.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 - node-fetch: 2.6.1 - pnp-webpack-plugin: 1.6.4_typescript@3.9.10 + node-fetch: 2.6.6 + pnp-webpack-plugin: 1.6.4_typescript@4.4.4 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 read-pkg-up: 7.0.1 @@ -6908,7 +9094,7 @@ packages: telejson: 5.3.3 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.4.4 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -6916,13 +9102,15 @@ packages: webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - '@types/react' + - eslint - supports-color + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/manager-webpack4/6.3.7_8073bd74a106ff14517e8eecceb690e6: - resolution: {integrity: sha512-cwUdO3oklEtx6y+ZOl2zHvflICK85emiXBQGgRcCsnwWQRBZOMh+tCgOSZj4jmISVpT52RtT9woG4jKe15KBig==} + /@storybook/manager-webpack4/6.3.12_eslint@8.1.0+typescript@4.4.4: + resolution: {integrity: sha512-OkPYNrHXg2yZfKmEfTokP6iKx4OLTr0gdI5yehi/bLEuQCSHeruxBc70Dxm1GBk1Mrf821wD9WqMXNDjY5Qtug==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 @@ -6931,21 +9119,21 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.15.0 - '@babel/plugin-transform-template-literals': 7.14.5_@babel+core@7.15.0 - '@babel/preset-react': 7.14.5_@babel+core@7.15.0 - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/core-client': 6.3.7_70d39b49be06a92d1ddadaf2d0a6de02 - '@storybook/core-common': 6.3.7_8073bd74a106ff14517e8eecceb690e6 - '@storybook/node-logger': 6.3.7 - '@storybook/theming': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@types/node': 14.17.10 - '@types/webpack': 4.41.30 - babel-loader: 8.2.2_be352a5a80662835a7707f972edfcfde + '@babel/core': 7.16.0 + '@babel/plugin-transform-template-literals': 7.16.0_@babel+core@7.16.0 + '@babel/preset-react': 7.16.0_@babel+core@7.16.0 + '@storybook/addons': 6.3.12 + '@storybook/core-client': 6.3.12_typescript@4.4.4+webpack@4.46.0 + '@storybook/core-common': 6.3.12_eslint@8.1.0+typescript@4.4.4 + '@storybook/node-logger': 6.3.12 + '@storybook/theming': 6.3.12 + '@storybook/ui': 6.3.12 + '@types/node': 14.17.32 + '@types/webpack': 4.41.31 + babel-loader: 8.2.3_1bd60a6cd0f7024f034efd75ae733a3f case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.16.2 + core-js: 3.19.1 css-loader: 3.6.0_webpack@4.46.0 dotenv-webpack: 1.8.0_webpack@4.46.0 express: 4.17.1 @@ -6954,10 +9142,8 @@ packages: find-up: 5.0.0 fs-extra: 9.1.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 - node-fetch: 2.6.1 - pnp-webpack-plugin: 1.6.4_typescript@4.3.5 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + node-fetch: 2.6.6 + pnp-webpack-plugin: 1.6.4_typescript@4.4.4 read-pkg-up: 7.0.1 regenerator-runtime: 0.13.9 resolve-from: 5.0.0 @@ -6965,7 +9151,7 @@ packages: telejson: 5.3.3 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 - typescript: 4.3.5 + typescript: 4.4.4 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -6973,12 +9159,14 @@ packages: webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - '@types/react' + - eslint - supports-color + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/manager-webpack4/6.3.7_typescript@3.9.10: + /@storybook/manager-webpack4/6.3.7_8073bd74a106ff14517e8eecceb690e6: resolution: {integrity: sha512-cwUdO3oklEtx6y+ZOl2zHvflICK85emiXBQGgRcCsnwWQRBZOMh+tCgOSZj4jmISVpT52RtT9woG4jKe15KBig==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -6991,12 +9179,12 @@ packages: '@babel/core': 7.15.0 '@babel/plugin-transform-template-literals': 7.14.5_@babel+core@7.15.0 '@babel/preset-react': 7.14.5_@babel+core@7.15.0 - '@storybook/addons': 6.3.7 - '@storybook/core-client': 6.3.7_typescript@3.9.10+webpack@4.46.0 - '@storybook/core-common': 6.3.7_typescript@3.9.10 + '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/core-client': 6.3.7_70d39b49be06a92d1ddadaf2d0a6de02 + '@storybook/core-common': 6.3.7_8073bd74a106ff14517e8eecceb690e6 '@storybook/node-logger': 6.3.7 - '@storybook/theming': 6.3.7 - '@storybook/ui': 6.3.7 + '@storybook/theming': 6.3.7_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.3.7_react-dom@16.14.0+react@16.14.0 '@types/node': 14.17.10 '@types/webpack': 4.41.30 babel-loader: 8.2.2_be352a5a80662835a7707f972edfcfde @@ -7012,7 +9200,9 @@ packages: fs-extra: 9.1.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 node-fetch: 2.6.1 - pnp-webpack-plugin: 1.6.4_typescript@3.9.10 + pnp-webpack-plugin: 1.6.4_typescript@4.3.5 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 read-pkg-up: 7.0.1 regenerator-runtime: 0.13.9 resolve-from: 5.0.0 @@ -7020,7 +9210,7 @@ packages: telejson: 5.3.3 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 - typescript: 3.9.10 + typescript: 4.3.5 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -7088,6 +9278,16 @@ packages: - webpack-command dev: true + /@storybook/node-logger/6.3.12: + resolution: {integrity: sha512-iktOem/Ls2+dsZY9PhPeC6T1QhX/y7OInP88neLsqEPEbB2UXca3Ydv7OZBhBVbvN25W45b05MRzbtNUxYLNRw==} + dependencies: + '@types/npmlog': 4.1.3 + chalk: 4.1.2 + core-js: 3.19.1 + npmlog: 4.1.2 + pretty-hrtime: 1.0.3 + dev: true + /@storybook/node-logger/6.3.7: resolution: {integrity: sha512-YXHCblruRe6HcNefDOpuXJoaybHnnSryIVP9Z+gDv6OgLAMkyxccTIaQL9dbc/eI4ywgzAz4kD8t1RfVwXNVXw==} dependencies: @@ -7098,14 +9298,20 @@ packages: pretty-hrtime: 1.0.3 dev: true + /@storybook/postinstall/6.3.12: + resolution: {integrity: sha512-HkZ+abtZ3W6JbGPS6K7OSnNXbwaTwNNd5R02kRs4gV9B29XsBPDtFT6vIwzM3tmVQC7ihL5a8ceWp2OvzaNOuw==} + dependencies: + core-js: 3.19.1 + dev: true + /@storybook/postinstall/6.3.7: resolution: {integrity: sha512-HgTj7WdWo2cXrGfEhi5XYZA+G4vIzECtJHK22GEL9QxJth60Ah/dE94VqpTlyhSpzP74ZFUgr92+pP9o+j3CCw==} dependencies: core-js: 3.16.2 dev: true - /@storybook/preact/6.3.7_9cd0ede338ef3d2deb8dbc69bc115c66: - resolution: {integrity: sha512-mP6+e1toCd59ALUNsiJWQN0CuOVV7faaMcAs21T+GJeU5igEWbRpe/ixKdMdu7RqHA9jAHOeMZfjSNhBkvnwAw==} + /@storybook/preact/6.3.12_95076c79c13120062fc2121e56d666e8: + resolution: {integrity: sha512-okP4Y1Zf26AdjK/5sFJGoF1Ce2WPK/3w+x0WgMdEOs7K7/pnKNQ1Ck8KLXmPyjTN+6bVoIMP8NcS8ZqHJu25lw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -7113,15 +9319,14 @@ packages: preact: ^8.0.0||^10.0.0 webpack: '*' dependencies: - '@babel/core': 7.13.16 - '@babel/plugin-transform-react-jsx': 7.14.9_@babel+core@7.13.16 - '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/core': 6.3.7_f904207d8bce108657a1649c78f72ef8 - '@storybook/core-common': 6.3.7_8073bd74a106ff14517e8eecceb690e6 - '@types/webpack-env': 1.16.2 - core-js: 3.16.2 + '@babel/plugin-transform-react-jsx': 7.16.0 + '@storybook/addons': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/core': 6.3.12_e909896d3b3be82f296f6253d3893b12 + '@storybook/core-common': 6.3.12_e909896d3b3be82f296f6253d3893b12 + '@types/webpack-env': 1.16.3 + core-js: 3.19.1 global: 4.4.0 - preact: 10.5.14 + preact: 10.5.15 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 read-pkg-up: 7.0.1 @@ -7131,13 +9336,15 @@ packages: - '@storybook/builder-webpack5' - '@storybook/manager-webpack5' - '@types/react' + - eslint - supports-color - typescript + - vue-template-compiler - webpack-cli - webpack-command dev: true - /@storybook/preact/6.3.7_preact@10.5.14+typescript@3.9.10: + /@storybook/preact/6.3.7_9cd0ede338ef3d2deb8dbc69bc115c66: resolution: {integrity: sha512-mP6+e1toCd59ALUNsiJWQN0CuOVV7faaMcAs21T+GJeU5igEWbRpe/ixKdMdu7RqHA9jAHOeMZfjSNhBkvnwAw==} engines: {node: '>=10.13.0'} hasBin: true @@ -7146,10 +9353,11 @@ packages: preact: ^8.0.0||^10.0.0 webpack: '*' dependencies: - '@babel/plugin-transform-react-jsx': 7.14.9 + '@babel/core': 7.13.16 + '@babel/plugin-transform-react-jsx': 7.14.9_@babel+core@7.13.16 '@storybook/addons': 6.3.7_react-dom@16.14.0+react@16.14.0 - '@storybook/core': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 - '@storybook/core-common': 6.3.7_6b8328ae33be7bccbaedcbeca6bc1253 + '@storybook/core': 6.3.7_f904207d8bce108657a1649c78f72ef8 + '@storybook/core-common': 6.3.7_8073bd74a106ff14517e8eecceb690e6 '@types/webpack-env': 1.16.2 core-js: 3.16.2 global: 4.4.0 @@ -7176,7 +9384,7 @@ packages: sass-loader: '*' style-loader: '*' dependencies: - sass-loader: 10.2.0_sass@1.43.2 + sass-loader: 10.2.0_sass@1.32.13 dev: true /@storybook/router/6.3.12: @@ -7188,7 +9396,7 @@ packages: '@reach/router': 1.3.4 '@storybook/client-logger': 6.3.12 '@types/reach__router': 1.3.9 - core-js: 3.16.2 + core-js: 3.19.1 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -7197,6 +9405,26 @@ packages: ts-dedent: 2.2.0 dev: true + /@storybook/router/6.3.12_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-G/pNGCnrJRetCwyEZulHPT+YOcqEj/vkPVDTUfii2qgqukup6K0cjwgd7IukAURnAnnzTi1gmgFuEKUi8GE/KA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@reach/router': 1.3.4_react-dom@16.14.0+react@16.14.0 + '@storybook/client-logger': 6.3.12 + '@types/reach__router': 1.3.9 + core-js: 3.19.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + ts-dedent: 2.2.0 + dev: true + /@storybook/router/6.3.7: resolution: {integrity: sha512-6tthN8op7H0NoYoE1SkQFJKC42pC4tGaoPn7kEql8XGeUJnxPtVFjrnywlTrRnKuxZKIvbilQBAwDml97XH23Q==} peerDependencies: @@ -7240,10 +9468,28 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - core-js: 3.16.2 + core-js: 3.19.1 find-up: 4.1.0 dev: true + /@storybook/source-loader/6.3.12: + resolution: {integrity: sha512-Lfe0LOJGqAJYkZsCL8fhuQOeFSCgv8xwQCt4dkcBd0Rw5zT2xv0IXDOiIOXGaWBMDtrJUZt/qOXPEPlL81Oaqg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/csf': 0.0.1 + core-js: 3.19.1 + estraverse: 5.3.0 + global: 4.4.0 + loader-utils: 2.0.2 + lodash: 4.17.21 + prettier: 2.2.1 + regenerator-runtime: 0.13.9 + dev: true + /@storybook/source-loader/6.3.7: resolution: {integrity: sha512-0xQTq90jwx7W7MJn/idEBCGPOyxi/3No5j+5YdfJsSGJRuMFH3jt6pGgdeZ4XA01cmmIX6bZ+fB9al6yAzs91w==} peerDependencies: @@ -7272,7 +9518,7 @@ packages: '@emotion/is-prop-valid': 0.8.8 '@emotion/styled': 10.0.27_@emotion+core@10.1.1 '@storybook/client-logger': 6.3.12 - core-js: 3.16.2 + core-js: 3.19.1 deep-object-diff: 1.1.0 emotion-theming: 10.0.27_@emotion+core@10.1.1 global: 4.4.0 @@ -7282,6 +9528,28 @@ packages: ts-dedent: 2.2.0 dev: true + /@storybook/theming/6.3.12_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-wOJdTEa/VFyFB2UyoqyYGaZdym6EN7RALuQOAMT6zHA282FBmKw8nL5DETHEbctpnHdcrMC/391teK4nNSrdOA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.1.1_react@16.14.0 + '@emotion/is-prop-valid': 0.8.8 + '@emotion/styled': 10.0.27_5f216699bc8c1f24088b3bf77b7cbbdf + '@storybook/client-logger': 6.3.12 + core-js: 3.19.1 + deep-object-diff: 1.1.0 + emotion-theming: 10.0.27_5f216699bc8c1f24088b3bf77b7cbbdf + global: 4.4.0 + memoizerific: 1.11.3 + polished: 4.1.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + resolve-from: 5.0.0 + ts-dedent: 2.2.0 + dev: true + /@storybook/theming/6.3.7: resolution: {integrity: sha512-GXBdw18JJd5jLLcRonAZWvGGdwEXByxF1IFNDSOYCcpHWsMgTk4XoLjceu9MpXET04pVX51LbVPLCvMdggoohg==} peerDependencies: @@ -7324,6 +9592,86 @@ packages: ts-dedent: 2.2.0 dev: true + /@storybook/ui/6.3.12: + resolution: {integrity: sha512-PC2yEz4JMfarq7rUFbeA3hCA+31p5es7YPEtxLRvRwIZhtL0P4zQUfHpotb3KgWdoAIfZesAuoIQwMPQmEFYrw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.1.1 + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/channels': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/core-events': 6.3.12 + '@storybook/router': 6.3.12 + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.3.12 + '@types/markdown-to-jsx': 6.11.3 + copy-to-clipboard: 3.3.1 + core-js: 3.19.1 + core-js-pure: 3.19.1 + downshift: 6.1.7 + emotion-theming: 10.0.27_@emotion+core@10.1.1 + fuse.js: 3.6.1 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 6.11.4 + memoizerific: 1.11.3 + polished: 4.1.3 + qs: 6.10.1 + react-draggable: 4.4.4 + react-helmet-async: 1.1.2 + react-sizeme: 3.0.2 + regenerator-runtime: 0.13.9 + resolve-from: 5.0.0 + store2: 2.12.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/ui/6.3.12_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-PC2yEz4JMfarq7rUFbeA3hCA+31p5es7YPEtxLRvRwIZhtL0P4zQUfHpotb3KgWdoAIfZesAuoIQwMPQmEFYrw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.1.1_react@16.14.0 + '@storybook/addons': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/api': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/channels': 6.3.12 + '@storybook/client-logger': 6.3.12 + '@storybook/components': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/core-events': 6.3.12 + '@storybook/router': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.3.12_react-dom@16.14.0+react@16.14.0 + '@types/markdown-to-jsx': 6.11.3 + copy-to-clipboard: 3.3.1 + core-js: 3.19.1 + core-js-pure: 3.19.1 + downshift: 6.1.7_react@16.14.0 + emotion-theming: 10.0.27_5f216699bc8c1f24088b3bf77b7cbbdf + fuse.js: 3.6.1 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 6.11.4_react@16.14.0 + memoizerific: 1.11.3 + polished: 4.1.3 + qs: 6.10.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-draggable: 4.4.4_react-dom@16.14.0+react@16.14.0 + react-helmet-async: 1.1.2_react-dom@16.14.0+react@16.14.0 + react-sizeme: 3.0.2 + regenerator-runtime: 0.13.9 + resolve-from: 5.0.0 + store2: 2.12.0 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/ui/6.3.7: resolution: {integrity: sha512-PBeRO8qtwAbtHvxUgNtz/ChUR6qnN+R37dMaIs3Y96jbks1fS2K9Mt7W5s1HnUbWbg2KsZMv9D4VYPBasY+Isw==} peerDependencies: @@ -7447,8 +9795,8 @@ packages: engines: {node: '>= 6'} dev: true - /@trysound/sax/0.1.1: - resolution: {integrity: sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==} + /@trysound/sax/0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} dev: true @@ -7470,23 +9818,33 @@ packages: '@types/babel__traverse': 7.14.2 dev: true + /@types/babel__core/7.1.16: + resolution: {integrity: sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==} + dependencies: + '@babel/parser': 7.16.2 + '@babel/types': 7.16.0 + '@types/babel__generator': 7.6.3 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.14.2 + dev: true + /@types/babel__generator/7.6.3: resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==} dependencies: - '@babel/types': 7.15.0 + '@babel/types': 7.16.0 dev: true /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.15.3 - '@babel/types': 7.15.0 + '@babel/parser': 7.16.2 + '@babel/types': 7.16.0 dev: true /@types/babel__traverse/7.14.2: resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} dependencies: - '@babel/types': 7.15.0 + '@babel/types': 7.16.0 dev: true /@types/braces/3.0.1: @@ -7496,7 +9854,7 @@ packages: /@types/cheerio/0.22.30: resolution: {integrity: sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==} dependencies: - '@types/node': 14.17.10 + '@types/node': 16.11.6 dev: true /@types/chrome/0.0.128: @@ -7516,15 +9874,11 @@ packages: resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} dev: true - /@types/enzyme/3.10.9: - resolution: {integrity: sha512-dx5UvcWe2Vtye6S9Hw2rFB7Ul9uMXOAje2FAbXvVYieQDNle9qPAo7DfvFMSztZ9NFiD3dVZ4JsRYGTrSLynJg==} + /@types/enzyme/3.10.10: + resolution: {integrity: sha512-/D4wFhiEjUDfPu+j5FVK0g/jf7rqeEIpNfAI+kyxzLpw5CKO0drnW3W5NC38alIjsWgnyQ8pbuPF5+UD+vhVyg==} dependencies: '@types/cheerio': 0.22.30 - '@types/react': 17.0.19 - dev: true - - /@types/eslint-visitor-keys/1.0.0: - resolution: {integrity: sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==} + '@types/react': 17.0.34 dev: true /@types/estree/0.0.39: @@ -7549,25 +9903,25 @@ packages: resolution: {integrity: sha1-pYHWiDR+EOUN18F9byiAoQNUMZ0=} dev: true - /@types/glob/7.1.4: - resolution: {integrity: sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==} + /@types/glob/7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 14.17.10 + '@types/node': 16.11.6 dev: true /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 14.17.10 + '@types/node': 16.11.6 dev: true /@types/har-format/1.2.7: resolution: {integrity: sha512-/TPzUG0tJn5x1TUcVLlDx2LqbE58hyOzDVAc9kf8SpOEmguHjU6bKUyfqb211AdqLOmU/SNyXvLKPNP5qTlfRw==} dev: true - /@types/hast/2.3.2: - resolution: {integrity: sha512-Op5W7jYgZI7AWKY5wQ0/QNMzQM7dGQPyW1rXKNiymVCy5iTfdPuGu4HhYNOM2sIv8gUfIuIdcYlXmAepwaowow==} + /@types/hast/2.3.4: + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} dependencies: '@types/unist': 2.0.6 dev: true @@ -7580,8 +9934,8 @@ packages: resolution: {integrity: sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==} dev: true - /@types/is-function/1.0.0: - resolution: {integrity: sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w==} + /@types/is-function/1.0.1: + resolution: {integrity: sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==} dev: true /@types/istanbul-lib-coverage/2.0.3: @@ -7607,6 +9961,13 @@ packages: pretty-format: 26.6.2 dev: true + /@types/jest/27.0.2: + resolution: {integrity: sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==} + dependencies: + jest-diff: 27.3.1 + pretty-format: 27.3.1 + dev: true + /@types/json-schema/7.0.7: resolution: {integrity: sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==} dev: true @@ -7622,11 +9983,11 @@ packages: /@types/markdown-to-jsx/6.11.3: resolution: {integrity: sha512-30nFYpceM/ZEvhGiqWjm5quLUxNeld0HCzJEXMZZDpq53FPkS85mTwkWtCXzCqq8s5JYLgM5W392a02xn8Bdaw==} dependencies: - '@types/react': 17.0.19 + '@types/react': 17.0.34 dev: true - /@types/mdast/3.0.8: - resolution: {integrity: sha512-HdUXWDNtDenuVJFrV2xBCLEMiw1Vn7FMuJxqJC5oBvC2adA3pgtp6CPCIMQdz3pmWxGuJjT+hOp6FnOXy6dXoQ==} + /@types/mdast/3.0.10: + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} dependencies: '@types/unist': 2.0.6 dev: true @@ -7644,7 +10005,7 @@ packages: /@types/node-fetch/2.5.12: resolution: {integrity: sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==} dependencies: - '@types/node': 14.17.10 + '@types/node': 14.17.32 form-data: 3.0.1 dev: true @@ -7667,6 +10028,14 @@ packages: resolution: {integrity: sha512-09x2d6kNBwjHgyh3jOUE2GE4DFoxDriDvWdu6mFhMP1ysynGYazt4ecZmJlL6/fe4Zi2vtYvTvtL7epjQQrBhA==} dev: true + /@types/node/14.17.32: + resolution: {integrity: sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==} + dev: true + + /@types/node/16.11.6: + resolution: {integrity: sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==} + dev: true + /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true @@ -7691,6 +10060,10 @@ packages: resolution: {integrity: sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==} dev: true + /@types/prettier/2.4.1: + resolution: {integrity: sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==} + dev: true + /@types/pretty-hrtime/1.0.1: resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} dev: true @@ -7710,27 +10083,27 @@ packages: /@types/reach__router/1.3.9: resolution: {integrity: sha512-N6rqQqTTAV/zKLfK3iq9Ww3wqCEhTZvsilhl0zI09zETdVq1QGmJH6+/xnj8AFUWIrle2Cqo+PGM/Ltr1vBb9w==} dependencies: - '@types/react': 17.0.19 + '@types/react': 17.0.34 dev: true /@types/react-syntax-highlighter/11.0.5: resolution: {integrity: sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==} dependencies: - '@types/react': 17.0.19 + '@types/react': 17.0.34 dev: true - /@types/react/17.0.19: - resolution: {integrity: sha512-sX1HisdB1/ZESixMTGnMxH9TDe8Sk709734fEQZzCV/4lSu9kJCPbo2PbTRoZM+53Pp0P10hYVyReUueGwUi4A==} + /@types/react/17.0.34: + resolution: {integrity: sha512-46FEGrMjc2+8XhHXILr+3+/sTe3OfzSPU9YGKILLrUYbQ1CLQC9Daqo1KzENGXAWwrFwiY0l4ZbF20gRvgpWTg==} dependencies: '@types/prop-types': 15.7.4 '@types/scheduler': 0.16.2 - csstype: 3.0.8 + csstype: 3.0.9 dev: true /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 14.17.10 + '@types/node': 16.11.6 dev: true /@types/scheduler/0.16.2: @@ -7767,10 +10140,14 @@ packages: resolution: {integrity: sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw==} dev: true + /@types/webpack-env/1.16.3: + resolution: {integrity: sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==} + dev: true + /@types/webpack-sources/3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 14.17.10 + '@types/node': 14.17.32 '@types/source-list-map': 0.1.2 source-map: 0.7.3 dev: true @@ -7786,6 +10163,17 @@ packages: source-map: 0.6.1 dev: true + /@types/webpack/4.41.31: + resolution: {integrity: sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==} + dependencies: + '@types/node': 14.17.32 + '@types/tapable': 1.0.8 + '@types/uglify-js': 3.13.1 + '@types/webpack-sources': 3.2.0 + anymatch: 3.1.2 + source-map: 0.6.1 + dev: true + /@types/yargs-parser/20.2.1: resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} dev: true @@ -7802,28 +10190,6 @@ packages: '@types/yargs-parser': 20.2.1 dev: true - /@typescript-eslint/eslint-plugin/2.34.0_2b015b1c4b7c4a3ed9a197dc233b1a35: - resolution: {integrity: sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - peerDependencies: - '@typescript-eslint/parser': ^2.0.0 - eslint: ^5.0.0 || ^6.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/experimental-utils': 2.34.0_eslint@6.8.0+typescript@3.9.10 - '@typescript-eslint/parser': 2.34.0_eslint@6.8.0+typescript@3.9.10 - eslint: 6.8.0 - functional-red-black-tree: 1.0.1 - regexpp: 3.1.0 - tsutils: 3.19.1_typescript@3.9.10 - typescript: 3.9.10 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/eslint-plugin/4.14.0_980e7d90d2d08155204a38366bd3b934: resolution: {integrity: sha512-IJ5e2W7uFNfg4qh9eHkHRUCbgZ8VKtGwD07kannJvM5t/GU8P8+24NX8gi3Hf5jST5oWPY8kyV1s/WtfiZ4+Ww==} engines: {node: ^10.12.0 || >=12.0.0} @@ -7850,15 +10216,41 @@ packages: - supports-color dev: true - /@typescript-eslint/experimental-utils/2.34.0_eslint@6.8.0+typescript@3.9.10: + /@typescript-eslint/eslint-plugin/5.3.0_f8873316f48f7781ccc3e081fc76e214: + resolution: {integrity: sha512-ARUEJHJrq85aaiCqez7SANeahDsJTD3AEua34EoQN9pHS6S5Bq9emcIaGGySt/4X2zSi+vF5hAH52sEen7IO7g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/experimental-utils': 5.3.0_eslint@8.1.0+typescript@4.4.4 + '@typescript-eslint/parser': 5.3.0_eslint@8.1.0+typescript@4.4.4 + '@typescript-eslint/scope-manager': 5.3.0 + debug: 4.3.2 + eslint: 8.1.0 + functional-red-black-tree: 1.0.1 + ignore: 5.1.9 + regexpp: 3.2.0 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils/2.34.0_eslint@8.1.0+typescript@4.4.4: resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} peerDependencies: eslint: '*' dependencies: '@types/json-schema': 7.0.9 - '@typescript-eslint/typescript-estree': 2.34.0_typescript@3.9.10 - eslint: 6.8.0 + '@typescript-eslint/typescript-estree': 2.34.0_typescript@4.4.4 + eslint: 8.1.0 eslint-scope: 5.1.1 eslint-utils: 2.1.0 transitivePeerDependencies: @@ -7884,24 +10276,22 @@ packages: - typescript dev: true - /@typescript-eslint/parser/2.34.0_eslint@6.8.0+typescript@3.9.10: - resolution: {integrity: sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + /@typescript-eslint/experimental-utils/5.3.0_eslint@8.1.0+typescript@4.4.4: + resolution: {integrity: sha512-NFVxYTjKj69qB0FM+piah1x3G/63WB8vCBMnlnEHUsiLzXSTWb9FmFn36FD9Zb4APKBLY3xRArOGSMQkuzTF1w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^5.0.0 || ^6.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: '*' dependencies: - '@types/eslint-visitor-keys': 1.0.0 - '@typescript-eslint/experimental-utils': 2.34.0_eslint@6.8.0+typescript@3.9.10 - '@typescript-eslint/typescript-estree': 2.34.0_typescript@3.9.10 - eslint: 6.8.0 - eslint-visitor-keys: 1.3.0 - typescript: 3.9.10 + '@types/json-schema': 7.0.9 + '@typescript-eslint/scope-manager': 5.3.0 + '@typescript-eslint/types': 5.3.0 + '@typescript-eslint/typescript-estree': 5.3.0_typescript@4.4.4 + eslint: 8.1.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.1.0 transitivePeerDependencies: - supports-color + - typescript dev: true /@typescript-eslint/parser/4.14.0_eslint@7.18.0+typescript@4.1.3: @@ -7944,6 +10334,26 @@ packages: - supports-color dev: true + /@typescript-eslint/parser/5.3.0_eslint@8.1.0+typescript@4.4.4: + resolution: {integrity: sha512-rKu/yAReip7ovx8UwOAszJVO5MgBquo8WjIQcp1gx4pYQCwYzag+I5nVNHO4MqyMkAo0gWt2gWUi+36gWAVKcw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.3.0 + '@typescript-eslint/types': 5.3.0 + '@typescript-eslint/typescript-estree': 5.3.0_typescript@4.4.4 + debug: 4.3.2 + eslint: 8.1.0 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager/4.14.0: resolution: {integrity: sha512-/J+LlRMdbPh4RdL4hfP1eCwHN5bAhFAGOTsvE6SxsrM/47XQiPSgF5MDgLyp/i9kbZV9Lx80DW0OpPkzL+uf8Q==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -7960,6 +10370,14 @@ packages: '@typescript-eslint/visitor-keys': 4.4.1 dev: true + /@typescript-eslint/scope-manager/5.3.0: + resolution: {integrity: sha512-22Uic9oRlTsPppy5Tcwfj+QET5RWEnZ5414Prby465XxQrQFZ6nnm5KnXgnsAJefG4hEgMnaxTB3kNEyjdjj6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.3.0 + '@typescript-eslint/visitor-keys': 5.3.0 + dev: true + /@typescript-eslint/types/4.14.0: resolution: {integrity: sha512-VsQE4VvpldHrTFuVPY1ZnHn/Txw6cZGjL48e+iBxTi2ksa9DmebKjAeFmTVAYoSkTk7gjA7UqJ7pIsyifTsI4A==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -7970,7 +10388,12 @@ packages: engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/typescript-estree/2.34.0_typescript@3.9.10: + /@typescript-eslint/types/5.3.0: + resolution: {integrity: sha512-fce5pG41/w8O6ahQEhXmMV+xuh4+GayzqEogN24EK+vECA3I6pUwKuLi5QbXO721EMitpQne5VKXofPonYlAQg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/2.34.0_typescript@4.4.4: resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} peerDependencies: @@ -7981,12 +10404,12 @@ packages: dependencies: debug: 4.3.2 eslint-visitor-keys: 1.3.0 - glob: 7.1.7 - is-glob: 4.0.1 + glob: 7.2.0 + is-glob: 4.0.3 lodash: 4.17.21 semver: 7.3.5 - tsutils: 3.19.1_typescript@3.9.10 - typescript: 3.9.10 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 transitivePeerDependencies: - supports-color dev: true @@ -8035,6 +10458,27 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree/5.3.0_typescript@4.4.4: + resolution: {integrity: sha512-FJ0nqcaUOpn/6Z4Jwbtf+o0valjBLkqc3MWkMvrhA2TvzFXtcclIM8F4MBEmYa2kgcI8EZeSAzwoSrIC8JYkug==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.3.0 + '@typescript-eslint/visitor-keys': 5.3.0 + debug: 4.3.2 + globby: 11.0.4 + is-glob: 4.0.3 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/visitor-keys/4.14.0: resolution: {integrity: sha512-MeHHzUyRI50DuiPgV9+LxcM52FCJFYjJiWHtXlbyC27b80mfOwKeiKI+MHOTEpcpfmoPFm/vvQS88bYIx6PZTA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -8051,6 +10495,14 @@ packages: eslint-visitor-keys: 2.0.0 dev: true + /@typescript-eslint/visitor-keys/5.3.0: + resolution: {integrity: sha512-oVIAfIQuq0x2TFDNLVavUn548WL+7hdhxYn+9j3YdJJXB7mH9dAmZNJsPDa7Jc+B9WGqoiex7GUDbyMxV0a/aw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.3.0 + eslint-visitor-keys: 3.0.0 + dev: true + /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} dependencies: @@ -8194,7 +10646,7 @@ packages: resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==} engines: {node: '>= 0.6'} dependencies: - mime-types: 2.1.32 + mime-types: 2.1.33 negotiator: 0.6.2 dev: true @@ -8232,6 +10684,14 @@ packages: acorn: 7.4.1 dev: true + /acorn-jsx/5.3.2_acorn@8.5.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.5.0 + dev: true + /acorn-walk/6.2.0: resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} engines: {node: '>=0.4.0'} @@ -8247,6 +10707,11 @@ packages: engines: {node: '>=0.4.0'} dev: true + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn/5.7.4: resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} engines: {node: '>=0.4.0'} @@ -8271,6 +10736,12 @@ packages: hasBin: true dev: true + /acorn/8.5.0: + resolution: {integrity: sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /address/1.1.2: resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==} engines: {node: '>= 0.12.0'} @@ -8296,22 +10767,22 @@ packages: /airbnb-js-shims/2.2.1: resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} dependencies: - array-includes: 3.1.3 - array.prototype.flat: 1.2.4 - array.prototype.flatmap: 1.2.4 - es5-shim: 4.5.15 + array-includes: 3.1.4 + array.prototype.flat: 1.2.5 + array.prototype.flatmap: 1.2.5 + es5-shim: 4.6.2 es6-shim: 0.35.6 - function.prototype.name: 1.1.4 + function.prototype.name: 1.1.5 globalthis: 1.0.2 - object.entries: 1.1.4 - object.fromentries: 2.0.4 - object.getownpropertydescriptors: 2.1.2 - object.values: 1.1.4 - promise.allsettled: 1.0.4 - promise.prototype.finally: 3.1.2 - string.prototype.matchall: 4.0.5 - string.prototype.padend: 3.1.2 - string.prototype.padstart: 3.1.2 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.getownpropertydescriptors: 2.1.3 + object.values: 1.1.5 + promise.allsettled: 1.0.5 + promise.prototype.finally: 3.1.3 + string.prototype.matchall: 4.0.6 + string.prototype.padend: 3.1.3 + string.prototype.padstart: 3.1.3 symbol.prototype.description: 1.0.5 dev: true @@ -8358,14 +10829,23 @@ packages: uri-js: 4.4.1 dev: true + /ajv/8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /alphanum-sort/1.0.2: resolution: {integrity: sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=} dev: true - /ansi-align/3.0.0: - resolution: {integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==} + /ansi-align/3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: - string-width: 3.1.0 + string-width: 4.2.3 dev: true /ansi-colors/3.2.4: @@ -8385,6 +10865,12 @@ packages: type-fest: 0.21.3 dev: true + /ansi-html-community/0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + /ansi-html/0.0.7: resolution: {integrity: sha1-gTWEAhliqenm/QOflA0S9WynhZ4=} engines: {'0': node >= 0.8.0} @@ -8406,6 +10892,11 @@ packages: engines: {node: '>=8'} dev: true + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + /ansi-styles/1.0.0: resolution: {integrity: sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=} engines: {node: '>=0.8.0'} @@ -8472,8 +10963,8 @@ packages: resolution: {integrity: sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=} dev: true - /are-we-there-yet/1.1.5: - resolution: {integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==} + /are-we-there-yet/1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} dependencies: delegates: 1.0.0 readable-stream: 2.3.7 @@ -8485,6 +10976,10 @@ packages: sprintf-js: 1.0.3 dev: true + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /aria-query/4.2.2: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} @@ -8547,6 +11042,17 @@ packages: is-string: 1.0.7 dev: true + /array-includes/3.1.4: + resolution: {integrity: sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + get-intrinsic: 1.1.1 + is-string: 1.0.7 + dev: true + /array-union/1.0.2: resolution: {integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=} engines: {node: '>=0.10.0'} @@ -8569,13 +11075,13 @@ packages: engines: {node: '>=0.10.0'} dev: true - /array.prototype.filter/1.0.0: - resolution: {integrity: sha512-TfO1gz+tLm+Bswq0FBOXPqAchtCr2Rn48T8dLJoRFl8NoEosjZmzptmuo1X8aZBzZcqsR1W8U761tjACJtngTQ==} + /array.prototype.filter/1.0.1: + resolution: {integrity: sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -8589,6 +11095,15 @@ packages: es-abstract: 1.18.5 dev: true + /array.prototype.flat/1.2.5: + resolution: {integrity: sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + /array.prototype.flatmap/1.2.4: resolution: {integrity: sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==} engines: {node: '>= 0.4'} @@ -8599,13 +11114,22 @@ packages: function-bind: 1.1.1 dev: true - /array.prototype.map/1.0.3: - resolution: {integrity: sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA==} + /array.prototype.flatmap/1.2.5: + resolution: {integrity: sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 + dev: true + + /array.prototype.map/1.0.4: + resolution: {integrity: sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -8634,8 +11158,8 @@ packages: safer-buffer: 2.1.2 dev: true - /asn1/0.2.4: - resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 dev: true @@ -8667,11 +11191,6 @@ packages: resolution: {integrity: sha1-9wtzXGvKGlycItmCw+Oef+ujva0=} dev: true - /astral-regex/1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - dev: true - /astral-regex/2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -8722,6 +11241,22 @@ packages: postcss-value-parser: 4.1.0 dev: true + /autoprefixer/10.4.0_postcss@8.3.11: + resolution: {integrity: sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.17.6 + caniuse-lite: 1.0.30001276 + fraction.js: 4.1.1 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + /autoprefixer/9.8.6: resolution: {integrity: sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==} hasBin: true @@ -8735,6 +11270,19 @@ packages: postcss-value-parser: 4.1.0 dev: true + /autoprefixer/9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} + hasBin: true + dependencies: + browserslist: 4.17.6 + caniuse-lite: 1.0.30001276 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + picocolors: 0.2.1 + postcss: 7.0.39 + postcss-value-parser: 4.1.0 + dev: true + /ava/3.15.0: resolution: {integrity: sha512-HGAnk1SHPk4Sx6plFAUkzV/XC1j9+iQhOzt4vBly18/yo0AV8Oytx7mtJd/CR8igCJ5p160N/Oo/cNJi2uSeWA==} engines: {node: '>=10.18.0 <11 || >=12.14.0 <12.17.0 || >=12.17.0 <13 || >=14.0.0 <15 || >=15'} @@ -8818,33 +11366,29 @@ packages: engines: {node: '>=4'} dev: true + /axe-core/4.3.5: + resolution: {integrity: sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==} + engines: {node: '>=4'} + dev: true + /axios/0.21.1: resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==} dependencies: follow-redirects: 1.14.2 transitivePeerDependencies: - debug + dev: false - /axobject-query/2.2.0: - resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} - dev: true - - /babel-eslint/10.1.0_eslint@6.8.0: - resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} - engines: {node: '>=6'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - peerDependencies: - eslint: '>= 4.12.1' + /axios/0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - '@babel/code-frame': 7.14.5 - '@babel/parser': 7.15.3 - '@babel/traverse': 7.15.0 - '@babel/types': 7.15.0 - eslint: 6.8.0 - eslint-visitor-keys: 1.3.0 - resolve: 1.20.0 + follow-redirects: 1.14.5_debug@4.3.2 transitivePeerDependencies: - - supports-color + - debug + dev: true + + /axobject-query/2.2.0: + resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true /babel-esm-plugin/0.9.0_webpack@4.46.0: @@ -8884,6 +11428,25 @@ packages: - supports-color dev: true + /babel-jest/27.3.1_@babel+core@7.16.0: + resolution: {integrity: sha512-SjIF8hh/ir0peae2D6S6ZKRhUy7q/DnpH7k/V6fT4Bgs/LXXUztOpX4G2tCgq8mLo5HA9mN6NmlFMeYtKmIsTQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.16.0 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 + '@types/babel__core': 7.1.16 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.2.0_@babel+core@7.16.0 + chalk: 4.1.2 + graceful-fs: 4.2.8 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-loader/8.2.2_@babel+core@7.13.16: resolution: {integrity: sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==} engines: {node: '>= 8.9'} @@ -8913,6 +11476,21 @@ packages: webpack: 4.46.0 dev: true + /babel-loader/8.2.3_1bd60a6cd0f7024f034efd75ae733a3f: + resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.16.0 + find-cache-dir: 3.3.2 + loader-utils: 1.4.0 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 4.46.0 + dev: true + /babel-plugin-apply-mdx-type-prop/1.6.22_@babel+core@7.12.9: resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} peerDependencies: @@ -8932,7 +11510,7 @@ packages: /babel-plugin-emotion/10.2.2: resolution: {integrity: sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==} dependencies: - '@babel/helper-module-imports': 7.14.5 + '@babel/helper-module-imports': 7.16.0 '@emotion/hash': 0.8.0 '@emotion/memoize': 0.7.4 '@emotion/serialize': 0.11.16 @@ -8963,6 +11541,19 @@ packages: - supports-color dev: true + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.1.0 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-jest-hoist/26.6.2: resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} engines: {node: '>= 10.14.2'} @@ -8973,10 +11564,20 @@ packages: '@types/babel__traverse': 7.14.2 dev: true + /babel-plugin-jest-hoist/27.2.0: + resolution: {integrity: sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.16.0 + '@babel/types': 7.16.0 + '@types/babel__core': 7.1.16 + '@types/babel__traverse': 7.14.2 + dev: true + /babel-plugin-macros/2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 cosmiconfig: 6.0.0 resolve: 1.20.0 dev: true @@ -8985,44 +11586,57 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.15.3 - cosmiconfig: 7.0.0 + '@babel/runtime': 7.16.0 + cosmiconfig: 7.0.1 resolve: 1.20.0 dev: true - /babel-plugin-polyfill-corejs2/0.2.2: + /babel-plugin-polyfill-corejs2/0.2.2_@babel+core@7.13.16: resolution: {integrity: sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.15.0 - '@babel/helper-define-polyfill-provider': 0.2.3 + '@babel/core': 7.13.16 + '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.13.16 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs2/0.2.2_@babel+core@7.13.16: + /babel-plugin-polyfill-corejs2/0.2.2_@babel+core@7.15.0: resolution: {integrity: sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.15.0 - '@babel/core': 7.13.16 - '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.13.16 + '@babel/core': 7.15.0 + '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.15.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs2/0.2.2_@babel+core@7.15.0: - resolution: {integrity: sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==} + /babel-plugin-polyfill-corejs2/0.2.3: + resolution: {integrity: sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.15.0 - '@babel/core': 7.15.0 - '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.15.0 + '@babel/compat-data': 7.16.0 + '@babel/helper-define-polyfill-provider': 0.2.4 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs2/0.2.3_@babel+core@7.16.0: + resolution: {integrity: sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.16.0 + '@babel/core': 7.16.0 + '@babel/helper-define-polyfill-provider': 0.2.4_@babel+core@7.16.0 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -9035,18 +11649,19 @@ packages: dependencies: '@babel/core': 7.15.0 '@babel/helper-define-polyfill-provider': 0.1.5_@babel+core@7.15.0 - core-js-compat: 3.16.2 + core-js-compat: 3.19.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.2.4: - resolution: {integrity: sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==} + /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.16.0: + resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-define-polyfill-provider': 0.2.3 - core-js-compat: 3.16.2 + '@babel/core': 7.16.0 + '@babel/helper-define-polyfill-provider': 0.1.5_@babel+core@7.16.0 + core-js-compat: 3.19.1 transitivePeerDependencies: - supports-color dev: true @@ -9075,12 +11690,25 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.2.2: - resolution: {integrity: sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==} + /babel-plugin-polyfill-corejs3/0.3.0: + resolution: {integrity: sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-define-polyfill-provider': 0.2.3 + '@babel/helper-define-polyfill-provider': 0.2.4 + core-js-compat: 3.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.3.0_@babel+core@7.16.0: + resolution: {integrity: sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-define-polyfill-provider': 0.2.4_@babel+core@7.16.0 + core-js-compat: 3.19.1 transitivePeerDependencies: - supports-color dev: true @@ -9107,6 +11735,27 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-regenerator/0.2.3: + resolution: {integrity: sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-define-polyfill-provider': 0.2.4 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.2.3_@babel+core@7.16.0: + resolution: {integrity: sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-define-polyfill-provider': 0.2.4_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-syntax-jsx/6.18.0: resolution: {integrity: sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=} dev: true @@ -9143,6 +11792,26 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.15.0 dev: true + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.16.0: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.0 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.0 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.0 + dev: true + /babel-preset-jest/26.6.2_@babel+core@7.15.0: resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} engines: {node: '>= 10.14.2'} @@ -9154,6 +11823,17 @@ packages: babel-preset-current-node-syntax: 1.0.1_@babel+core@7.15.0 dev: true + /babel-preset-jest/27.2.0_@babel+core@7.16.0: + resolution: {integrity: sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + babel-plugin-jest-hoist: 27.2.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.0 + dev: true + /babel-runtime/6.26.0: resolution: {integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4=} dependencies: @@ -9305,25 +11985,25 @@ packages: resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==} engines: {node: '>=8'} dependencies: - ansi-align: 3.0.0 + ansi-align: 3.0.1 camelcase: 5.3.1 chalk: 3.0.0 cli-boxes: 2.2.1 - string-width: 4.2.2 + string-width: 4.2.3 term-size: 2.2.1 type-fest: 0.8.1 widest-line: 3.1.0 dev: true - /boxen/5.0.1: - resolution: {integrity: sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==} + /boxen/5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} dependencies: - ansi-align: 3.0.0 + ansi-align: 3.0.1 camelcase: 6.2.0 chalk: 4.1.2 cli-boxes: 2.2.1 - string-width: 4.2.2 + string-width: 4.2.3 type-fest: 0.20.2 widest-line: 3.1.0 wrap-ansi: 7.0.0 @@ -9434,10 +12114,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001251 - electron-to-chromium: 1.3.813 + caniuse-lite: 1.0.30001276 + electron-to-chromium: 1.3.888 escalade: 3.1.1 - node-releases: 1.1.75 + node-releases: 1.1.77 dev: true /browserslist/4.16.8: @@ -9452,6 +12132,18 @@ packages: node-releases: 1.1.75 dev: true + /browserslist/4.17.6: + resolution: {integrity: sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001276 + electron-to-chromium: 1.3.888 + escalade: 3.1.1 + node-releases: 2.0.1 + picocolors: 1.0.0 + dev: true + /bser/2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: @@ -9529,7 +12221,7 @@ packages: bluebird: 3.7.2 chownr: 1.1.4 figgy-pudding: 3.5.2 - glob: 7.1.7 + glob: 7.2.0 graceful-fs: 4.2.8 infer-owner: 1.0.4 lru-cache: 5.1.1 @@ -9543,17 +12235,18 @@ packages: y18n: 4.0.3 dev: true - /cacache/15.2.0: - resolution: {integrity: sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==} + /cacache/15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} dependencies: + '@npmcli/fs': 1.0.0 '@npmcli/move-file': 1.1.2 chownr: 2.0.0 fs-minipass: 2.1.0 - glob: 7.1.7 + glob: 7.2.0 infer-owner: 1.0.4 lru-cache: 6.0.0 - minipass: 3.1.3 + minipass: 3.1.5 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -9562,7 +12255,7 @@ packages: promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 - tar: 6.1.10 + tar: 6.1.11 unique-filename: 1.1.1 dev: true @@ -9675,8 +12368,8 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.16.8 - caniuse-lite: 1.0.30001251 + browserslist: 4.17.6 + caniuse-lite: 1.0.30001276 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true @@ -9685,6 +12378,10 @@ packages: resolution: {integrity: sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==} dev: true + /caniuse-lite/1.0.30001276: + resolution: {integrity: sha512-psUNoaG1ilknZPxi8HuhQWobuhLqtYSRUxplfVkEJdgZNB9TETVYGSBtv4YyfAdGvE6gn2eb0ztiXqHoWJcGnw==} + dev: true + /capture-exit/2.0.0: resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} engines: {node: 6.* || 8.* || >= 10.*} @@ -9773,18 +12470,14 @@ packages: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} dev: true - /chardet/0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true - /cheerio-select/1.5.0: resolution: {integrity: sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==} dependencies: css-select: 4.1.3 - css-what: 5.0.1 + css-what: 5.1.0 domelementtype: 2.2.0 - domhandler: 4.2.0 - domutils: 2.7.0 + domhandler: 4.2.2 + domutils: 2.8.0 dev: true /cheerio/1.0.0-rc.10: @@ -9793,7 +12486,7 @@ packages: dependencies: cheerio-select: 1.5.0 dom-serializer: 1.3.2 - domhandler: 4.2.0 + domhandler: 4.2.2 htmlparser2: 6.1.0 parse5: 6.0.1 parse5-htmlparser2-tree-adapter: 6.0.1 @@ -9810,7 +12503,7 @@ packages: glob-parent: 3.1.0 inherits: 2.0.4 is-binary-path: 1.0.1 - is-glob: 4.0.1 + is-glob: 4.0.3 normalize-path: 3.0.0 path-is-absolute: 1.0.1 readdirp: 2.2.1 @@ -9827,7 +12520,7 @@ packages: braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 - is-glob: 4.0.1 + is-glob: 4.0.3 normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: @@ -9852,8 +12545,8 @@ packages: resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} dev: true - /ci-env/1.16.0: - resolution: {integrity: sha512-ucF9caQEX5wQlY449KZBIJPx91+kRg9tJ3tWSc4+KzrvC5KNiPm/3g1noP8VhdI3046+Vw3jLmKAD0fjCRJTmw==} + /ci-env/1.17.0: + resolution: {integrity: sha512-NtTjhgSEqv4Aj90TUYHQLxHdnCPXnjdtuGG1X8lTfp/JqeXTdw0FTWl/vUAPuvbWZTF8QVpv6ASe/XacE+7R2A==} dev: true /ci-info/2.0.0: @@ -9879,6 +12572,10 @@ packages: resolution: {integrity: sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==} dev: true + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -9893,8 +12590,8 @@ packages: resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==} dev: true - /clean-css/4.2.3: - resolution: {integrity: sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==} + /clean-css/4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} engines: {node: '>= 4.0'} dependencies: source-map: 0.6.1 @@ -9922,8 +12619,8 @@ packages: restore-cursor: 3.1.0 dev: true - /cli-spinners/2.6.0: - resolution: {integrity: sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==} + /cli-spinners/2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} engines: {node: '>=6'} dev: true @@ -9932,7 +12629,7 @@ packages: engines: {node: 10.* || >= 12.*} dependencies: object-assign: 4.1.1 - string-width: 4.2.2 + string-width: 4.2.3 optionalDependencies: colors: 1.4.0 dev: true @@ -9945,11 +12642,6 @@ packages: string-width: 4.2.2 dev: true - /cli-width/3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true - /cliui/5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: @@ -9969,8 +12661,8 @@ packages: /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: - string-width: 4.2.2 - strip-ansi: 6.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 wrap-ansi: 7.0.0 dev: true @@ -9994,6 +12686,11 @@ packages: engines: {node: '>=0.8'} dev: true + /clsx/1.1.1: + resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} + engines: {node: '>=6'} + dev: true + /co/4.6.0: resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -10071,8 +12768,8 @@ packages: color-string: 1.6.0 dev: true - /colord/2.7.0: - resolution: {integrity: sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q==} + /colord/2.9.1: + resolution: {integrity: sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw==} dev: true /colorette/1.3.0: @@ -10148,7 +12845,7 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} dependencies: - mime-db: 1.49.0 + mime-db: 1.50.0 dev: true /compression-webpack-plugin/6.1.1_webpack@4.46.0: @@ -10157,8 +12854,8 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - cacache: 15.2.0 - find-cache-dir: 3.3.1 + cacache: 15.3.0 + find-cache-dir: 3.3.2 schema-utils: 3.1.1 serialize-javascript: 5.0.1 webpack: 4.46.0 @@ -10319,12 +13016,12 @@ packages: peerDependencies: webpack: ^4.37.0 || ^5.0.0 dependencies: - cacache: 15.2.0 + cacache: 15.3.0 fast-glob: 3.2.7 - find-cache-dir: 3.3.1 + find-cache-dir: 3.3.2 glob-parent: 5.1.2 globby: 11.0.4 - loader-utils: 2.0.0 + loader-utils: 2.0.2 normalize-path: 3.0.0 p-limit: 3.1.0 schema-utils: 3.1.1 @@ -10340,11 +13037,23 @@ packages: semver: 7.0.0 dev: true + /core-js-compat/3.19.1: + resolution: {integrity: sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==} + dependencies: + browserslist: 4.17.6 + semver: 7.0.0 + dev: true + /core-js-pure/3.16.2: resolution: {integrity: sha512-oxKe64UH049mJqrKkynWp6Vu0Rlm/BTXO/bJZuN2mmR3RtOFNepLlSWDd1eo16PzHpQAoNG97rLU1V/YxesJjw==} requiresBuild: true dev: true + /core-js-pure/3.19.1: + resolution: {integrity: sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==} + requiresBuild: true + dev: true + /core-js/2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. @@ -10356,10 +13065,19 @@ packages: requiresBuild: true dev: true + /core-js/3.19.1: + resolution: {integrity: sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==} + requiresBuild: true + dev: true + /core-util-is/1.0.2: resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} dev: true + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + /cosmiconfig/5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} @@ -10381,8 +13099,8 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig/7.0.0: - resolution: {integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==} + /cosmiconfig/7.0.1: + resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.0 @@ -10476,7 +13194,7 @@ packages: jsdom: 12.2.0 minimatch: 3.0.4 parse5: 4.0.0 - postcss: 7.0.36 + postcss: 7.0.39 pretty-bytes: 4.0.2 webpack-log: 2.0.0 webpack-sources: 1.4.3 @@ -10550,17 +13268,17 @@ packages: resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} engines: {node: '>4'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 timsort: 0.3.0 dev: true - /css-declaration-sorter/6.1.1_postcss@8.3.6: - resolution: {integrity: sha512-BZ1aOuif2Sb7tQYY1GeCjG7F++8ggnwUkH5Ictw0mrdpqpEd+zWmcPdstnH2TItlb74FqR0DrVEieon221T/1Q==} + /css-declaration-sorter/6.1.3_postcss@8.3.11: + resolution: {integrity: sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==} engines: {node: '>= 10'} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 timsort: 0.3.0 dev: true @@ -10575,7 +13293,7 @@ packages: icss-utils: 4.1.1 loader-utils: 1.4.0 normalize-path: 3.0.0 - postcss: 7.0.36 + postcss: 7.0.39 postcss-modules-extract-imports: 2.0.0 postcss-modules-local-by-default: 3.0.3 postcss-modules-scope: 2.2.0 @@ -10592,13 +13310,13 @@ packages: peerDependencies: webpack: ^4.27.0 || ^5.0.0 dependencies: - icss-utils: 5.1.0_postcss@8.3.6 - loader-utils: 2.0.0 - postcss: 8.3.6 - postcss-modules-extract-imports: 3.0.0_postcss@8.3.6 - postcss-modules-local-by-default: 4.0.0_postcss@8.3.6 - postcss-modules-scope: 3.0.0_postcss@8.3.6 - postcss-modules-values: 4.0.0_postcss@8.3.6 + icss-utils: 5.1.0_postcss@8.3.11 + loader-utils: 2.0.2 + postcss: 8.3.11 + postcss-modules-extract-imports: 3.0.0_postcss@8.3.11 + postcss-modules-local-by-default: 4.0.0_postcss@8.3.11 + postcss-modules-scope: 3.0.0_postcss@8.3.11 + postcss-modules-values: 4.0.0_postcss@8.3.11 postcss-value-parser: 4.1.0 schema-utils: 3.1.1 semver: 7.3.5 @@ -10622,10 +13340,10 @@ packages: resolution: {integrity: sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==} dependencies: boolbase: 1.0.0 - css-what: 5.0.1 - domhandler: 4.2.0 - domutils: 2.7.0 - nth-check: 2.0.0 + css-what: 5.1.0 + domhandler: 4.2.2 + domutils: 2.8.0 + nth-check: 2.0.1 dev: true /css-tree/1.0.0-alpha.37: @@ -10649,8 +13367,8 @@ packages: engines: {node: '>= 6'} dev: true - /css-what/5.0.1: - resolution: {integrity: sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==} + /css-what/5.1.0: + resolution: {integrity: sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==} engines: {node: '>= 6'} dev: true @@ -10675,7 +13393,7 @@ packages: dependencies: css-declaration-sorter: 4.0.1 cssnano-util-raw-cache: 4.0.1 - postcss: 7.0.36 + postcss: 7.0.39 postcss-calc: 7.0.5 postcss-colormin: 4.0.3 postcss-convert-values: 4.0.1 @@ -10705,42 +13423,42 @@ packages: postcss-unique-selectors: 4.0.1 dev: true - /cssnano-preset-default/5.1.4_postcss@8.3.6: - resolution: {integrity: sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ==} + /cssnano-preset-default/5.1.5_postcss@8.3.11: + resolution: {integrity: sha512-fF00UI+d3PWkGfMd62geqmoUe5h+LOhGE2GH4Fqq3beNKdCU1LWwLUyIcu4/A72lWv0737cHey5zhhWw3rW0sA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.1.1_postcss@8.3.6 - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 - postcss-calc: 8.0.0_postcss@8.3.6 - postcss-colormin: 5.2.0_postcss@8.3.6 - postcss-convert-values: 5.0.1_postcss@8.3.6 - postcss-discard-comments: 5.0.1_postcss@8.3.6 - postcss-discard-duplicates: 5.0.1_postcss@8.3.6 - postcss-discard-empty: 5.0.1_postcss@8.3.6 - postcss-discard-overridden: 5.0.1_postcss@8.3.6 - postcss-merge-longhand: 5.0.2_postcss@8.3.6 - postcss-merge-rules: 5.0.2_postcss@8.3.6 - postcss-minify-font-values: 5.0.1_postcss@8.3.6 - postcss-minify-gradients: 5.0.2_postcss@8.3.6 - postcss-minify-params: 5.0.1_postcss@8.3.6 - postcss-minify-selectors: 5.1.0_postcss@8.3.6 - postcss-normalize-charset: 5.0.1_postcss@8.3.6 - postcss-normalize-display-values: 5.0.1_postcss@8.3.6 - postcss-normalize-positions: 5.0.1_postcss@8.3.6 - postcss-normalize-repeat-style: 5.0.1_postcss@8.3.6 - postcss-normalize-string: 5.0.1_postcss@8.3.6 - postcss-normalize-timing-functions: 5.0.1_postcss@8.3.6 - postcss-normalize-unicode: 5.0.1_postcss@8.3.6 - postcss-normalize-url: 5.0.2_postcss@8.3.6 - postcss-normalize-whitespace: 5.0.1_postcss@8.3.6 - postcss-ordered-values: 5.0.2_postcss@8.3.6 - postcss-reduce-initial: 5.0.1_postcss@8.3.6 - postcss-reduce-transforms: 5.0.1_postcss@8.3.6 - postcss-svgo: 5.0.2_postcss@8.3.6 - postcss-unique-selectors: 5.0.1_postcss@8.3.6 + css-declaration-sorter: 6.1.3_postcss@8.3.11 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-calc: 8.0.0_postcss@8.3.11 + postcss-colormin: 5.2.1_postcss@8.3.11 + postcss-convert-values: 5.0.2_postcss@8.3.11 + postcss-discard-comments: 5.0.1_postcss@8.3.11 + postcss-discard-duplicates: 5.0.1_postcss@8.3.11 + postcss-discard-empty: 5.0.1_postcss@8.3.11 + postcss-discard-overridden: 5.0.1_postcss@8.3.11 + postcss-merge-longhand: 5.0.2_postcss@8.3.11 + postcss-merge-rules: 5.0.2_postcss@8.3.11 + postcss-minify-font-values: 5.0.1_postcss@8.3.11 + postcss-minify-gradients: 5.0.3_postcss@8.3.11 + postcss-minify-params: 5.0.1_postcss@8.3.11 + postcss-minify-selectors: 5.1.0_postcss@8.3.11 + postcss-normalize-charset: 5.0.1_postcss@8.3.11 + postcss-normalize-display-values: 5.0.1_postcss@8.3.11 + postcss-normalize-positions: 5.0.1_postcss@8.3.11 + postcss-normalize-repeat-style: 5.0.1_postcss@8.3.11 + postcss-normalize-string: 5.0.1_postcss@8.3.11 + postcss-normalize-timing-functions: 5.0.1_postcss@8.3.11 + postcss-normalize-unicode: 5.0.1_postcss@8.3.11 + postcss-normalize-url: 5.0.2_postcss@8.3.11 + postcss-normalize-whitespace: 5.0.1_postcss@8.3.11 + postcss-ordered-values: 5.0.2_postcss@8.3.11 + postcss-reduce-initial: 5.0.1_postcss@8.3.11 + postcss-reduce-transforms: 5.0.1_postcss@8.3.11 + postcss-svgo: 5.0.3_postcss@8.3.11 + postcss-unique-selectors: 5.0.1_postcss@8.3.11 dev: true /cssnano-util-get-arguments/4.0.0: @@ -10757,7 +13475,7 @@ packages: resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true /cssnano-util-same-parent/4.0.1: @@ -10765,13 +13483,13 @@ packages: engines: {node: '>=6.9.0'} dev: true - /cssnano-utils/2.0.1_postcss@8.3.6: + /cssnano-utils/2.0.1_postcss@8.3.11: resolution: {integrity: sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 dev: true /cssnano/4.1.11: @@ -10781,19 +13499,19 @@ packages: cosmiconfig: 5.2.1 cssnano-preset-default: 4.0.8 is-resolvable: 1.1.0 - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /cssnano/5.0.8_postcss@8.3.6: - resolution: {integrity: sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg==} + /cssnano/5.0.9_postcss@8.3.11: + resolution: {integrity: sha512-Y4olTKBKsPKl5izpcXHRDiB/1rVdbIDM4qVXgEKBt466kYT42SEEsnCYOQFFXzEkUYV8pJNCII9JKzb8KfDk+g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.1.4_postcss@8.3.6 + cssnano-preset-default: 5.1.5_postcss@8.3.11 is-resolvable: 1.1.0 lilconfig: 2.0.3 - postcss: 8.3.6 + postcss: 8.3.11 yaml: 1.10.2 dev: true @@ -10825,12 +13543,12 @@ packages: cssom: 0.3.8 dev: true - /csstype/2.6.17: - resolution: {integrity: sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==} + /csstype/2.6.18: + resolution: {integrity: sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==} dev: true - /csstype/3.0.8: - resolution: {integrity: sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==} + /csstype/3.0.9: + resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} dev: true /currently-unhandled/0.4.1: @@ -10882,6 +13600,11 @@ packages: engines: {node: '>=0.11'} dev: false + /date-fns/2.25.0: + resolution: {integrity: sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w==} + engines: {node: '>=0.11'} + dev: false + /date-time/3.1.0: resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} engines: {node: '>=6'} @@ -10959,6 +13682,10 @@ packages: mimic-response: 1.0.1 dev: true + /dedent/0.7.0: + resolution: {integrity: sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=} + dev: true + /deep-equal/1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: @@ -10975,8 +13702,8 @@ packages: engines: {node: '>=4.0.0'} dev: true - /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==} dev: true /deep-object-diff/1.1.0: @@ -11052,7 +13779,7 @@ packages: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} dependencies: - '@types/glob': 7.1.4 + '@types/glob': 7.2.0 globby: 6.1.0 is-path-cwd: 2.2.0 is-path-in-cwd: 2.1.0 @@ -11138,6 +13865,11 @@ packages: engines: {node: '>= 10.14.2'} dev: true + /diff-sequences/27.0.6: + resolution: {integrity: sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + /diffie-hellman/5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dependencies: @@ -11224,7 +13956,7 @@ packages: resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==} dependencies: domelementtype: 2.2.0 - domhandler: 4.2.0 + domhandler: 4.2.2 entities: 2.2.0 dev: true @@ -11258,8 +13990,8 @@ packages: webidl-conversions: 5.0.0 dev: true - /domhandler/4.2.0: - resolution: {integrity: sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==} + /domhandler/4.2.2: + resolution: {integrity: sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==} engines: {node: '>= 4'} dependencies: domelementtype: 2.2.0 @@ -11272,12 +14004,12 @@ packages: domelementtype: 1.3.1 dev: true - /domutils/2.7.0: - resolution: {integrity: sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==} + /domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: dom-serializer: 1.3.2 domelementtype: 2.2.0 - domhandler: 4.2.0 + domhandler: 4.2.2 dev: true /dot-case/3.0.4: @@ -11328,7 +14060,7 @@ packages: peerDependencies: react: '>=16.12.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 compute-scroll-into-view: 1.0.17 prop-types: 15.7.2 react-is: 17.0.2 @@ -11340,7 +14072,7 @@ packages: peerDependencies: react: '>=16.12.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 compute-scroll-into-view: 1.0.17 prop-types: 15.7.2 react: 16.14.0 @@ -11379,7 +14111,7 @@ packages: /ejs-loader/0.5.0: resolution: {integrity: sha512-iirFqlP3tiFoedNZ7dQcjvechunl054VbW6Ki38T/pabgXMAncduSE0ZXLeVGn1NbmcUJF9Z5TC0EvQ4RIpP9Q==} dependencies: - loader-utils: 2.0.0 + loader-utils: 2.0.2 lodash: 4.17.21 dev: true @@ -11393,6 +14125,10 @@ packages: resolution: {integrity: sha512-YcSRImHt6JZZ2sSuQ4Bzajtk98igQ0iKkksqlzZLzbh4p0OIyJRSvUbsgqfcR8txdfsoYCc4ym306t4p2kP/aw==} dev: true + /electron-to-chromium/1.3.888: + resolution: {integrity: sha512-5iD1zgyPpFER4kJ716VsA4MxQ6x405dxdFNCEK2mITL075VHO5ResjY0xzQUZguCww/KlBxCA6JmBA9sDt1PRw==} + dev: true + /element-resize-detector/1.2.3: resolution: {integrity: sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ==} dependencies: @@ -11421,10 +14157,6 @@ packages: engines: {node: '>=10'} dev: true - /emoji-regex/6.1.1: - resolution: {integrity: sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=} - dev: true - /emoji-regex/7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: true @@ -11453,7 +14185,7 @@ packages: '@emotion/core': ^10.0.27 react: '>=16.3.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 '@emotion/core': 10.1.1_react@16.14.0 '@emotion/weak-memoize': 0.2.5 hoist-non-react-statics: 3.3.2 @@ -11466,7 +14198,7 @@ packages: '@emotion/core': ^10.0.27 react: '>=16.3.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 '@emotion/core': 10.1.1 '@emotion/weak-memoize': 0.2.5 hoist-non-react-statics: 3.3.2 @@ -11534,6 +14266,17 @@ packages: preact: 10.5.14 dev: true + /enzyme-adapter-preact-pure/3.2.0_enzyme@3.11.0+preact@10.5.15: + resolution: {integrity: sha512-A7bxIxUZ1Ty5vBmB6KQSP7GLwuXDZQ297DcYsNtR/AQUSxanIHcxEY8Eqk6mJt03CYwcq9EcAg/+LBAXQr5kvw==} + peerDependencies: + enzyme: ^3.8.0 + preact: ^10.0.0 + dependencies: + array.prototype.flatmap: 1.2.5 + enzyme: 3.11.0 + preact: 10.5.15 + dev: true + /enzyme-shallow-equal/1.0.4: resolution: {integrity: sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==} dependencies: @@ -11544,10 +14287,10 @@ packages: /enzyme/3.11.0: resolution: {integrity: sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==} dependencies: - array.prototype.flat: 1.2.4 + array.prototype.flat: 1.2.5 cheerio: 1.0.0-rc.10 enzyme-shallow-equal: 1.0.4 - function.prototype.name: 1.1.4 + function.prototype.name: 1.1.5 has: 1.0.3 html-element-map: 1.3.1 is-boolean-object: 1.1.2 @@ -11561,11 +14304,11 @@ packages: object-inspect: 1.11.0 object-is: 1.1.5 object.assign: 4.1.2 - object.entries: 1.1.4 - object.values: 1.1.4 + object.entries: 1.1.5 + object.values: 1.1.5 raf: 3.4.1 rst-selector-parser: 2.2.3 - string.prototype.trim: 1.2.4 + string.prototype.trim: 1.2.5 dev: true /equal-length/1.0.1: @@ -11646,6 +14389,32 @@ packages: unbox-primitive: 1.0.1 dev: true + /es-abstract/1.19.1: + resolution: {integrity: sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-symbols: 1.0.2 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.1 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.1 + is-string: 1.0.7 + is-weakref: 1.0.1 + object-inspect: 1.11.0 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: true + /es-array-method-boxes-properly/1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true @@ -11672,8 +14441,8 @@ packages: is-symbol: 1.0.4 dev: true - /es5-shim/4.5.15: - resolution: {integrity: sha512-FYpuxEjMeDvU4rulKqFdukQyZSTpzhg4ScQHrAosrlVpR6GFyaw14f74yn2+4BugniIS0Frpg7TvwZocU4ZMTw==} + /es5-shim/4.6.2: + resolution: {integrity: sha512-n0XTVMGps+Deyr38jtqKPR5F5hb9owYeRQcKJW39eFvzUk/u/9Ww315werRzbiNMnHCUw/YHDPBphTlEnzdi+A==} engines: {node: '>=0.4.0'} dev: true @@ -11685,8 +14454,8 @@ packages: resolution: {integrity: sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==} dev: true - /esbuild/0.12.21: - resolution: {integrity: sha512-7hyXbU3g94aREufI/5nls7Xcc+RGQeZWZApm6hoBaFvt2BPtpT4TjFMQ9Tb1jU8XyBGz00ShmiyflCogphMHFQ==} + /esbuild/0.12.29: + resolution: {integrity: sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==} hasBin: true requiresBuild: true dev: true @@ -11745,7 +14514,7 @@ packages: hasBin: true dependencies: esprima: 4.0.1 - estraverse: 5.2.0 + estraverse: 5.3.0 esutils: 2.0.3 optionator: 0.8.3 optionalDependencies: @@ -11805,17 +14574,21 @@ packages: object.entries: 1.1.3 dev: true - /eslint-config-preact/1.1.4_eslint@6.8.0+typescript@3.9.10: - resolution: {integrity: sha512-j00/BpjPpVoaX8UTpXFPAsfBIzuwJX+sBvgPFyb53Lqi31fM0Oiq516qYXRyaZ7q1BRCjO8s67NCLal6v/Z8Lg==} + /eslint-config-preact/1.2.0_eslint@8.1.0+typescript@4.4.4: + resolution: {integrity: sha512-1jAeR9qi0yotuuki6ROzvi2xacFWGUSFZqWZnqpRDtKS+yIK0gaeTwyQpCb7k5Z3KULBxgN0tdytXaH5e7JBow==} peerDependencies: eslint: 6.x || 7.x dependencies: - babel-eslint: 10.1.0_eslint@6.8.0 - eslint: 6.8.0 - eslint-plugin-compat: 3.13.0_eslint@6.8.0 - eslint-plugin-jest: 23.20.0_eslint@6.8.0+typescript@3.9.10 - eslint-plugin-react: 7.22.0_eslint@6.8.0 - eslint-plugin-react-hooks: 4.2.0_eslint@6.8.0 + '@babel/core': 7.16.0 + '@babel/eslint-parser': 7.16.0_@babel+core@7.16.0+eslint@8.1.0 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.0 + '@babel/plugin-syntax-decorators': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-jsx': 7.16.0_@babel+core@7.16.0 + eslint: 8.1.0 + eslint-plugin-compat: 3.13.0_eslint@8.1.0 + eslint-plugin-jest: 23.20.0_eslint@8.1.0+typescript@4.4.4 + eslint-plugin-react: 7.26.1_eslint@8.1.0 + eslint-plugin-react-hooks: 4.2.0_eslint@8.1.0 transitivePeerDependencies: - supports-color - typescript @@ -11836,7 +14609,7 @@ packages: pkg-dir: 2.0.0 dev: true - /eslint-plugin-compat/3.13.0_eslint@6.8.0: + /eslint-plugin-compat/3.13.0_eslint@8.1.0: resolution: {integrity: sha512-cv8IYMuTXm7PIjMVDN2y4k/KVnKZmoNGHNq27/9dLstOLydKblieIv+oe2BN2WthuXnFNhaNvv3N1Bvl4dbIGA==} engines: {node: '>=9.x'} peerDependencies: @@ -11844,10 +14617,10 @@ packages: dependencies: '@mdn/browser-compat-data': 3.3.14 ast-metadata-inferer: 0.7.0 - browserslist: 4.16.8 - caniuse-lite: 1.0.30001251 - core-js: 3.16.2 - eslint: 6.8.0 + browserslist: 4.17.6 + caniuse-lite: 1.0.30001276 + core-js: 3.19.1 + eslint: 8.1.0 find-up: 5.0.0 lodash.memoize: 4.1.2 semver: 7.3.5 @@ -11875,14 +14648,14 @@ packages: tsconfig-paths: 3.9.0 dev: true - /eslint-plugin-jest/23.20.0_eslint@6.8.0+typescript@3.9.10: + /eslint-plugin-jest/23.20.0_eslint@8.1.0+typescript@4.4.4: resolution: {integrity: sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw==} engines: {node: '>=8'} peerDependencies: eslint: '>=5' dependencies: - '@typescript-eslint/experimental-utils': 2.34.0_eslint@6.8.0+typescript@3.9.10 - eslint: 6.8.0 + '@typescript-eslint/experimental-utils': 2.34.0_eslint@8.1.0+typescript@4.4.4 + eslint: 8.1.0 transitivePeerDependencies: - supports-color - typescript @@ -11908,25 +14681,25 @@ packages: language-tags: 1.0.5 dev: true - /eslint-plugin-react-hooks/4.2.0_eslint@6.8.0: + /eslint-plugin-react-hooks/4.2.0_eslint@7.18.0: resolution: {integrity: sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 dependencies: - eslint: 6.8.0 + eslint: 7.18.0 dev: true - /eslint-plugin-react-hooks/4.2.0_eslint@7.18.0: + /eslint-plugin-react-hooks/4.2.0_eslint@8.1.0: resolution: {integrity: sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 dependencies: - eslint: 7.18.0 + eslint: 8.1.0 dev: true - /eslint-plugin-react/7.22.0_eslint@6.8.0: + /eslint-plugin-react/7.22.0_eslint@7.18.0: resolution: {integrity: sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA==} engines: {node: '>=4'} peerDependencies: @@ -11935,7 +14708,7 @@ packages: array-includes: 3.1.2 array.prototype.flatmap: 1.2.4 doctrine: 2.1.0 - eslint: 6.8.0 + eslint: 7.18.0 has: 1.0.3 jsx-ast-utils: 3.2.0 object.entries: 1.1.3 @@ -11946,24 +14719,27 @@ packages: string.prototype.matchall: 4.0.3 dev: true - /eslint-plugin-react/7.22.0_eslint@7.18.0: - resolution: {integrity: sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA==} + /eslint-plugin-react/7.26.1_eslint@8.1.0: + resolution: {integrity: sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 dependencies: - array-includes: 3.1.2 - array.prototype.flatmap: 1.2.4 + array-includes: 3.1.4 + array.prototype.flatmap: 1.2.5 doctrine: 2.1.0 - eslint: 7.18.0 - has: 1.0.3 - jsx-ast-utils: 3.2.0 - object.entries: 1.1.3 - object.fromentries: 2.0.3 - object.values: 1.1.2 + eslint: 8.1.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.2.1 + minimatch: 3.0.4 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.hasown: 1.1.0 + object.values: 1.1.5 prop-types: 15.7.2 - resolve: 1.19.0 - string.prototype.matchall: 4.0.3 + resolve: 2.0.0-next.3 + semver: 6.3.0 + string.prototype.matchall: 4.0.6 dev: true /eslint-scope/4.0.3: @@ -11982,11 +14758,12 @@ packages: estraverse: 4.3.0 dev: true - /eslint-utils/1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} + /eslint-scope/6.0.0: + resolution: {integrity: sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - eslint-visitor-keys: 1.3.0 + esrecurse: 4.3.0 + estraverse: 5.3.0 dev: true /eslint-utils/2.1.0: @@ -11996,6 +14773,16 @@ packages: eslint-visitor-keys: 1.3.0 dev: true + /eslint-utils/3.0.0_eslint@8.1.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.1.0 + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -12006,50 +14793,14 @@ packages: engines: {node: '>=10'} dev: true - /eslint/6.8.0: - resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - hasBin: true - dependencies: - '@babel/code-frame': 7.14.5 - ajv: 6.12.6 - chalk: 2.4.2 - cross-spawn: 6.0.5 - debug: 4.3.2 - doctrine: 3.0.0 - eslint-scope: 5.1.1 - eslint-utils: 1.4.3 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - esquery: 1.3.1 - esutils: 2.0.3 - file-entry-cache: 5.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 12.4.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - inquirer: 7.3.3 - is-glob: 4.0.1 - js-yaml: 3.14.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.21 - minimatch: 3.0.4 - mkdirp: 0.5.5 - natural-compare: 1.4.0 - optionator: 0.8.3 - progress: 2.0.3 - regexpp: 2.0.1 - semver: 6.3.0 - strip-ansi: 5.2.0 - strip-json-comments: 3.1.1 - table: 5.4.6 - text-table: 0.2.0 - v8-compile-cache: 2.2.0 - transitivePeerDependencies: - - supports-color + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.0.0: + resolution: {integrity: sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /eslint/7.18.0: @@ -12098,20 +14849,58 @@ packages: - supports-color dev: true + /eslint/8.1.0: + resolution: {integrity: sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.0.3 + '@humanwhocodes/config-array': 0.6.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.2 + doctrine: 3.0.0 + enquirer: 2.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 6.0.0 + eslint-utils: 3.0.0_eslint@8.1.0 + eslint-visitor-keys: 3.0.0 + espree: 9.0.0 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.12.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.0.4 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.3.5 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /esm/3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} dev: true - /espree/6.2.1: - resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} - engines: {node: '>=6.0.0'} - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 - eslint-visitor-keys: 1.3.0 - dev: true - /espree/7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} @@ -12121,6 +14910,15 @@ packages: eslint-visitor-keys: 1.3.0 dev: true + /espree/9.0.0: + resolution: {integrity: sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.5.0 + acorn-jsx: 5.3.2_acorn@8.5.0 + eslint-visitor-keys: 3.0.0 + dev: true + /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -12134,11 +14932,18 @@ packages: estraverse: 5.2.0 dev: true + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + /esrecurse/4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: - estraverse: 5.2.0 + estraverse: 5.3.0 dev: true /estraverse/4.3.0: @@ -12151,6 +14956,11 @@ packages: engines: {node: '>=4.0'} dev: true + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + /estree-walker/1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true @@ -12205,7 +15015,7 @@ packages: is-stream: 1.1.0 npm-run-path: 2.0.2 p-finally: 1.0.0 - signal-exit: 3.0.3 + signal-exit: 3.0.5 strip-eof: 1.0.0 dev: true @@ -12224,6 +15034,21 @@ packages: strip-final-newline: 2.0.0 dev: true + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.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.5 + strip-final-newline: 2.0.0 + dev: true + /exit/0.1.2: resolution: {integrity: sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=} engines: {node: '>= 0.8.0'} @@ -12254,6 +15079,18 @@ packages: jest-regex-util: 26.0.0 dev: true + /expect/27.3.1: + resolution: {integrity: sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + ansi-styles: 5.2.0 + jest-get-type: 27.3.1 + jest-matcher-utils: 27.3.1 + jest-message-util: 27.3.1 + jest-regex-util: 27.0.6 + dev: true + /express/4.17.1: resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==} engines: {node: '>= 0.10.0'} @@ -12309,15 +15146,6 @@ packages: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: true - /external-editor/3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - /extglob/2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} @@ -12359,7 +15187,7 @@ packages: '@mrmlnc/readdir-enhanced': 2.2.1 '@nodelib/fs.stat': 1.1.3 glob-parent: 3.1.0 - is-glob: 4.0.1 + is-glob: 4.0.3 merge2: 1.4.1 micromatch: 3.1.10 dev: true @@ -12401,8 +15229,8 @@ packages: reusify: 1.0.4 dev: true - /fastq/1.12.0: - resolution: {integrity: sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==} + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: reusify: 1.0.4 dev: true @@ -12454,15 +15282,15 @@ packages: escape-string-regexp: 1.0.5 dev: true - /file-entry-cache/5.0.1: - resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} - engines: {node: '>=4'} + /file-entry-cache/6.0.0: + resolution: {integrity: sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 2.0.1 + flat-cache: 3.0.4 dev: true - /file-entry-cache/6.0.0: - resolution: {integrity: sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==} + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 @@ -12474,7 +15302,7 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - loader-utils: 2.0.0 + loader-utils: 2.0.2 schema-utils: 3.1.1 webpack: 4.46.0 dev: true @@ -12545,6 +15373,15 @@ packages: pkg-dir: 4.2.0 dev: true + /find-cache-dir/3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + /find-root/1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true @@ -12586,29 +15423,16 @@ packages: micromatch: 3.1.10 dev: true - /flat-cache/2.0.1: - resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} - engines: {node: '>=4'} - dependencies: - flatted: 2.0.2 - rimraf: 2.6.3 - write: 1.0.3 - dev: true - /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.1.1 + flatted: 3.2.2 rimraf: 3.0.2 dev: true - /flatted/2.0.2: - resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} - dev: true - - /flatted/3.1.1: - resolution: {integrity: sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==} + /flatted/3.2.2: + resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} dev: true /flush-write-stream/1.1.1: @@ -12626,6 +15450,19 @@ packages: peerDependenciesMeta: debug: optional: true + dev: false + + /follow-redirects/1.14.5_debug@4.3.2: + resolution: {integrity: sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.2_supports-color@6.1.0 + dev: true /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -12654,7 +15491,7 @@ packages: resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} engines: {node: '>=6.11.5', yarn: '>=1.0.0'} dependencies: - '@babel/code-frame': 7.14.5 + '@babel/code-frame': 7.16.0 chalk: 2.4.2 micromatch: 3.1.10 minimatch: 3.0.4 @@ -12682,13 +15519,45 @@ packages: tapable: 1.1.3 dev: true + /fork-ts-checker-webpack-plugin/6.4.0_831eeee51b9dc6506e4e2983e1c7fb45: + resolution: {integrity: sha512-3I3wFkc4DbzaUDPWEi96wdYGu4EKtxBafhZYm0o4mX51d9bphAY4P3mBl8K5mFXFJqVzHfmdbm9kLGnm7vwwBg==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.16.0 + '@types/json-schema': 7.0.9 + chalk: 4.1.2 + chokidar: 3.5.2 + cosmiconfig: 6.0.0 + deepmerge: 4.2.2 + eslint: 8.1.0 + fs-extra: 9.1.0 + glob: 7.2.0 + memfs: 3.3.0 + minimatch: 3.0.4 + schema-utils: 2.7.0 + semver: 7.3.5 + tapable: 1.1.3 + typescript: 4.4.4 + webpack: 4.46.0 + dev: true + /form-data/2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.32 + mime-types: 2.1.33 dev: true /form-data/3.0.1: @@ -12697,7 +15566,7 @@ packages: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.32 + mime-types: 2.1.33 dev: true /format/0.2.2: @@ -12784,7 +15653,7 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.3 + minipass: 3.1.5 dev: true /fs-monkey/1.0.3: @@ -12836,13 +15705,13 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function.prototype.name/1.1.4: - resolution: {integrity: sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ==} + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 functions-have-names: 1.2.2 dev: true @@ -12866,10 +15735,10 @@ packages: console-control-strings: 1.1.0 has-unicode: 2.0.1 object-assign: 4.1.1 - signal-exit: 3.0.3 + signal-exit: 3.0.5 string-width: 1.0.2 strip-ansi: 3.0.1 - wide-align: 1.1.3 + wide-align: 1.1.5 dev: true /gensync/1.0.0-beta.2: @@ -12931,6 +15800,11 @@ packages: pump: 3.0.0 dev: true + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -12956,10 +15830,8 @@ packages: encoding: 0.1.13 dev: true - /github-slugger/1.3.0: - resolution: {integrity: sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==} - dependencies: - emoji-regex: 6.1.1 + /github-slugger/1.4.0: + resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==} dev: true /gittar/0.1.1: @@ -13002,7 +15874,14 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: - is-glob: 4.0.1 + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 dev: true /glob-promise/3.4.0_glob@7.1.7: @@ -13011,10 +15890,20 @@ packages: peerDependencies: glob: '*' dependencies: - '@types/glob': 7.1.4 + '@types/glob': 7.2.0 glob: 7.1.7 dev: true + /glob-promise/3.4.0_glob@7.2.0: + resolution: {integrity: sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==} + engines: {node: '>=4'} + peerDependencies: + glob: '*' + dependencies: + '@types/glob': 7.2.0 + glob: 7.2.0 + dev: true + /glob-to-regexp/0.3.0: resolution: {integrity: sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=} dev: true @@ -13041,6 +15930,17 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob/7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + /global-dirs/3.0.0: resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==} engines: {node: '>=10'} @@ -13083,6 +15983,13 @@ packages: type-fest: 0.8.1 dev: true + /globals/13.12.0: + resolution: {integrity: sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + /globalthis/1.0.2: resolution: {integrity: sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==} engines: {node: '>= 0.4'} @@ -13097,7 +16004,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.2.7 - ignore: 5.1.8 + ignore: 5.1.9 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -13121,7 +16028,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.2.7 - ignore: 5.1.8 + ignore: 5.1.9 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -13131,7 +16038,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: array-union: 1.0.2 - glob: 7.1.7 + glob: 7.2.0 object-assign: 4.1.1 pify: 2.3.0 pinkie-promise: 2.0.1 @@ -13141,11 +16048,11 @@ packages: resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} engines: {node: '>=6'} dependencies: - '@types/glob': 7.1.4 + '@types/glob': 7.2.0 array-union: 1.0.2 dir-glob: 2.2.2 fast-glob: 2.2.7 - glob: 7.1.7 + glob: 7.2.0 ignore: 4.0.6 pify: 4.0.1 slash: 2.0.0 @@ -13383,7 +16290,7 @@ packages: /hast-util-raw/6.0.1: resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} dependencies: - '@types/hast': 2.3.2 + '@types/hast': 2.3.4 hast-util-from-parse5: 6.0.1 hast-util-to-parse5: 6.0.0 html-void-elements: 1.0.5 @@ -13408,7 +16315,7 @@ packages: /hastscript/6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} dependencies: - '@types/hast': 2.3.2 + '@types/hast': 2.3.4 comma-separated-tokens: 1.0.8 hast-util-parse-selector: 2.2.5 property-information: 5.6.0 @@ -13477,7 +16384,7 @@ packages: /html-element-map/1.3.1: resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==} dependencies: - array.prototype.filter: 1.0.0 + array.prototype.filter: 1.0.1 call-bind: 1.0.2 dev: true @@ -13498,6 +16405,10 @@ packages: resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} dev: true + /html-entities/2.3.2: + resolution: {integrity: sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==} + dev: true + /html-escaper/2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true @@ -13508,7 +16419,7 @@ packages: hasBin: true dependencies: camel-case: 4.1.2 - clean-css: 4.2.3 + clean-css: 4.2.4 commander: 4.1.1 he: 1.2.0 param-case: 3.0.4 @@ -13522,7 +16433,7 @@ packages: hasBin: true dependencies: camel-case: 3.0.0 - clean-css: 4.2.3 + clean-css: 4.2.4 commander: 2.17.1 he: 1.2.0 param-case: 2.1.1 @@ -13569,7 +16480,7 @@ packages: dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.8 - '@types/webpack': 4.41.30 + '@types/webpack': 4.41.31 html-minifier-terser: 5.1.1 loader-utils: 1.4.0 lodash: 4.17.21 @@ -13583,8 +16494,8 @@ packages: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} dependencies: domelementtype: 2.2.0 - domhandler: 4.2.0 - domutils: 2.7.0 + domhandler: 4.2.2 + domutils: 2.8.0 entities: 2.2.0 dev: true @@ -13648,7 +16559,7 @@ packages: engines: {node: '>=4.0.0'} dependencies: http-proxy: 1.18.1_debug@4.3.2 - is-glob: 4.0.1 + is-glob: 4.0.3 lodash: 4.17.21 micromatch: 3.1.10 transitivePeerDependencies: @@ -13660,7 +16571,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.14.2 + follow-redirects: 1.14.5_debug@4.3.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -13694,6 +16605,11 @@ packages: engines: {node: '>=8.12.0'} dev: true + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -13712,22 +16628,26 @@ packages: resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} engines: {node: '>= 6'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /icss-utils/5.1.0_postcss@8.3.6: + /icss-utils/5.1.0_postcss@8.3.11: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 dev: true /idb/6.1.2: resolution: {integrity: sha512-1DNDVu3yDhAZkFDlJf0t7r+GLZ248F5pTAtA7V0oVG3yjmV125qZOx3g0XpAEkGZVYQiFDAsSOnGet2bhugc3w==} dev: true + /idb/6.1.5: + resolution: {integrity: sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==} + dev: true + /identity-obj-proxy/3.0.0: resolution: {integrity: sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=} engines: {node: '>=4'} @@ -13758,6 +16678,11 @@ packages: engines: {node: '>= 4'} dev: true + /ignore/5.1.9: + resolution: {integrity: sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==} + engines: {node: '>= 4'} + dev: true + /immer/8.0.1: resolution: {integrity: sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==} dev: true @@ -13820,6 +16745,15 @@ packages: resolve-cwd: 3.0.0 dev: true + /import-local/3.0.3: + resolution: {integrity: sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + /imurmurhash/0.1.4: resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} engines: {node: '>=0.8.19'} @@ -13870,25 +16804,6 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: true - /inquirer/7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.2 - strip-ansi: 6.0.0 - through: 2.3.8 - dev: true - /internal-ip/4.3.0: resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} engines: {node: '>=6'} @@ -14079,8 +16994,8 @@ packages: has: 1.0.3 dev: true - /is-core-module/2.6.0: - resolution: {integrity: sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==} + /is-core-module/2.8.0: + resolution: {integrity: sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==} dependencies: has: 1.0.3 dev: true @@ -14219,6 +17134,13 @@ packages: is-extglob: 2.1.1 dev: true + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + /is-hexadecimal/1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} dev: true @@ -14380,6 +17302,10 @@ packages: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true + /is-shared-array-buffer/1.0.1: + resolution: {integrity: sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==} + dev: true + /is-stream/1.1.0: resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} engines: {node: '>=0.10.0'} @@ -14427,6 +17353,12 @@ packages: engines: {node: '>=10'} dev: true + /is-weakref/1.0.1: + resolution: {integrity: sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==} + dependencies: + call-bind: 1.0.2 + dev: true + /is-whitespace-character/1.0.4: resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} dev: true @@ -14492,7 +17424,7 @@ packages: /isomorphic-unfetch/3.1.0: resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} dependencies: - node-fetch: 2.6.1 + node-fetch: 2.6.6 unfetch: 4.2.0 dev: true @@ -14505,6 +17437,11 @@ packages: engines: {node: '>=8'} dev: true + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + /istanbul-lib-hook/3.0.0: resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} engines: {node: '>=8'} @@ -14516,9 +17453,22 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.15.0 + '@babel/core': 7.16.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.0.0 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument/5.1.0: + resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.16.0 + '@babel/parser': 7.16.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -14541,7 +17491,7 @@ packages: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: - istanbul-lib-coverage: 3.0.0 + istanbul-lib-coverage: 3.2.0 make-dir: 3.1.0 supports-color: 7.2.0 dev: true @@ -14557,6 +17507,17 @@ packages: - supports-color dev: true + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.2 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + /istanbul-reports/3.0.2: resolution: {integrity: sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==} engines: {node: '>=8'} @@ -14565,15 +17526,23 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /iterate-iterator/1.0.1: - resolution: {integrity: sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==} + /istanbul-reports/3.0.5: + resolution: {integrity: sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /iterate-iterator/1.0.2: + resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} dev: true /iterate-value/1.0.2: resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} dependencies: es-get-iterator: 1.1.2 - iterate-iterator: 1.0.1 + iterate-iterator: 1.0.2 dev: true /jed/1.1.1: @@ -14588,6 +17557,42 @@ packages: throat: 5.0.0 dev: true + /jest-changed-files/27.3.0: + resolution: {integrity: sha512-9DJs9garMHv4RhylUMZgbdCJ3+jHSkpL9aaVKp13xtXAD80qLTLrqcDZL1PHA9dYA0bCI86Nv2BhkLpLhrBcPg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + execa: 5.1.1 + throat: 6.0.1 + dev: true + + /jest-circus/27.3.1: + resolution: {integrity: sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.3.1 + is-generator-fn: 2.1.0 + jest-each: 27.3.1 + jest-matcher-utils: 27.3.1 + jest-message-util: 27.3.1 + jest-runtime: 27.3.1 + jest-snapshot: 27.3.1 + jest-util: 27.3.1 + pretty-format: 27.3.1 + slash: 3.0.0 + stack-utils: 2.0.5 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-cli/26.6.3: resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} engines: {node: '>= 10.14.2'} @@ -14614,6 +17619,36 @@ packages: - utf-8-validate dev: true + /jest-cli/27.3.1: + resolution: {integrity: sha512-WHnCqpfK+6EvT62me6WVs8NhtbjAS4/6vZJnk7/2+oOr50cwAzG4Wxt6RXX0hu6m1169ZGMlhYYUNeKBXCph/Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/types': 27.2.5 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.8 + import-local: 3.0.3 + jest-config: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jest-config/26.6.3: resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} engines: {node: '>= 10.14.2'} @@ -14648,6 +17683,43 @@ packages: - utf-8-validate dev: true + /jest-config/27.3.1: + resolution: {integrity: sha512-KY8xOIbIACZ/vdYCKSopL44I0xboxC751IX+DXL2+Wx6DKNycyEfV3rryC3BPm5Uq/BBqDoMrKuqLEUNJmMKKg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.16.0 + '@jest/test-sequencer': 27.3.1 + '@jest/types': 27.2.5 + babel-jest: 27.3.1_@babel+core@7.16.0 + chalk: 4.1.2 + ci-info: 3.2.0 + deepmerge: 4.2.2 + glob: 7.2.0 + graceful-fs: 4.2.8 + jest-circus: 27.3.1 + jest-environment-jsdom: 27.3.1 + jest-environment-node: 27.3.1 + jest-get-type: 27.3.1 + jest-jasmine2: 27.3.1 + jest-regex-util: 27.0.6 + jest-resolve: 27.3.1 + jest-runner: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 + micromatch: 4.0.4 + pretty-format: 27.3.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /jest-diff/26.6.2: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} engines: {node: '>= 10.14.2'} @@ -14658,6 +17730,16 @@ packages: pretty-format: 26.6.2 dev: true + /jest-diff/27.3.1: + resolution: {integrity: sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.0.6 + jest-get-type: 27.3.1 + pretty-format: 27.3.1 + dev: true + /jest-docblock/26.0.0: resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} engines: {node: '>= 10.14.2'} @@ -14665,6 +17747,13 @@ packages: detect-newline: 3.1.0 dev: true + /jest-docblock/27.0.6: + resolution: {integrity: sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + /jest-each/26.6.2: resolution: {integrity: sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==} engines: {node: '>= 10.14.2'} @@ -14676,6 +17765,17 @@ packages: pretty-format: 26.6.2 dev: true + /jest-each/27.3.1: + resolution: {integrity: sha512-E4SwfzKJWYcvOYCjOxhZcxwL+AY0uFMvdCOwvzgutJiaiodFjkxQQDxHm8FQBeTqDnSmKsQWn7ldMRzTn2zJaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + chalk: 4.1.2 + jest-get-type: 27.3.1 + jest-util: 27.3.1 + pretty-format: 27.3.1 + dev: true + /jest-environment-jsdom/26.6.2: resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} engines: {node: '>= 10.14.2'} @@ -14694,6 +17794,24 @@ packages: - utf-8-validate dev: true + /jest-environment-jsdom/27.3.1: + resolution: {integrity: sha512-3MOy8qMzIkQlfb3W1TfrD7uZHj+xx8Olix5vMENkj5djPmRqndMaXtpnaZkxmxM+Qc3lo+yVzJjzuXbCcZjAlg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.3.1 + '@jest/fake-timers': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + jest-mock: 27.3.0 + jest-util: 27.3.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /jest-environment-node/26.6.2: resolution: {integrity: sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==} engines: {node: '>= 10.14.2'} @@ -14706,18 +17824,35 @@ packages: jest-util: 26.6.2 dev: true + /jest-environment-node/27.3.1: + resolution: {integrity: sha512-T89F/FgkE8waqrTSA7/ydMkcc52uYPgZZ6q8OaZgyiZkJb5QNNCF6oPZjH9IfPFfcc9uBWh1574N0kY0pSvTXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.3.1 + '@jest/fake-timers': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + jest-mock: 27.3.0 + jest-util: 27.3.1 + dev: true + /jest-get-type/26.3.0: resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} engines: {node: '>= 10.14.2'} dev: true + /jest-get-type/27.3.1: + resolution: {integrity: sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + /jest-haste-map/26.6.2: resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.5 - '@types/node': 14.17.10 + '@types/node': 16.11.6 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.8 @@ -14727,7 +17862,27 @@ packages: jest-worker: 26.6.2 micromatch: 4.0.4 sane: 4.1.0 - walker: 1.0.7 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-haste-map/27.3.1: + resolution: {integrity: sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + '@types/graceful-fs': 4.1.5 + '@types/node': 16.11.6 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.8 + jest-regex-util: 27.0.6 + jest-serializer: 27.0.6 + jest-util: 27.3.1 + jest-worker: 27.3.1 + micromatch: 4.0.4 + walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: true @@ -14762,6 +17917,32 @@ packages: - utf-8-validate dev: true + /jest-jasmine2/27.3.1: + resolution: {integrity: sha512-WK11ZUetDQaC09w4/j7o4FZDUIp+4iYWH/Lik34Pv7ukL+DuXFGdnmmi7dT58J2ZYKFB5r13GyE0z3NPeyJmsg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/traverse': 7.16.0 + '@jest/environment': 27.3.1 + '@jest/source-map': 27.0.6 + '@jest/test-result': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.3.1 + is-generator-fn: 2.1.0 + jest-each: 27.3.1 + jest-matcher-utils: 27.3.1 + jest-message-util: 27.3.1 + jest-runtime: 27.3.1 + jest-snapshot: 27.3.1 + jest-util: 27.3.1 + pretty-format: 27.3.1 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-leak-detector/26.6.2: resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} engines: {node: '>= 10.14.2'} @@ -14770,6 +17951,14 @@ packages: pretty-format: 26.6.2 dev: true + /jest-leak-detector/27.3.1: + resolution: {integrity: sha512-78QstU9tXbaHzwlRlKmTpjP9k4Pvre5l0r8Spo4SbFFVy/4Abg9I6ZjHwjg2QyKEAMg020XcjP+UgLZIY50yEg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.3.1 + pretty-format: 27.3.1 + dev: true + /jest-matcher-utils/26.6.2: resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} engines: {node: '>= 10.14.2'} @@ -14780,6 +17969,16 @@ packages: pretty-format: 26.6.2 dev: true + /jest-matcher-utils/27.3.1: + resolution: {integrity: sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.3.1 + jest-get-type: 27.3.1 + pretty-format: 27.3.1 + dev: true + /jest-message-util/26.6.2: resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} engines: {node: '>= 10.14.2'} @@ -14810,6 +18009,21 @@ packages: stack-utils: 2.0.3 dev: true + /jest-message-util/27.3.1: + resolution: {integrity: sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.16.0 + '@jest/types': 27.2.5 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.8 + micromatch: 4.0.4 + pretty-format: 27.3.1 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + /jest-mock/26.6.2: resolution: {integrity: sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==} engines: {node: '>= 10.14.2'} @@ -14818,6 +18032,14 @@ packages: '@types/node': 14.17.10 dev: true + /jest-mock/27.3.0: + resolution: {integrity: sha512-ziZiLk0elZOQjD08bLkegBzv5hCABu/c8Ytx45nJKkysQwGaonvmTxwjLqEA4qGdasq9o2I8/HtdGMNnVsMTGw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@26.6.2: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} @@ -14830,6 +18052,18 @@ packages: jest-resolve: 26.6.2 dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@27.3.1: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.3.1 + dev: true + /jest-preset-preact/4.0.2_9b3f24ae35a87c3c82fffbe3fdf70e1e: resolution: {integrity: sha512-Grgu1scmHcNcU9pKOS4FX8pVPxfqmlKCc6SWkOEg17JiBhvYjVdyxsPw22v/P98iYc6Y+357JSoh5f0lyASr1Q==} peerDependencies: @@ -14853,6 +18087,29 @@ packages: - supports-color dev: true + /jest-preset-preact/4.0.5_726380f5f23d12d9b6cc402fef7b8b84: + resolution: {integrity: sha512-MnU7mfpnwopJkdx0WoEyRmrNDIvRN+w6sOur0zEhaRYYMo0gJM7UdZHWTV8k6uo0+ypY+m0kQW6kMukUx4v8JQ==} + peerDependencies: + jest: 26.x || 27.x + preact: 10.x + preact-render-to-string: 5.x + dependencies: + '@babel/core': 7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/preset-typescript': 7.16.0_@babel+core@7.16.0 + babel-jest: 27.3.1_@babel+core@7.16.0 + identity-obj-proxy: 3.0.0 + isomorphic-unfetch: 3.1.0 + jest: 27.3.1 + jest-watch-typeahead: 0.6.5_jest@27.3.1 + preact: 10.5.15 + preact-render-to-string: 5.1.19_preact@10.5.15 + transitivePeerDependencies: + - supports-color + dev: true + /jest-regex-util/26.0.0: resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} engines: {node: '>= 10.14.2'} @@ -14872,6 +18129,17 @@ packages: jest-snapshot: 26.6.2 dev: true + /jest-resolve-dependencies/27.3.1: + resolution: {integrity: sha512-X7iLzY8pCiYOnvYo2YrK3P9oSE8/3N2f4pUZMJ8IUcZnT81vlSonya1KTO9ZfKGuC+svE6FHK/XOb8SsoRUV1A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + jest-regex-util: 27.0.6 + jest-snapshot: 27.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-resolve/26.6.2: resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} engines: {node: '>= 10.14.2'} @@ -14886,6 +18154,22 @@ packages: slash: 3.0.0 dev: true + /jest-resolve/27.3.1: + resolution: {integrity: sha512-Dfzt25CFSPo3Y3GCbxynRBZzxq9AdyNN+x/v2IqYx6KVT5Z6me2Z/PsSGFSv3cOSUZqJ9pHxilao/I/m9FouLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + chalk: 4.1.2 + graceful-fs: 4.2.8 + jest-haste-map: 27.3.1 + jest-pnp-resolver: 1.2.2_jest-resolve@27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 + resolve: 1.20.0 + resolve.exports: 1.1.0 + slash: 3.0.0 + dev: true + /jest-runner/26.6.3: resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} engines: {node: '>= 10.14.2'} @@ -14918,6 +18202,39 @@ packages: - utf-8-validate dev: true + /jest-runner/27.3.1: + resolution: {integrity: sha512-r4W6kBn6sPr3TBwQNmqE94mPlYVn7fLBseeJfo4E2uCTmAyDFm2O5DYAQAFP7Q3YfiA/bMwg8TVsciP7k0xOww==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.3.1 + '@jest/environment': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.8 + jest-docblock: 27.0.6 + jest-environment-jsdom: 27.3.1 + jest-environment-node: 27.3.1 + jest-haste-map: 27.3.1 + jest-leak-detector: 27.3.1 + jest-message-util: 27.3.1 + jest-resolve: 27.3.1 + jest-runtime: 27.3.1 + jest-util: 27.3.1 + jest-worker: 27.3.1 + source-map-support: 0.5.20 + throat: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /jest-runtime/26.6.3: resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} engines: {node: '>= 10.14.2'} @@ -14958,11 +18275,53 @@ packages: - utf-8-validate dev: true + /jest-runtime/27.3.1: + resolution: {integrity: sha512-qtO6VxPbS8umqhEDpjA4pqTkKQ1Hy4ZSi9mDVeE9Za7LKBo2LdW2jmT+Iod3XFaJqINikZQsn2wEi0j9wPRbLg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.3.1 + '@jest/environment': 27.3.1 + '@jest/globals': 27.3.1 + '@jest/source-map': 27.0.6 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 + '@types/yargs': 16.0.4 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + execa: 5.1.1 + exit: 0.1.2 + glob: 7.2.0 + graceful-fs: 4.2.8 + jest-haste-map: 27.3.1 + jest-message-util: 27.3.1 + jest-mock: 27.3.0 + jest-regex-util: 27.0.6 + jest-resolve: 27.3.1 + jest-snapshot: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 + slash: 3.0.0 + strip-bom: 4.0.0 + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /jest-serializer/26.6.2: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 14.17.10 + '@types/node': 16.11.6 + graceful-fs: 4.2.8 + dev: true + + /jest-serializer/27.0.6: + resolution: {integrity: sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 16.11.6 graceful-fs: 4.2.8 dev: true @@ -14988,12 +18347,44 @@ packages: semver: 7.3.5 dev: true + /jest-snapshot/27.3.1: + resolution: {integrity: sha512-APZyBvSgQgOT0XumwfFu7X3G5elj6TGhCBLbBdn3R1IzYustPGPE38F51dBWMQ8hRXa9je0vAdeVDtqHLvB6lg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/plugin-syntax-typescript': 7.16.0_@babel+core@7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 + '@types/babel__traverse': 7.14.2 + '@types/prettier': 2.4.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.0 + chalk: 4.1.2 + expect: 27.3.1 + graceful-fs: 4.2.8 + jest-diff: 27.3.1 + jest-get-type: 27.3.1 + jest-haste-map: 27.3.1 + jest-matcher-utils: 27.3.1 + jest-message-util: 27.3.1 + jest-resolve: 27.3.1 + jest-util: 27.3.1 + natural-compare: 1.4.0 + pretty-format: 27.3.1 + semver: 7.3.5 + transitivePeerDependencies: + - supports-color + dev: true + /jest-util/26.6.2: resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 14.17.10 + '@types/node': 16.11.6 chalk: 4.1.2 graceful-fs: 4.2.8 is-ci: 2.0.0 @@ -15012,6 +18403,18 @@ packages: picomatch: 2.3.0 dev: true + /jest-util/27.3.1: + resolution: {integrity: sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + chalk: 4.1.2 + ci-info: 3.2.0 + graceful-fs: 4.2.8 + picomatch: 2.3.0 + dev: true + /jest-validate/26.6.2: resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} engines: {node: '>= 10.14.2'} @@ -15024,6 +18427,18 @@ packages: pretty-format: 26.6.2 dev: true + /jest-validate/27.3.1: + resolution: {integrity: sha512-3H0XCHDFLA9uDII67Bwi1Vy7AqwA5HqEEjyy934lgVhtJ3eisw6ShOF1MDmRPspyikef5MyExvIm0/TuLzZ86Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + camelcase: 6.2.0 + chalk: 4.1.2 + jest-get-type: 27.3.1 + leven: 3.1.0 + pretty-format: 27.3.1 + dev: true + /jest-watch-typeahead/0.6.4_jest@26.6.3: resolution: {integrity: sha512-tGxriteVJqonyrDj/xZHa0E2glKMiglMLQqISLCjxLUfeueRBh9VoRF2FKQyYO2xOqrWDTg7781zUejx411ZXA==} engines: {node: '>=10'} @@ -15040,6 +18455,22 @@ packages: strip-ansi: 6.0.0 dev: true + /jest-watch-typeahead/0.6.5_jest@27.3.1: + resolution: {integrity: sha512-GIbV6h37/isatMDtqZlA8Q5vC6T3w+5qdvtF+3LIkPc58zEWzbKmTHvlUIp3wvBm400RzrQWcVPcsAJqKWu7XQ==} + engines: {node: '>=10'} + peerDependencies: + jest: ^26.0.0 || ^27.0.0 + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest: 27.3.1 + jest-regex-util: 27.0.6 + jest-watcher: 27.3.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + dev: true + /jest-watcher/26.6.2: resolution: {integrity: sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==} engines: {node: '>= 10.14.2'} @@ -15066,15 +18497,37 @@ packages: string-length: 4.0.2 dev: true + /jest-watcher/27.3.1: + resolution: {integrity: sha512-9/xbV6chABsGHWh9yPaAGYVVKurWoP3ZMCv6h+O1v9/+pkOroigs6WzZ0e9gLP/njokUwM7yQhr01LKJVMkaZA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.11.6 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.3.1 + string-length: 4.0.2 + dev: true + /jest-worker/26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 14.17.10 + '@types/node': 16.11.6 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true + /jest-worker/27.3.1: + resolution: {integrity: sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 16.11.6 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + /jest/26.6.3: resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} engines: {node: '>= 10.14.2'} @@ -15091,6 +18544,27 @@ packages: - utf-8-validate dev: true + /jest/27.3.1: + resolution: {integrity: sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.3.1 + import-local: 3.0.3 + jest-cli: 27.3.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jju/1.4.0: resolution: {integrity: sha1-o6vicYryQaKykE+EpiWXDzia4yo=} dev: true @@ -15111,6 +18585,13 @@ packages: esprima: 4.0.1 dev: true + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /jsbn/0.1.1: resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} dev: true @@ -15156,7 +18637,7 @@ packages: optional: true dependencies: abab: 2.0.5 - acorn: 8.4.1 + acorn: 8.5.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -15180,7 +18661,7 @@ packages: whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.3 + ws: 7.5.5 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil @@ -15302,6 +18783,10 @@ packages: verror: 1.10.0 dev: true + /jssha/3.2.0: + resolution: {integrity: sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==} + dev: true + /jsx-ast-utils/3.2.0: resolution: {integrity: sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==} engines: {node: '>=4.0'} @@ -15310,6 +18795,14 @@ packages: object.assign: 4.1.2 dev: true + /jsx-ast-utils/3.2.1: + resolution: {integrity: sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.4 + object.assign: 4.1.2 + dev: true + /junk/3.1.0: resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==} engines: {node: '>=8'} @@ -15365,8 +18858,8 @@ packages: engines: {node: '>=6'} dev: true - /klona/2.0.4: - resolution: {integrity: sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==} + /klona/2.0.5: + resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} engines: {node: '>= 8'} dev: true @@ -15398,9 +18891,9 @@ packages: resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} engines: {node: '>=6.0.0', npm: '>=6.0.0', yarn: '>=1.0.0'} dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 app-root-dir: 1.0.2 - core-js: 3.16.2 + core-js: 3.19.1 dotenv: 8.6.0 dotenv-expand: 5.1.0 dev: true @@ -15488,6 +18981,15 @@ packages: json5: 2.2.0 dev: true + /loader-utils/2.0.2: + resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.0 + dev: true + /local-access/1.1.0: resolution: {integrity: sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==} engines: {node: '>=6'} @@ -15547,6 +19049,10 @@ packages: resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} dev: true + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + /lodash.sortby/4.7.0: resolution: {integrity: sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=} dev: true @@ -15659,10 +19165,10 @@ packages: semver: 6.3.0 dev: true - /makeerror/1.0.11: - resolution: {integrity: sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=} + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: - tmpl: 1.0.4 + tmpl: 1.0.5 dev: true /map-age-cleaner/0.1.3: @@ -15772,7 +19278,7 @@ packages: /mdast-util-to-hast/10.0.1: resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} dependencies: - '@types/mdast': 3.0.8 + '@types/mdast': 3.0.10 '@types/unist': 2.0.6 mdast-util-definitions: 4.0.0 mdurl: 1.0.1 @@ -15818,6 +19324,13 @@ packages: fs-monkey: 1.0.3 dev: true + /memfs/3.3.0: + resolution: {integrity: sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.3 + dev: true + /memoizerific/1.11.3: resolution: {integrity: sha1-fIekZGREwy11Q4VwkF8tvRsagFo=} dependencies: @@ -15904,16 +19417,16 @@ packages: brorand: 1.1.0 dev: true - /mime-db/1.49.0: - resolution: {integrity: sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==} + /mime-db/1.50.0: + resolution: {integrity: sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==} engines: {node: '>= 0.6'} dev: true - /mime-types/2.1.32: - resolution: {integrity: sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==} + /mime-types/2.1.33: + resolution: {integrity: sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==} engines: {node: '>= 0.6'} dependencies: - mime-db: 1.49.0 + mime-db: 1.50.0 dev: true /mime/1.6.0: @@ -15928,6 +19441,12 @@ packages: hasBin: true dev: true + /mime/2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -15955,7 +19474,7 @@ packages: peerDependencies: webpack: ^4.4.0 || ^5.0.0 dependencies: - loader-utils: 2.0.0 + loader-utils: 2.0.2 schema-utils: 3.1.1 webpack: 4.46.0 webpack-sources: 1.4.3 @@ -15988,21 +19507,21 @@ packages: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.3 + minipass: 3.1.5 dev: true /minipass-flush/1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.3 + minipass: 3.1.5 dev: true /minipass-pipeline/1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} dependencies: - minipass: 3.1.3 + minipass: 3.1.5 dev: true /minipass/2.9.0: @@ -16012,8 +19531,8 @@ packages: yallist: 3.1.1 dev: true - /minipass/3.1.3: - resolution: {integrity: sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==} + /minipass/3.1.5: + resolution: {integrity: sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 @@ -16029,7 +19548,7 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.3 + minipass: 3.1.5 yallist: 4.0.0 dev: true @@ -16085,8 +19604,8 @@ packages: run-queue: 1.0.3 dev: true - /mri/1.1.6: - resolution: {integrity: sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==} + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} dev: true @@ -16118,10 +19637,6 @@ packages: thunky: 1.1.0 dev: true - /mute-stream/0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true - /nan/2.15.0: resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} dev: true @@ -16133,6 +19648,12 @@ packages: hasBin: true dev: true + /nanoid/3.1.30: + resolution: {integrity: sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /nanomatch/1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -16204,6 +19725,13 @@ packages: resolution: {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==} engines: {node: 4.x || >=6.0.0} + /node-fetch/2.6.6: + resolution: {integrity: sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==} + engines: {node: 4.x || >=6.0.0} + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-fetch/3.0.0: resolution: {integrity: sha512-bKMI+C7/T/SPU1lKnbQbwxptpCrG9ashG+VkytmXCPZyuM9jB6VU+hY0oi4lC8LxTtAeWdckNCTa3nrGsAdA3Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -16277,6 +19805,14 @@ packages: resolution: {integrity: sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==} dev: true + /node-releases/1.1.77: + resolution: {integrity: sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==} + dev: true + + /node-releases/2.0.1: + resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==} + dev: true + /nodent-compiler/3.2.13: resolution: {integrity: sha512-nzzWPXZwSdsWie34om+4dLrT/5l1nT/+ig1v06xuSgMtieJVAnMQFuZihUwREM+M7dFso9YoHfDmweexEXXrrw==} engines: {'0': n, '1': o, '2': d, '3': e, '4': ' ', '5': '>', '6': '=', '7': ' ', '8': '0', '9': ., '10': '1', '11': '0', '12': ., '13': '0'} @@ -16362,7 +19898,7 @@ packages: /npmlog/4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} dependencies: - are-we-there-yet: 1.1.5 + are-we-there-yet: 1.1.7 console-control-strings: 1.1.0 gauge: 2.7.4 set-blocking: 2.0.0 @@ -16374,8 +19910,8 @@ packages: boolbase: 1.0.0 dev: true - /nth-check/2.0.0: - resolution: {integrity: sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==} + /nth-check/2.0.1: + resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} dependencies: boolbase: 1.0.0 dev: true @@ -16495,13 +20031,13 @@ packages: has: 1.0.3 dev: true - /object.entries/1.1.4: - resolution: {integrity: sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==} + /object.entries/1.1.5: + resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 dev: true /object.fromentries/2.0.3: @@ -16514,23 +20050,29 @@ packages: has: 1.0.3 dev: true - /object.fromentries/2.0.4: - resolution: {integrity: sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==} + /object.fromentries/2.0.5: + resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 - has: 1.0.3 + es-abstract: 1.19.1 dev: true - /object.getownpropertydescriptors/2.1.2: - resolution: {integrity: sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==} + /object.getownpropertydescriptors/2.1.3: + resolution: {integrity: sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==} engines: {node: '>= 0.8'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 + dev: true + + /object.hasown/1.1.0: + resolution: {integrity: sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==} + dependencies: + define-properties: 1.1.3 + es-abstract: 1.19.1 dev: true /object.pick/1.3.0: @@ -16550,13 +20092,13 @@ packages: has: 1.0.3 dev: true - /object.values/1.1.4: - resolution: {integrity: sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==} + /object.values/1.1.5: + resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 dev: true /obuf/1.1.2: @@ -16619,9 +20161,9 @@ packages: peerDependencies: webpack: ^4.0.0 dependencies: - cssnano: 5.0.8_postcss@8.3.6 + cssnano: 5.0.9_postcss@8.3.11 last-call-webpack-plugin: 3.0.0 - postcss: 8.3.6 + postcss: 8.3.11 webpack: 4.46.0 dev: true @@ -16629,7 +20171,7 @@ packages: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: - deep-is: 0.1.3 + deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.3.0 prelude-ls: 1.1.2 @@ -16641,7 +20183,7 @@ packages: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} 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 @@ -16656,11 +20198,11 @@ packages: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.6.0 + cli-spinners: 2.6.1 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 wcwidth: 1.0.1 dev: true @@ -16674,11 +20216,6 @@ packages: resolution: {integrity: sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=} dev: true - /os-tmpdir/1.0.2: - resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} - engines: {node: '>=0.10.0'} - dev: true - /overlayscrollbars/1.13.1: resolution: {integrity: sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==} dev: true @@ -16908,7 +20445,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.14.5 + '@babel/code-frame': 7.16.0 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.1.6 @@ -17037,6 +20574,14 @@ packages: resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} dev: true + /picocolors/0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + /picomatch/2.2.2: resolution: {integrity: sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==} engines: {node: '>=8.6'} @@ -17135,20 +20680,20 @@ packages: resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} dev: true - /pnp-webpack-plugin/1.6.4_typescript@3.9.10: + /pnp-webpack-plugin/1.6.4_typescript@4.3.5: resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.2.0_typescript@3.9.10 + ts-pnp: 1.2.0_typescript@4.3.5 transitivePeerDependencies: - typescript dev: true - /pnp-webpack-plugin/1.6.4_typescript@4.3.5: + /pnp-webpack-plugin/1.6.4_typescript@4.4.4: resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.2.0_typescript@4.3.5 + ts-pnp: 1.2.0_typescript@4.4.4 transitivePeerDependencies: - typescript dev: true @@ -17157,7 +20702,16 @@ packages: resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.2.0_typescript@4.3.5 + ts-pnp: 1.2.0_typescript@4.4.3 + transitivePeerDependencies: + - typescript + dev: true + + /pnp-webpack-plugin/1.7.0_typescript@4.4.4: + resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} + engines: {node: '>=6'} + dependencies: + ts-pnp: 1.2.0_typescript@4.4.4 transitivePeerDependencies: - typescript dev: true @@ -17175,7 +20729,7 @@ packages: resolution: {integrity: sha512-ocPAcVBUOryJEKe0z2KLd1l9EBa1r5mSwlKpExmrLzsnIzJo4axsoU9O2BjOTkDGDT4mZ0WFE5XKTlR3nLnZOA==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 dev: true /portfinder/1.0.28: @@ -17195,17 +20749,17 @@ packages: /postcss-calc/7.0.5: resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 postcss-selector-parser: 6.0.6 postcss-value-parser: 4.1.0 dev: true - /postcss-calc/8.0.0_postcss@8.3.6: + /postcss-calc/8.0.0_postcss@8.3.11: resolution: {integrity: sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 postcss-selector-parser: 6.0.6 postcss-value-parser: 4.1.0 dev: true @@ -17214,23 +20768,23 @@ packages: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.16.8 + browserslist: 4.17.6 color: 3.2.1 has: 1.0.3 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-colormin/5.2.0_postcss@8.3.6: - resolution: {integrity: sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==} + /postcss-colormin/5.2.1_postcss@8.3.11: + resolution: {integrity: sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.16.8 + browserslist: 4.17.6 caniuse-api: 3.0.0 - colord: 2.7.0 - postcss: 8.3.6 + colord: 2.9.1 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17238,17 +20792,17 @@ packages: resolution: {integrity: sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-convert-values/5.0.1_postcss@8.3.6: - resolution: {integrity: sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==} + /postcss-convert-values/5.0.2_postcss@8.3.11: + resolution: {integrity: sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17256,70 +20810,70 @@ packages: resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /postcss-discard-comments/5.0.1_postcss@8.3.6: + /postcss-discard-comments/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 dev: true /postcss-discard-duplicates/4.0.2: resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /postcss-discard-duplicates/5.0.1_postcss@8.3.6: + /postcss-discard-duplicates/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 dev: true /postcss-discard-empty/4.0.1: resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /postcss-discard-empty/5.0.1_postcss@8.3.6: + /postcss-discard-empty/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 dev: true /postcss-discard-overridden/4.0.1: resolution: {integrity: sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /postcss-discard-overridden/5.0.1_postcss@8.3.6: + /postcss-discard-overridden/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 dev: true /postcss-flexbugs-fixes/4.2.1: resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true /postcss-load-config/3.1.0: @@ -17343,15 +20897,47 @@ packages: postcss: ^7.0.0 || ^8.0.1 webpack: ^4.0.0 || ^5.0.0 dependencies: - cosmiconfig: 7.0.0 - klona: 2.0.4 - loader-utils: 2.0.0 + cosmiconfig: 7.0.1 + klona: 2.0.5 + loader-utils: 2.0.2 postcss: 7.0.36 schema-utils: 3.1.1 semver: 7.3.5 webpack: 4.46.0 dev: true + /postcss-loader/4.3.0_postcss@7.0.39+webpack@4.46.0: + resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^4.0.0 || ^5.0.0 + dependencies: + cosmiconfig: 7.0.1 + klona: 2.0.5 + loader-utils: 2.0.2 + postcss: 7.0.39 + schema-utils: 3.1.1 + semver: 7.3.5 + webpack: 4.46.0 + dev: true + + /postcss-loader/4.3.0_postcss@8.3.11+webpack@4.46.0: + resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^4.0.0 || ^5.0.0 + dependencies: + cosmiconfig: 7.0.1 + klona: 2.0.5 + loader-utils: 2.0.2 + postcss: 8.3.11 + schema-utils: 3.1.1 + semver: 7.3.5 + webpack: 4.46.0 + dev: true + /postcss-loader/4.3.0_postcss@8.3.6+webpack@4.46.0: resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} engines: {node: '>= 10.13.0'} @@ -17359,9 +20945,9 @@ packages: postcss: ^7.0.0 || ^8.0.1 webpack: ^4.0.0 || ^5.0.0 dependencies: - cosmiconfig: 7.0.0 - klona: 2.0.4 - loader-utils: 2.0.0 + cosmiconfig: 7.0.1 + klona: 2.0.5 + loader-utils: 2.0.2 postcss: 8.3.6 schema-utils: 3.1.1 semver: 7.3.5 @@ -17373,45 +20959,45 @@ packages: engines: {node: '>=6.9.0'} dependencies: css-color-names: 0.0.4 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 stylehacks: 4.0.3 dev: true - /postcss-merge-longhand/5.0.2_postcss@8.3.6: + /postcss-merge-longhand/5.0.2_postcss@8.3.11: resolution: {integrity: sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: css-color-names: 1.0.1 - postcss: 8.3.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 - stylehacks: 5.0.1_postcss@8.3.6 + stylehacks: 5.0.1_postcss@8.3.11 dev: true /postcss-merge-rules/4.0.3: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.16.8 + browserslist: 4.17.6 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 - postcss: 7.0.36 + postcss: 7.0.39 postcss-selector-parser: 3.1.2 vendors: 1.0.4 dev: true - /postcss-merge-rules/5.0.2_postcss@8.3.6: + /postcss-merge-rules/5.0.2_postcss@8.3.11: resolution: {integrity: sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.16.8 + browserslist: 4.17.6 caniuse-api: 3.0.0 - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 postcss-selector-parser: 6.0.6 vendors: 1.0.4 dev: true @@ -17420,17 +21006,17 @@ packages: resolution: {integrity: sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-minify-font-values/5.0.1_postcss@8.3.6: + /postcss-minify-font-values/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17440,19 +21026,19 @@ packages: dependencies: cssnano-util-get-arguments: 4.0.0 is-color-stop: 1.1.0 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-minify-gradients/5.0.2_postcss@8.3.6: - resolution: {integrity: sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ==} + /postcss-minify-gradients/5.0.3_postcss@8.3.11: + resolution: {integrity: sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - colord: 2.7.0 - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 + colord: 2.9.1 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17461,23 +21047,23 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - browserslist: 4.16.8 + browserslist: 4.17.6 cssnano-util-get-arguments: 4.0.0 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 uniqs: 2.0.0 dev: true - /postcss-minify-params/5.0.1_postcss@8.3.6: + /postcss-minify-params/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: alphanum-sort: 1.0.2 - browserslist: 4.16.8 - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 + browserslist: 4.17.6 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 postcss-value-parser: 4.1.0 uniqs: 2.0.0 dev: true @@ -17488,18 +21074,18 @@ packages: dependencies: alphanum-sort: 1.0.2 has: 1.0.3 - postcss: 7.0.36 + postcss: 7.0.39 postcss-selector-parser: 3.1.2 dev: true - /postcss-minify-selectors/5.1.0_postcss@8.3.6: + /postcss-minify-selectors/5.1.0_postcss@8.3.11: resolution: {integrity: sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: alphanum-sort: 1.0.2 - postcss: 8.3.6 + postcss: 8.3.11 postcss-selector-parser: 6.0.6 dev: true @@ -17507,16 +21093,16 @@ packages: resolution: {integrity: sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==} engines: {node: '>= 6'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /postcss-modules-extract-imports/3.0.0_postcss@8.3.6: + /postcss-modules-extract-imports/3.0.0_postcss@8.3.11: resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 dev: true /postcss-modules-local-by-default/3.0.3: @@ -17524,19 +21110,19 @@ packages: engines: {node: '>= 6'} dependencies: icss-utils: 4.1.1 - postcss: 7.0.36 + postcss: 7.0.39 postcss-selector-parser: 6.0.6 postcss-value-parser: 4.1.0 dev: true - /postcss-modules-local-by-default/4.0.0_postcss@8.3.6: + /postcss-modules-local-by-default/4.0.0_postcss@8.3.11: resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.3.6 - postcss: 8.3.6 + icss-utils: 5.1.0_postcss@8.3.11 + postcss: 8.3.11 postcss-selector-parser: 6.0.6 postcss-value-parser: 4.1.0 dev: true @@ -17545,17 +21131,17 @@ packages: resolution: {integrity: sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==} engines: {node: '>= 6'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 postcss-selector-parser: 6.0.6 dev: true - /postcss-modules-scope/3.0.0_postcss@8.3.6: + /postcss-modules-scope/3.0.0_postcss@8.3.11: resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 postcss-selector-parser: 6.0.6 dev: true @@ -17563,33 +21149,33 @@ packages: resolution: {integrity: sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==} dependencies: icss-utils: 4.1.1 - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /postcss-modules-values/4.0.0_postcss@8.3.6: + /postcss-modules-values/4.0.0_postcss@8.3.11: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.3.6 - postcss: 8.3.6 + icss-utils: 5.1.0_postcss@8.3.11 + postcss: 8.3.11 dev: true /postcss-normalize-charset/4.0.1: resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /postcss-normalize-charset/5.0.1_postcss@8.3.6: + /postcss-normalize-charset/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 dev: true /postcss-normalize-display-values/4.0.2: @@ -17597,18 +21183,18 @@ packages: engines: {node: '>=6.9.0'} dependencies: cssnano-util-get-match: 4.0.0 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-display-values/5.0.1_postcss@8.3.6: + /postcss-normalize-display-values/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17618,17 +21204,17 @@ packages: dependencies: cssnano-util-get-arguments: 4.0.0 has: 1.0.3 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-positions/5.0.1_postcss@8.3.6: + /postcss-normalize-positions/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17638,18 +21224,18 @@ packages: dependencies: cssnano-util-get-arguments: 4.0.0 cssnano-util-get-match: 4.0.0 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-repeat-style/5.0.1_postcss@8.3.6: + /postcss-normalize-repeat-style/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17658,17 +21244,17 @@ packages: engines: {node: '>=6.9.0'} dependencies: has: 1.0.3 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-string/5.0.1_postcss@8.3.6: + /postcss-normalize-string/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17677,18 +21263,18 @@ packages: engines: {node: '>=6.9.0'} dependencies: cssnano-util-get-match: 4.0.0 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-timing-functions/5.0.1_postcss@8.3.6: + /postcss-normalize-timing-functions/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17696,19 +21282,19 @@ packages: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.16.8 - postcss: 7.0.36 + browserslist: 4.17.6 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-unicode/5.0.1_postcss@8.3.6: + /postcss-normalize-unicode/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.16.8 - postcss: 8.3.6 + browserslist: 4.17.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17718,11 +21304,11 @@ packages: dependencies: is-absolute-url: 2.1.0 normalize-url: 3.3.0 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-url/5.0.2_postcss@8.3.6: + /postcss-normalize-url/5.0.2_postcss@8.3.11: resolution: {integrity: sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -17730,7 +21316,7 @@ packages: dependencies: is-absolute-url: 3.0.3 normalize-url: 6.1.0 - postcss: 8.3.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17738,17 +21324,17 @@ packages: resolution: {integrity: sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-whitespace/5.0.1_postcss@8.3.6: + /postcss-normalize-whitespace/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17757,18 +21343,18 @@ packages: engines: {node: '>=6.9.0'} dependencies: cssnano-util-get-arguments: 4.0.0 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-ordered-values/5.0.2_postcss@8.3.6: + /postcss-ordered-values/5.0.2_postcss@8.3.11: resolution: {integrity: sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17776,21 +21362,21 @@ packages: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.16.8 + browserslist: 4.17.6 caniuse-api: 3.0.0 has: 1.0.3 - postcss: 7.0.36 + postcss: 7.0.39 dev: true - /postcss-reduce-initial/5.0.1_postcss@8.3.6: + /postcss-reduce-initial/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.16.8 + browserslist: 4.17.6 caniuse-api: 3.0.0 - postcss: 8.3.6 + postcss: 8.3.11 dev: true /postcss-reduce-transforms/4.0.2: @@ -17799,18 +21385,18 @@ packages: dependencies: cssnano-util-get-match: 4.0.0 has: 1.0.3 - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 dev: true - /postcss-reduce-transforms/5.0.1_postcss@8.3.6: + /postcss-reduce-transforms/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 2.0.1_postcss@8.3.6 - postcss: 8.3.6 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 postcss-value-parser: 4.1.0 dev: true @@ -17835,20 +21421,20 @@ packages: resolution: {integrity: sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==} engines: {node: '>=6.9.0'} dependencies: - postcss: 7.0.36 + postcss: 7.0.39 postcss-value-parser: 3.3.1 svgo: 1.3.2 dev: true - /postcss-svgo/5.0.2_postcss@8.3.6: - resolution: {integrity: sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==} + /postcss-svgo/5.0.3_postcss@8.3.11: + resolution: {integrity: sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.3.6 + postcss: 8.3.11 postcss-value-parser: 4.1.0 - svgo: 2.4.0 + svgo: 2.8.0 dev: true /postcss-unique-selectors/4.0.1: @@ -17856,18 +21442,18 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - postcss: 7.0.36 + postcss: 7.0.39 uniqs: 2.0.0 dev: true - /postcss-unique-selectors/5.0.1_postcss@8.3.6: + /postcss-unique-selectors/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: alphanum-sort: 1.0.2 - postcss: 8.3.6 + postcss: 8.3.11 postcss-selector-parser: 6.0.6 uniqs: 2.0.0 dev: true @@ -17889,6 +21475,23 @@ packages: supports-color: 6.1.0 dev: true + /postcss/7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + dependencies: + picocolors: 0.2.1 + source-map: 0.6.1 + dev: true + + /postcss/8.3.11: + resolution: {integrity: sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.1.30 + picocolors: 1.0.0 + source-map-js: 0.6.2 + dev: true + /postcss/8.3.6: resolution: {integrity: sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==} engines: {node: ^10 || ^12 || >=14} @@ -18007,8 +21610,8 @@ packages: - webpack-command dev: true - /preact-cli/3.2.2_8d1b4ee21ca5a56b4aabd4a3e659b2d7: - resolution: {integrity: sha512-42aUanAb/AqHHvnfb/IwJw9UhY5iuHkGRBv3TrTsQMrq0Ee8Z84r+HS8wjGI0aHHb0R8tnHI0hhllWgmNhjB/Q==} + /preact-cli/3.3.1_bb0f676d04cdcea3d812adbcf5208138: + resolution: {integrity: sha512-ODvjErOqVtbmfS2pc1M3lGm4ffwAXcZiYrijRItnIPLDjRQjIRIz81aW4iRws1OPdozc4nGIJKCAJxUAigfrjw==} engines: {node: '>=12'} hasBin: true peerDependencies: @@ -18025,25 +21628,24 @@ packages: stylus-loader: optional: true dependencies: - '@babel/core': 7.15.0 - '@babel/plugin-proposal-class-properties': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-decorators': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-proposal-object-rest-spread': 7.14.7_@babel+core@7.15.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.15.0 - '@babel/plugin-transform-object-assign': 7.14.5_@babel+core@7.15.0 - '@babel/plugin-transform-react-jsx': 7.14.9_@babel+core@7.15.0 - '@babel/preset-env': 7.15.0_@babel+core@7.15.0 - '@babel/preset-typescript': 7.15.0_@babel+core@7.15.0 - '@preact/async-loader': 3.0.1_preact@10.5.14 + '@babel/core': 7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-decorators': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-transform-object-assign': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/preset-typescript': 7.16.0_@babel+core@7.16.0 + '@preact/async-loader': 3.0.1_preact@10.5.15 '@prefresh/babel-plugin': 0.4.1 - '@prefresh/webpack': 3.3.2_b4d84c08f02729896cbfdece19209372 - autoprefixer: 10.3.1_postcss@8.3.6 + '@prefresh/webpack': 3.3.2_7b676851c8ef63627f17dcf4dd469116 + autoprefixer: 10.4.0_postcss@8.3.11 babel-esm-plugin: 0.9.0_webpack@4.46.0 - babel-loader: 8.2.2_be352a5a80662835a7707f972edfcfde + babel-loader: 8.2.3_1bd60a6cd0f7024f034efd75ae733a3f babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 - browserlist: 1.0.1 - browserslist: 4.16.8 + browserslist: 4.17.6 compression-webpack-plugin: 6.1.1_webpack@4.46.0 console-clear: 1.1.1 copy-webpack-plugin: 6.4.1_webpack@4.46.0 @@ -18053,59 +21655,58 @@ packages: ejs-loader: 0.5.0 envinfo: 7.8.1 esm: 3.2.25 - fast-async: 6.3.8 file-loader: 6.2.0_webpack@4.46.0 fork-ts-checker-webpack-plugin: 4.1.6 get-port: 5.1.1 gittar: 0.1.1 - glob: 7.1.7 + glob: 7.2.0 html-webpack-exclude-assets-plugin: 0.0.7 html-webpack-plugin: 3.2.0_webpack@4.46.0 ip: 1.1.5 isomorphic-unfetch: 3.1.0 kleur: 4.1.4 - loader-utils: 2.0.0 + loader-utils: 2.0.2 mini-css-extract-plugin: 1.6.2_webpack@4.46.0 minimatch: 3.0.4 native-url: 0.3.4 optimize-css-assets-webpack-plugin: 6.0.1_webpack@4.46.0 ora: 5.4.1 - pnp-webpack-plugin: 1.7.0_typescript@4.4.3 - postcss: 8.3.6 + pnp-webpack-plugin: 1.7.0_typescript@4.4.4 + postcss: 8.3.11 postcss-load-config: 3.1.0 - postcss-loader: 4.3.0_postcss@8.3.6+webpack@4.46.0 - preact: 10.5.14 - preact-render-to-string: 5.1.19_preact@10.5.14 + postcss-loader: 4.3.0_postcss@8.3.11+webpack@4.46.0 + preact: 10.5.15 + preact-render-to-string: 5.1.19_preact@10.5.15 progress-bar-webpack-plugin: 2.1.0_webpack@4.46.0 - promise-polyfill: 8.2.0 - prompts: 2.4.1 + promise-polyfill: 8.2.1 + prompts: 2.4.2 raw-loader: 4.0.2_webpack@4.46.0 react-refresh: 0.10.0 rimraf: 3.0.2 sade: 1.7.4 - sass-loader: 10.2.0_sass@1.43.2 + sass-loader: 10.2.0_sass@1.32.13 size-plugin: 3.0.0_webpack@4.46.0 source-map: 0.7.3 stack-trace: 0.0.10 style-loader: 2.0.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 - typescript: 4.4.3 + typescript: 4.4.4 update-notifier: 5.1.0 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 validate-npm-package-name: 3.0.0 webpack: 4.46.0 - webpack-bundle-analyzer: 4.4.2 + webpack-bundle-analyzer: 4.5.0 webpack-dev-server: 3.11.2_webpack@4.46.0 webpack-fix-style-only-entries: 0.6.1 webpack-merge: 5.8.0 webpack-plugin-replace: 1.2.0 which: 2.0.2 - workbox-cacheable-response: 6.2.4 - workbox-core: 6.2.4 - workbox-precaching: 6.2.4 - workbox-routing: 6.2.4 - workbox-strategies: 6.2.4 - workbox-webpack-plugin: 6.2.4_webpack@4.46.0 + workbox-cacheable-response: 6.3.0 + workbox-core: 6.3.0 + workbox-precaching: 6.3.0 + workbox-routing: 6.3.0 + workbox-strategies: 6.3.0 + workbox-webpack-plugin: 6.3.0_webpack@4.46.0 transitivePeerDependencies: - '@types/babel__core' - bufferutil @@ -18124,6 +21725,16 @@ packages: dependencies: preact: 10.5.14 pretty-format: 3.8.0 + dev: true + + /preact-render-to-string/5.1.19_preact@10.5.15: + resolution: {integrity: sha512-bj8sn/oytIKO6RtOGSS/1+5CrQyRSC99eLUnEVbqUa6MzJX5dYh7wu9bmT0d6lm/Vea21k9KhCQwvr2sYN3rrQ==} + peerDependencies: + preact: '>=10' + dependencies: + preact: 10.5.15 + pretty-format: 3.8.0 + dev: false /preact-router/3.2.1_preact@10.5.14: resolution: {integrity: sha512-KEN2VN1DxUlTwzW5IFkF13YIA2OdQ2OvgJTkQREF+AA2NrHRLaGbB68EjS4IeZOa1shvQ1FvEm3bSLta4sXBhg==} @@ -18133,10 +21744,22 @@ packages: preact: 10.5.14 dev: false + /preact-router/3.2.1_preact@10.5.15: + resolution: {integrity: sha512-KEN2VN1DxUlTwzW5IFkF13YIA2OdQ2OvgJTkQREF+AA2NrHRLaGbB68EjS4IeZOa1shvQ1FvEm3bSLta4sXBhg==} + peerDependencies: + preact: '>=10' + dependencies: + preact: 10.5.15 + dev: false + /preact/10.5.14: resolution: {integrity: sha512-KojoltCrshZ099ksUZ2OQKfbH66uquFoxHSbnwKbTJHeQNvx42EmC7wQVWNuDt6vC5s3nudRHFtKbpY4ijKlaQ==} dev: false + /preact/10.5.15: + resolution: {integrity: sha512-5chK29n6QcJc3m1lVrKQSQ+V7K1Gb8HeQY6FViQ5AxCAEGu3DaHffWNDkC9+miZgsLvbvU9rxbV1qinGHMHzqA==} + dev: false + /prelude-ls/1.1.2: resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} engines: {node: '>= 0.8.0'} @@ -18195,6 +21818,16 @@ packages: react-is: 17.0.2 dev: true + /pretty-format/27.3.1: + resolution: {integrity: sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.2.5 + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + /pretty-format/3.8.0: resolution: {integrity: sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U=} @@ -18210,8 +21843,8 @@ packages: parse-ms: 2.1.0 dev: true - /prismjs/1.24.1: - resolution: {integrity: sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow==} + /prismjs/1.25.0: + resolution: {integrity: sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==} dev: true /process-nextick-args/2.0.1: @@ -18253,25 +21886,29 @@ packages: resolution: {integrity: sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==} dev: true - /promise.allsettled/1.0.4: - resolution: {integrity: sha512-o73CbvQh/OnPFShxHcHxk0baXR2a1m4ozb85ha0H14VEoi/EJJLa9mnPfEWJx9RjA9MLfhdjZ8I6HhWtBa64Ag==} + /promise-polyfill/8.2.1: + resolution: {integrity: sha512-3p9zj0cEHbp7NVUxEYUWjQlffXqnXaZIMPkAO7HhFh8u5636xLRDHOUo2vpWSK0T2mqm6fKLXYn1KP6PAZ2gKg==} + dev: true + + /promise.allsettled/1.0.5: + resolution: {integrity: sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==} engines: {node: '>= 0.4'} dependencies: - array.prototype.map: 1.0.3 + array.prototype.map: 1.0.4 call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 get-intrinsic: 1.1.1 iterate-value: 1.0.2 dev: true - /promise.prototype.finally/3.1.2: - resolution: {integrity: sha512-A2HuJWl2opDH0EafgdjwEw7HysI8ff/n4lW4QEVBCUXFk9QeGecBWv0Deph0UmLe3tTNYegz8MOjsVuE6SMoJA==} + /promise.prototype.finally/3.1.3: + resolution: {integrity: sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==} engines: {node: '>= 0.4'} dependencies: + call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 - function-bind: 1.1.1 + es-abstract: 1.19.1 dev: true /prompts/2.4.0: @@ -18290,6 +21927,14 @@ packages: sisteransi: 1.0.5 dev: true + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + /prop-types/15.7.2: resolution: {integrity: sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==} dependencies: @@ -18484,7 +22129,7 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - loader-utils: 2.0.0 + loader-utils: 2.0.2 schema-utils: 3.1.1 webpack: 4.46.0 dev: true @@ -18516,6 +22161,23 @@ packages: react-dom: 16.14.0_react@16.14.0 dev: true + /react-colorful/5.5.0: + resolution: {integrity: sha512-BuzrlrM0ylg7coPkXOrRqlf2BgHLw5L44sybbr9Lg4xy7w9e5N7fGYbojOO0s8J0nvrM3PERN2rVFkvSa24lnQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dev: true + + /react-colorful/5.5.0_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-BuzrlrM0ylg7coPkXOrRqlf2BgHLw5L44sybbr9Lg4xy7w9e5N7fGYbojOO0s8J0nvrM3PERN2rVFkvSa24lnQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + dev: true + /react-dev-utils/11.0.4: resolution: {integrity: sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==} engines: {node: '>=10'} @@ -18565,6 +22227,28 @@ packages: prop-types: 15.7.2 dev: true + /react-draggable/4.4.4: + resolution: {integrity: sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 1.1.1 + prop-types: 15.7.2 + dev: true + + /react-draggable/4.4.4_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 1.1.1 + prop-types: 15.7.2 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + dev: true + /react-element-to-jsx-string/14.3.2: resolution: {integrity: sha512-WZbvG72cjLXAxV7VOuSzuHEaI3RHj10DZu8EcKQpkKcAj7+qAkG5XUeSdX5FXrA0vPrlx0QsnAzZEBJwzV0e+w==} peerDependencies: @@ -18575,6 +22259,17 @@ packages: is-plain-object: 3.0.1 dev: true + /react-element-to-jsx-string/14.3.4: + resolution: {integrity: sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react-is: 17.0.2 + dev: true + /react-error-overlay/6.0.9: resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} dev: true @@ -18611,12 +22306,40 @@ packages: shallowequal: 1.1.0 dev: true + /react-helmet-async/1.1.2: + resolution: {integrity: sha512-LTTzDDkyIleT/JJ6T/uqx7Y8qi1EuPPSiJawQY/nHHz0h7SPDT6HxP1YDDQx/fzcVxCqpWEEMS3QdrSrNkJYhg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 + react-dom: ^16.6.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.16.0 + invariant: 2.2.4 + prop-types: 15.7.2 + react-fast-compare: 3.2.0 + shallowequal: 1.1.0 + dev: true + + /react-helmet-async/1.1.2_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-LTTzDDkyIleT/JJ6T/uqx7Y8qi1EuPPSiJawQY/nHHz0h7SPDT6HxP1YDDQx/fzcVxCqpWEEMS3QdrSrNkJYhg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 + react-dom: ^16.6.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.16.0 + invariant: 2.2.4 + prop-types: 15.7.2 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-fast-compare: 3.2.0 + shallowequal: 1.1.0 + dev: true + /react-inspector/5.1.1: resolution: {integrity: sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==} peerDependencies: react: ^16.8.4 || ^17.0.0 dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 is-dom: 1.1.0 prop-types: 15.7.2 dev: true @@ -18639,9 +22362,9 @@ packages: react: ^16.6.0 || ^17.0.0 react-dom: ^16.6.0 || ^17.0.0 dependencies: - '@babel/runtime': 7.15.3 - '@popperjs/core': 2.9.3 - react-popper: 2.2.5_@popperjs+core@2.9.3 + '@babel/runtime': 7.16.0 + '@popperjs/core': 2.10.2 + react-popper: 2.2.5_@popperjs+core@2.10.2 dev: true /react-popper-tooltip/3.1.1_react-dom@16.14.0+react@16.14.0: @@ -18650,32 +22373,32 @@ packages: react: ^16.6.0 || ^17.0.0 react-dom: ^16.6.0 || ^17.0.0 dependencies: - '@babel/runtime': 7.15.3 - '@popperjs/core': 2.9.3 + '@babel/runtime': 7.16.0 + '@popperjs/core': 2.10.2 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 - react-popper: 2.2.5_6bb145cab7dfe893f5ebfae476998f0c + react-popper: 2.2.5_20a330155a391a39c24da43184528906 dev: true - /react-popper/2.2.5_6bb145cab7dfe893f5ebfae476998f0c: + /react-popper/2.2.5_20a330155a391a39c24da43184528906: resolution: {integrity: sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==} peerDependencies: '@popperjs/core': ^2.0.0 react: ^16.8.0 || ^17 dependencies: - '@popperjs/core': 2.9.3 + '@popperjs/core': 2.10.2 react: 16.14.0 react-fast-compare: 3.2.0 warning: 4.0.3 dev: true - /react-popper/2.2.5_@popperjs+core@2.9.3: + /react-popper/2.2.5_@popperjs+core@2.10.2: resolution: {integrity: sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==} peerDependencies: '@popperjs/core': ^2.0.0 react: ^16.8.0 || ^17 dependencies: - '@popperjs/core': 2.9.3 + '@popperjs/core': 2.10.2 react-fast-compare: 3.2.0 warning: 4.0.3 dev: true @@ -18711,16 +22434,25 @@ packages: throttle-debounce: 3.0.1 dev: true + /react-sizeme/3.0.2: + resolution: {integrity: sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==} + dependencies: + element-resize-detector: 1.2.3 + invariant: 2.2.4 + shallowequal: 1.1.0 + throttle-debounce: 3.0.1 + dev: true + /react-syntax-highlighter/13.5.3: resolution: {integrity: sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==} peerDependencies: react: '>= 0.14.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 highlight.js: 10.7.3 lowlight: 1.20.0 - prismjs: 1.24.1 - refractor: 3.4.0 + prismjs: 1.25.0 + refractor: 3.5.0 dev: true /react-syntax-highlighter/13.5.3_react@16.14.0: @@ -18728,12 +22460,12 @@ packages: peerDependencies: react: '>= 0.14.0' dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 highlight.js: 10.7.3 lowlight: 1.20.0 - prismjs: 1.24.1 + prismjs: 1.25.0 react: 16.14.0 - refractor: 3.4.0 + refractor: 3.5.0 dev: true /react-textarea-autosize/8.3.3: @@ -18742,7 +22474,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 use-composed-ref: 1.1.0 use-latest: 1.2.0 transitivePeerDependencies: @@ -18755,7 +22487,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 react: 16.14.0 use-composed-ref: 1.1.0_react@16.14.0 use-latest: 1.2.0_react@16.14.0 @@ -18811,7 +22543,7 @@ packages: /readable-stream/2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: - core-util-is: 1.0.2 + core-util-is: 1.0.3 inherits: 2.0.4 isarray: 1.0.0 process-nextick-args: 2.0.1 @@ -18859,12 +22591,12 @@ packages: minimatch: 3.0.4 dev: true - /refractor/3.4.0: - resolution: {integrity: sha512-dBeD02lC5eytm9Gld2Mx0cMcnR+zhSnsTfPpWqFaMgUMJfC9A6bcN3Br/NaXrnBJcuxnLFR90k1jrkaSyV8umg==} + /refractor/3.5.0: + resolution: {integrity: sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==} dependencies: hastscript: 6.0.0 parse-entities: 2.0.0 - prismjs: 1.24.1 + prismjs: 1.25.0 dev: true /regenerate-unicode-properties/8.2.0: @@ -18874,6 +22606,13 @@ packages: regenerate: 1.4.2 dev: true + /regenerate-unicode-properties/9.0.0: + resolution: {integrity: sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + /regenerate/1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true @@ -18892,7 +22631,7 @@ packages: /regenerator-transform/0.14.5: resolution: {integrity: sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==} dependencies: - '@babel/runtime': 7.15.3 + '@babel/runtime': 7.16.0 dev: true /regex-not/1.0.2: @@ -18911,16 +22650,16 @@ packages: define-properties: 1.1.3 dev: true - /regexpp/2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} - dev: true - /regexpp/3.1.0: resolution: {integrity: sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==} engines: {node: '>=8'} dev: true + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + /regexpu-core/4.7.1: resolution: {integrity: sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==} engines: {node: '>=4'} @@ -18933,6 +22672,18 @@ packages: unicode-match-property-value-ecmascript: 1.2.0 dev: true + /regexpu-core/4.8.0: + resolution: {integrity: sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 9.0.0 + regjsgen: 0.5.2 + regjsparser: 0.7.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.0.0 + dev: true + /registry-auth-token/4.2.1: resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==} engines: {node: '>=6.0.0'} @@ -18958,6 +22709,13 @@ packages: jsesc: 0.5.0 dev: true + /regjsparser/0.7.0: + resolution: {integrity: sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + /relateurl/0.2.7: resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} engines: {node: '>= 0.10'} @@ -19023,7 +22781,7 @@ packages: /remark-slug/6.1.0: resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} dependencies: - github-slugger: 1.3.0 + github-slugger: 1.4.0 mdast-util-to-string: 1.1.0 unist-util-visit: 2.0.3 dev: true @@ -19098,7 +22856,7 @@ packages: is-typedarray: 1.0.0 isstream: 0.1.2 json-stringify-safe: 5.0.1 - mime-types: 2.1.32 + mime-types: 2.1.33 oauth-sign: 0.9.0 performance-now: 2.1.0 qs: 6.5.2 @@ -19164,6 +22922,11 @@ packages: deprecated: https://github.com/lydell/resolve-url#deprecated dev: true + /resolve.exports/1.1.0: + resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + engines: {node: '>=10'} + dev: true + /resolve/1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} dependencies: @@ -19180,7 +22943,14 @@ packages: /resolve/1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: - is-core-module: 2.6.0 + is-core-module: 2.8.0 + path-parse: 1.0.7 + dev: true + + /resolve/2.0.0-next.3: + resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} + dependencies: + is-core-module: 2.8.0 path-parse: 1.0.7 dev: true @@ -19195,7 +22965,7 @@ packages: engines: {node: '>=8'} dependencies: onetime: 5.1.2 - signal-exit: 3.0.3 + signal-exit: 3.0.5 dev: true /ret/0.1.15: @@ -19221,25 +22991,18 @@ packages: resolution: {integrity: sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=} dev: true - /rimraf/2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - hasBin: true - dependencies: - glob: 7.1.7 - dev: true - /rimraf/2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: - glob: 7.1.7 + glob: 7.2.0 dev: true /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.1.7 + glob: 7.2.0 dev: true /ripemd160/2.0.2: @@ -19279,6 +23042,22 @@ packages: source-map-resolve: 0.6.0 dev: true + /rollup-plugin-sourcemaps/0.6.3_57eeb328ceff0756ae1d32f4d22d60f9: + resolution: {integrity: sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==} + engines: {node: '>=10.0.0'} + peerDependencies: + '@types/node': '>=10.0.0' + rollup: '>=0.31.2' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.59.0 + '@types/node': 14.14.22 + rollup: 2.59.0 + source-map-resolve: 0.6.0 + dev: true + /rollup-plugin-sourcemaps/0.6.3_6efbbae6640434994627e0ab519821c6: resolution: {integrity: sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==} engines: {node: '>=10.0.0'} @@ -19311,6 +23090,21 @@ packages: source-map-resolve: 0.6.0 dev: true + /rollup-plugin-sourcemaps/0.6.3_rollup@2.59.0: + resolution: {integrity: sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==} + engines: {node: '>=10.0.0'} + peerDependencies: + '@types/node': '>=10.0.0' + rollup: '>=0.31.2' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.59.0 + rollup: 2.59.0 + source-map-resolve: 0.6.0 + dev: true + /rollup-plugin-terser/7.0.2_rollup@2.37.1: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} peerDependencies: @@ -19347,6 +23141,18 @@ packages: terser: 5.4.0 dev: true + /rollup-plugin-terser/7.0.2_rollup@2.59.0: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.12.13 + jest-worker: 26.6.2 + rollup: 2.59.0 + serialize-javascript: 4.0.0 + terser: 5.4.0 + dev: true + /rollup/2.37.1: resolution: {integrity: sha512-V3ojEeyGeSdrMSuhP3diBb06P+qV4gKQeanbDv+Qh/BZbhdZ7kHV0xAt8Yjk4GFshq/WjO7R4c7DFM20AwTFVQ==} engines: {node: '>=10.0.0'} @@ -19371,6 +23177,14 @@ packages: fsevents: 2.3.2 dev: true + /rollup/2.59.0: + resolution: {integrity: sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /rst-selector-parser/2.2.3: resolution: {integrity: sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=} dependencies: @@ -19383,11 +23197,6 @@ packages: engines: {node: 6.* || >= 7.*} dev: true - /run-async/2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true - /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -19400,18 +23209,11 @@ packages: aproba: 1.2.0 dev: true - /rxjs/6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - dependencies: - tslib: 1.14.1 - dev: true - /sade/1.7.4: resolution: {integrity: sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==} engines: {node: '>= 6'} dependencies: - mri: 1.1.6 + mri: 1.2.0 dev: true /safe-buffer/5.1.1: @@ -19450,10 +23252,10 @@ packages: fb-watchman: 2.0.1 micromatch: 3.1.10 minimist: 1.2.5 - walker: 1.0.7 + walker: 1.0.8 dev: true - /sass-loader/10.2.0_sass@1.43.2: + /sass-loader/10.2.0_sass@1.32.13: resolution: {integrity: sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -19469,16 +23271,16 @@ packages: sass: optional: true dependencies: - klona: 2.0.4 - loader-utils: 2.0.0 + klona: 2.0.5 + loader-utils: 2.0.2 neo-async: 2.6.2 - sass: 1.43.2 + sass: 1.32.13 schema-utils: 3.1.1 semver: 7.3.5 dev: true - /sass/1.43.2: - resolution: {integrity: sha512-DncYhjl3wBaPMMJR0kIUaH3sF536rVrOcqqVGmTZHQRRzj7LQlyGV7Mb8aCKFyILMr5VsPHwRYtyKpnKYlmQSQ==} + /sass/1.32.13: + resolution: {integrity: sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==} engines: {node: '>=8.9.0'} hasBin: true dependencies: @@ -19657,7 +23459,7 @@ packages: debug: 2.6.9 escape-html: 1.0.3 http-errors: 1.6.3 - mime-types: 2.1.32 + mime-types: 2.1.33 parseurl: 1.3.3 dev: true @@ -19793,6 +23595,10 @@ packages: resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} dev: true + /signal-exit/3.0.5: + resolution: {integrity: sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==} + dev: true + /simple-swizzle/0.2.2: resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} dependencies: @@ -19810,7 +23616,7 @@ packages: local-access: 1.1.0 sade: 1.7.4 semiver: 1.1.0 - sirv: 1.0.14 + sirv: 1.0.18 tinydate: 1.3.0 dev: true @@ -19823,6 +23629,15 @@ packages: totalist: 1.1.0 dev: true + /sirv/1.0.18: + resolution: {integrity: sha512-f2AOPogZmXgJ9Ma2M22ZEhc1dNtRIzcEkiflMFeVTRq+OViOZMvH1IPMVOwrKaxpSaHioBJiDR0SluRqGa7atA==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.21 + mime: 2.6.0 + totalist: 1.1.0 + dev: true + /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -19832,11 +23647,11 @@ packages: peerDependencies: webpack: '*' dependencies: - axios: 0.21.1 + axios: 0.21.4 chalk: 2.4.2 - ci-env: 1.16.0 + ci-env: 1.17.0 escape-string-regexp: 1.0.5 - glob: 7.1.7 + glob: 7.2.0 minimatch: 3.0.4 pretty-bytes: 5.6.0 util.promisify: 1.1.1 @@ -19855,15 +23670,6 @@ packages: engines: {node: '>=8'} dev: true - /slice-ansi/2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - dev: true - /slice-ansi/3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -19912,8 +23718,8 @@ packages: use: 3.1.1 dev: true - /sockjs-client/1.5.1: - resolution: {integrity: sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==} + /sockjs-client/1.5.2: + resolution: {integrity: sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==} dependencies: debug: 3.2.7 eventsource: 1.1.0 @@ -19963,6 +23769,13 @@ packages: buffer-from: 1.1.2 source-map: 0.6.1 + /source-map-support/0.5.20: + resolution: {integrity: sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + /source-map-url/0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} dev: true @@ -20072,7 +23885,7 @@ packages: engines: {node: '>=0.10.0'} hasBin: true dependencies: - asn1: 0.2.4 + asn1: 0.2.6 assert-plus: 1.0.0 bcrypt-pbkdf: 1.0.2 dashdash: 1.14.1 @@ -20093,7 +23906,7 @@ packages: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.3 + minipass: 3.1.5 dev: true /stable/0.1.8: @@ -20111,6 +23924,13 @@ packages: escape-string-regexp: 2.0.0 dev: true + /stack-utils/2.0.5: + resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + /state-toggle/1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} dev: true @@ -20143,10 +23963,10 @@ packages: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/addons': 6.3.7 - '@storybook/api': 6.3.7 - '@storybook/components': 6.3.7 - '@storybook/core-events': 6.3.7 + '@storybook/addons': 6.3.12 + '@storybook/api': 6.3.12 + '@storybook/components': 6.3.12 + '@storybook/core-events': 6.3.12 ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -20203,7 +24023,7 @@ packages: engines: {node: '>=10'} dependencies: char-regex: 1.0.2 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 dev: true /string-width/1.0.2: @@ -20242,6 +24062,15 @@ packages: strip-ansi: 6.0.0 dev: true + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + /string.prototype.matchall/4.0.3: resolution: {integrity: sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw==} dependencies: @@ -20254,12 +24083,12 @@ packages: side-channel: 1.0.4 dev: true - /string.prototype.matchall/4.0.5: - resolution: {integrity: sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==} + /string.prototype.matchall/4.0.6: + resolution: {integrity: sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 get-intrinsic: 1.1.1 has-symbols: 1.0.2 internal-slot: 1.0.3 @@ -20267,31 +24096,31 @@ packages: side-channel: 1.0.4 dev: true - /string.prototype.padend/3.1.2: - resolution: {integrity: sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==} + /string.prototype.padend/3.1.3: + resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 dev: true - /string.prototype.padstart/3.1.2: - resolution: {integrity: sha512-HDpngIP3pd0DeazrfqzuBrQZa+D2arKWquEHfGt5LzVjd+roLC3cjqVI0X8foaZz5rrrhcu8oJAQamW8on9dqw==} + /string.prototype.padstart/3.1.3: + resolution: {integrity: sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 dev: true - /string.prototype.trim/1.2.4: - resolution: {integrity: sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==} + /string.prototype.trim/1.2.5: + resolution: {integrity: sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 dev: true /string.prototype.trimend/1.0.3: @@ -20367,7 +24196,14 @@ packages: resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} engines: {node: '>=8'} dependencies: - ansi-regex: 5.0.0 + ansi-regex: 5.0.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 dev: true /strip-bom/3.0.0: @@ -20411,7 +24247,7 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - loader-utils: 2.0.0 + loader-utils: 2.0.2 schema-utils: 2.7.1 webpack: 4.46.0 dev: true @@ -20422,7 +24258,7 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - loader-utils: 2.0.0 + loader-utils: 2.0.2 schema-utils: 3.1.1 webpack: 4.46.0 dev: true @@ -20437,19 +24273,19 @@ packages: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.16.8 - postcss: 7.0.36 + browserslist: 4.17.6 + postcss: 7.0.39 postcss-selector-parser: 3.1.2 dev: true - /stylehacks/5.0.1_postcss@8.3.6: + /stylehacks/5.0.1_postcss@8.3.11: resolution: {integrity: sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.16.8 - postcss: 8.3.6 + browserslist: 4.17.6 + postcss: 8.3.11 postcss-selector-parser: 6.0.6 dev: true @@ -20489,6 +24325,13 @@ packages: has-flag: 4.0.0 dev: true + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + /supports-hyperlinks/2.2.0: resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} engines: {node: '>=8'} @@ -20511,24 +24354,24 @@ packages: csso: 4.2.0 js-yaml: 3.14.1 mkdirp: 0.5.5 - object.values: 1.1.4 + object.values: 1.1.5 sax: 1.2.4 stable: 0.1.8 unquote: 1.1.1 util.promisify: 1.0.1 dev: true - /svgo/2.4.0: - resolution: {integrity: sha512-W25S1UUm9Lm9VnE0TvCzL7aso/NCzDEaXLaElCUO/KaVitw0+IBicSVfM1L1c0YHK5TOFh73yQ2naCpVHEQ/OQ==} + /svgo/2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} engines: {node: '>=10.13.0'} hasBin: true dependencies: - '@trysound/sax': 0.1.1 - colorette: 1.3.0 + '@trysound/sax': 0.2.0 commander: 7.2.0 css-select: 4.1.3 css-tree: 1.1.3 csso: 4.2.0 + picocolors: 1.0.0 stable: 0.1.8 dev: true @@ -20543,17 +24386,7 @@ packages: call-bind: 1.0.2 get-symbol-description: 1.0.0 has-symbols: 1.0.2 - object.getownpropertydescriptors: 2.1.2 - dev: true - - /table/5.4.6: - resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} - engines: {node: '>=6.0.0'} - dependencies: - ajv: 6.12.6 - lodash: 4.17.21 - slice-ansi: 2.1.0 - string-width: 3.1.0 + object.getownpropertydescriptors: 2.1.3 dev: true /table/6.0.7: @@ -20589,13 +24422,13 @@ packages: yallist: 3.1.1 dev: true - /tar/6.1.10: - resolution: {integrity: sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==} + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} engines: {node: '>= 10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 - minipass: 3.1.3 + minipass: 3.1.5 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 @@ -20604,7 +24437,7 @@ packages: /telejson/5.3.3: resolution: {integrity: sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==} dependencies: - '@types/is-function': 1.0.0 + '@types/is-function': 1.0.1 global: 4.4.0 is-function: 1.0.2 is-regex: 1.1.4 @@ -20666,14 +24499,14 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - cacache: 15.2.0 - find-cache-dir: 3.3.1 + cacache: 15.3.0 + find-cache-dir: 3.3.2 jest-worker: 26.6.2 p-limit: 3.1.0 schema-utils: 3.1.1 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.7.1 + terser: 5.9.0 webpack: 4.46.0 webpack-sources: 1.4.3 dev: true @@ -20685,7 +24518,7 @@ packages: dependencies: commander: 2.20.3 source-map: 0.6.1 - source-map-support: 0.5.19 + source-map-support: 0.5.20 dev: true /terser/5.4.0: @@ -20698,14 +24531,14 @@ packages: source-map-support: 0.5.19 dev: true - /terser/5.7.1: - resolution: {integrity: sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==} + /terser/5.9.0: + resolution: {integrity: sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==} engines: {node: '>=10'} hasBin: true dependencies: commander: 2.20.3 source-map: 0.7.3 - source-map-support: 0.5.19 + source-map-support: 0.5.20 dev: true /test-exclude/6.0.0: @@ -20713,7 +24546,7 @@ packages: engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.1.7 + glob: 7.2.0 minimatch: 3.0.4 dev: true @@ -20725,15 +24558,15 @@ packages: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} dev: true + /throat/6.0.1: + resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} + dev: true + /throttle-debounce/3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} engines: {node: '>=10'} dev: true - /through/2.3.8: - resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} - dev: true - /through2/2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: @@ -20774,15 +24607,8 @@ packages: engines: {node: '>=4'} dev: true - /tmp/0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true - - /tmpl/1.0.4: - resolution: {integrity: sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=} + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true /to-arraybuffer/1.0.1: @@ -20871,6 +24697,10 @@ packages: universalify: 0.1.2 dev: true + /tr46/0.0.3: + resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} + dev: true + /tr46/1.0.1: resolution: {integrity: sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=} dependencies: @@ -20910,7 +24740,14 @@ packages: resolution: {integrity: sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==} dev: true - /ts-pnp/1.2.0_typescript@3.9.10: + /ts-invariant/0.9.3: + resolution: {integrity: sha512-HinBlTbFslQI0OHP07JLsSXPibSegec6r9ai5xxq/qHYCsIQbzpymLpDhAUsnXcSrDEcd0L62L8vsOEdzM0qlA==} + engines: {node: '>=8'} + dependencies: + tslib: 2.3.1 + dev: true + + /ts-pnp/1.2.0_typescript@4.3.5: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} engines: {node: '>=6'} peerDependencies: @@ -20919,10 +24756,10 @@ packages: typescript: optional: true dependencies: - typescript: 3.9.10 + typescript: 4.3.5 dev: true - /ts-pnp/1.2.0_typescript@4.3.5: + /ts-pnp/1.2.0_typescript@4.4.3: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} engines: {node: '>=6'} peerDependencies: @@ -20931,7 +24768,19 @@ packages: typescript: optional: true dependencies: - typescript: 4.3.5 + typescript: 4.4.3 + dev: true + + /ts-pnp/1.2.0_typescript@4.4.4: + resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} + engines: {node: '>=6'} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 4.4.4 dev: true /tsconfig-paths/3.9.0: @@ -20958,24 +24807,24 @@ packages: /tslib/2.3.1: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} - /tsutils/3.19.1_typescript@3.9.10: + /tsutils/3.19.1_typescript@4.1.3: resolution: {integrity: sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 3.9.10 + typescript: 4.1.3 dev: true - /tsutils/3.19.1_typescript@4.1.3: - resolution: {integrity: sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==} + /tsutils/3.21.0_typescript@4.4.4: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.1.3 + typescript: 4.4.4 dev: true /tty-browserify/0.0.0: @@ -21051,7 +24900,7 @@ packages: engines: {node: '>= 0.6'} dependencies: media-typer: 0.3.0 - mime-types: 2.1.32 + mime-types: 2.1.33 dev: true /typedarray-to-buffer/3.1.5: @@ -21090,12 +24939,6 @@ packages: typescript: 4.1.3 dev: true - /typescript/3.9.10: - resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - /typescript/4.1.3: resolution: {integrity: sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==} engines: {node: '>=4.2.0'} @@ -21120,6 +24963,12 @@ packages: hasBin: true dev: true + /typescript/4.4.4: + resolution: {integrity: sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + /uglify-js/3.12.5: resolution: {integrity: sha512-SgpgScL4T7Hj/w/GexjnBHi3Ien9WS1Rpfg5y91WXMj9SY997ZCQU76mH4TpLwwfmMvoOU8wiaRkIf6NaH3mtg==} engines: {node: '>=0.8.0'} @@ -21165,6 +25014,11 @@ packages: engines: {node: '>=4'} dev: true + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + /unicode-match-property-ecmascript/1.0.4: resolution: {integrity: sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==} engines: {node: '>=4'} @@ -21173,16 +25027,34 @@ packages: unicode-property-aliases-ecmascript: 1.1.0 dev: true + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.0.0 + dev: true + /unicode-match-property-value-ecmascript/1.2.0: resolution: {integrity: sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==} engines: {node: '>=4'} dev: true + /unicode-match-property-value-ecmascript/2.0.0: + resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==} + engines: {node: '>=4'} + dev: true + /unicode-property-aliases-ecmascript/1.1.0: resolution: {integrity: sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==} engines: {node: '>=4'} dev: true + /unicode-property-aliases-ecmascript/2.0.0: + resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==} + engines: {node: '>=4'} + dev: true + /unified/9.2.0: resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} dependencies: @@ -21316,7 +25188,7 @@ packages: resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} engines: {node: '>=10'} dependencies: - boxen: 5.0.1 + boxen: 5.1.2 chalk: 4.1.2 configstore: 5.0.1 has-yarn: 2.1.0 @@ -21358,8 +25230,8 @@ packages: optional: true dependencies: file-loader: 6.2.0_webpack@4.46.0 - loader-utils: 2.0.0 - mime-types: 2.1.32 + loader-utils: 2.0.2 + mime-types: 2.1.33 schema-utils: 3.1.1 webpack: 4.46.0 dev: true @@ -21462,16 +25334,16 @@ packages: resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} dependencies: define-properties: 1.1.3 - object.getownpropertydescriptors: 2.1.2 + object.getownpropertydescriptors: 2.1.3 dev: true /util.promisify/1.0.1: resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} dependencies: define-properties: 1.1.3 - es-abstract: 1.18.5 + es-abstract: 1.19.1 has-symbols: 1.0.2 - object.getownpropertydescriptors: 2.1.2 + object.getownpropertydescriptors: 2.1.3 dev: true /util.promisify/1.1.1: @@ -21481,7 +25353,7 @@ packages: define-properties: 1.1.3 for-each: 0.3.3 has-symbols: 1.0.2 - object.getownpropertydescriptors: 2.1.2 + object.getownpropertydescriptors: 2.1.3 dev: true /util/0.10.3: @@ -21525,6 +25397,10 @@ packages: resolution: {integrity: sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==} dev: true + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + /v8-to-istanbul/7.1.2: resolution: {integrity: sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==} engines: {node: '>=10.10.0'} @@ -21534,6 +25410,15 @@ packages: source-map: 0.7.3 dev: true + /v8-to-istanbul/8.1.0: + resolution: {integrity: sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.3 + convert-source-map: 1.8.0 + source-map: 0.7.3 + dev: true + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -21615,10 +25500,10 @@ packages: xml-name-validator: 3.0.0 dev: true - /walker/1.0.7: - resolution: {integrity: sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=} + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: - makeerror: 1.0.11 + makeerror: 1.0.12 dev: true /warning/4.0.3: @@ -21665,6 +25550,10 @@ packages: engines: {node: '>= 8'} dev: false + /webidl-conversions/3.0.1: + resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} + dev: true + /webidl-conversions/4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true @@ -21698,6 +25587,25 @@ packages: - utf-8-validate dev: true + /webpack-bundle-analyzer/4.5.0: + resolution: {integrity: sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + acorn: 8.5.0 + acorn-walk: 8.2.0 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.18 + ws: 7.5.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /webpack-dev-middleware/3.7.3_webpack@4.46.0: resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} @@ -21705,7 +25613,7 @@ packages: webpack: ^4.0.0 || ^5.0.0 dependencies: memory-fs: 0.4.1 - mime: 2.5.2 + mime: 2.6.0 mkdirp: 0.5.5 range-parser: 1.2.1 webpack: 4.46.0 @@ -21747,7 +25655,7 @@ packages: semver: 6.3.0 serve-index: 1.9.1 sockjs: 0.3.21 - sockjs-client: 1.5.1 + sockjs-client: 1.5.2 spdy: 4.0.2_supports-color@6.1.0 strip-ansi: 3.0.1 supports-color: 6.1.0 @@ -21781,6 +25689,15 @@ packages: strip-ansi: 3.0.1 dev: true + /webpack-hot-middleware/2.25.1: + resolution: {integrity: sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==} + dependencies: + ansi-html-community: 0.0.8 + html-entities: 2.3.2 + querystring: 0.2.1 + strip-ansi: 6.0.1 + dev: true + /webpack-log/2.0.0: resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} engines: {node: '>= 6'} @@ -21882,6 +25799,13 @@ packages: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true + /whatwg-url/5.0.0: + resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + /whatwg-url/7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: @@ -21928,8 +25852,8 @@ packages: isexe: 2.0.0 dev: true - /wide-align/1.1.3: - resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: string-width: 1.0.2 dev: true @@ -21938,7 +25862,7 @@ packages: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} dependencies: - string-width: 4.2.2 + string-width: 4.2.3 dev: true /wildcard/2.0.0: @@ -21961,12 +25885,25 @@ packages: workbox-core: 6.2.4 dev: true + /workbox-background-sync/6.3.0: + resolution: {integrity: sha512-79Wznt6oO8xMmLiErRS4zENUEldFHj1/5IiuHsY3NgGRN5rJdvGW6hz+RERhWzoB7rd/vXyAQdKYahGdsiYG1A==} + dependencies: + idb: 6.1.5 + workbox-core: 6.3.0 + dev: true + /workbox-broadcast-update/6.2.4: resolution: {integrity: sha512-0EpML2lbxNkiZUoap4BJDA0Hfz36MhtUd/rRhFvF6YWoRbTQ8tc6tMaRgM1EBIUmIN2OX9qQlkqe5SGGt4lfXQ==} dependencies: workbox-core: 6.2.4 dev: true + /workbox-broadcast-update/6.3.0: + resolution: {integrity: sha512-hp7Du6GJzK99wak5cQFhcSBxvcS+2fkFcxiMmz/RsQ5GQNxVcbiovq74w5aNCzuv3muQvICyC1XELZhZ4GYRTQ==} + dependencies: + workbox-core: 6.3.0 + dev: true + /workbox-build/6.2.4: resolution: {integrity: sha512-01ZbY1BHi+yYvu4yDGZBw9xm1bWyZW0QGWPxiksvSPAsNH/z/NwgtWW14YEroFyG98mmXb7pufWlwl40zE1KTw==} engines: {node: '>=10.0.0'} @@ -22014,16 +25951,73 @@ packages: - supports-color dev: true + /workbox-build/6.3.0: + resolution: {integrity: sha512-Th93AaC+88ZvJje0acTjCCCvU3tGenxJht5xUALXHW+Mzk3I5SMzTFwKn5F3e1iZ+M7U2jjfpMXe/sJ4UMx46A==} + engines: {node: '>=10.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.2.6_ajv@8.6.3 + '@babel/core': 7.16.0 + '@babel/preset-env': 7.16.0_@babel+core@7.16.0 + '@babel/runtime': 7.16.0 + '@rollup/plugin-babel': 5.3.0_@babel+core@7.16.0+rollup@2.59.0 + '@rollup/plugin-node-resolve': 11.2.1_rollup@2.59.0 + '@rollup/plugin-replace': 2.4.2_rollup@2.59.0 + '@surma/rollup-plugin-off-main-thread': 1.4.2 + ajv: 8.6.3 + common-tags: 1.8.0 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.0 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.59.0 + rollup-plugin-terser: 7.0.2_rollup@2.59.0 + source-map: 0.8.0-beta.0 + source-map-url: 0.4.1 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 6.3.0 + workbox-broadcast-update: 6.3.0 + workbox-cacheable-response: 6.3.0 + workbox-core: 6.3.0 + workbox-expiration: 6.3.0 + workbox-google-analytics: 6.3.0 + workbox-navigation-preload: 6.3.0 + workbox-precaching: 6.3.0 + workbox-range-requests: 6.3.0 + workbox-recipes: 6.3.0 + workbox-routing: 6.3.0 + workbox-strategies: 6.3.0 + workbox-streams: 6.3.0 + workbox-sw: 6.3.0 + workbox-window: 6.3.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + /workbox-cacheable-response/6.2.4: resolution: {integrity: sha512-KZSzAOmgWsrk15Wu+geCUSGLIyyzHaORKjH5JnR6qcVZAsm0JXUu2m2OZGqjQ+/eyQwrGdXXqAMW+4wQvTXccg==} dependencies: workbox-core: 6.2.4 dev: true + /workbox-cacheable-response/6.3.0: + resolution: {integrity: sha512-oYCRGF6PFEmJJkktdxYw/tcrU8N5u/2ihxVSHd+9sNqjNMDiXLqsewcEG544f1yx7gq5/u6VcvUA5N62KzN1GQ==} + dependencies: + workbox-core: 6.3.0 + dev: true + /workbox-core/6.2.4: resolution: {integrity: sha512-Nu8X4R4Is3g8uzEJ6qwbW2CGVpzntW/cSf8OfsQGIKQR0nt84FAKzP2cLDaNLp3L/iV9TuhZgCTZzkMiap5/OQ==} dev: true + /workbox-core/6.3.0: + resolution: {integrity: sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg==} + dev: true + /workbox-expiration/6.2.4: resolution: {integrity: sha512-EdOBLunrE3+Ff50y7AYDbiwtiLDvB+oEIkL1Wd9G5d176YVqFfgPfMRzJQ7fN+Yy2NfmsFME0Bw+dQruYekWsQ==} dependencies: @@ -22031,6 +26025,13 @@ packages: workbox-core: 6.2.4 dev: true + /workbox-expiration/6.3.0: + resolution: {integrity: sha512-teYuYfM3HFbwAD/nlZDw/dCMOrCKjsAiMRhz0uOy9IkfBb7vBynO3xf118lY62X6BfqjZdeahiHh10N0/aYICg==} + dependencies: + idb: 6.1.5 + workbox-core: 6.3.0 + dev: true + /workbox-google-analytics/6.2.4: resolution: {integrity: sha512-+PWmTouoGGcDupaxM193F2NmgrF597Pyt9eHIDxfed+x+JSSeUkETlbAKwB8rnBHkAjs8JQcvStEP/IpueNKpQ==} dependencies: @@ -22040,12 +26041,27 @@ packages: workbox-strategies: 6.2.4 dev: true + /workbox-google-analytics/6.3.0: + resolution: {integrity: sha512-6u0y21rtimnrCKpvayTkwh9y4Y5Xdn6X87x895WzwcOcWA2j/Nl7nmCpB0wjjhqU9pMj7B2lChqfypP+xUs5IA==} + dependencies: + workbox-background-sync: 6.3.0 + workbox-core: 6.3.0 + workbox-routing: 6.3.0 + workbox-strategies: 6.3.0 + dev: true + /workbox-navigation-preload/6.2.4: resolution: {integrity: sha512-y2dOSsaSdEimqhCmBIFR6kBp+GZbtNtWCBaMFwfKxTAul2uyllKcTKBHnZ9IzxULue6o6voV+I2U8Y8tO8n+eA==} dependencies: workbox-core: 6.2.4 dev: true + /workbox-navigation-preload/6.3.0: + resolution: {integrity: sha512-D7bomh9SCn1u6n32FqAWfyHe2dkK6mWbwcTsoeBnFSD0p8Gr9Zq1Mpt/DitEfGIQHck90Zd024xcTFLkjczS/Q==} + dependencies: + workbox-core: 6.3.0 + dev: true + /workbox-precaching/6.2.4: resolution: {integrity: sha512-7POznbVc8EG/mkbXzeb94x3B1VJruPgXvXFgS0NJ3GRugkO4ULs/DpIIb+ycs7uJIKY9EzLS7VXvElr3rMSozQ==} dependencies: @@ -22054,12 +26070,26 @@ packages: workbox-strategies: 6.2.4 dev: true + /workbox-precaching/6.3.0: + resolution: {integrity: sha512-bND3rUxiuzFmDfeKywdvOqK0LQ5LLbOPk0eX22PlMQNOOduHRxzglMpgHo/MR6h+8cPJ3GpxT8hZ895/7bHMqQ==} + dependencies: + workbox-core: 6.3.0 + workbox-routing: 6.3.0 + workbox-strategies: 6.3.0 + dev: true + /workbox-range-requests/6.2.4: resolution: {integrity: sha512-q4jjTXD1QOKbrHnzV3nxdZtIpOiVoIP5QyVmjuJrybVnAZurtyKcqirTQcAcT/zlTvgwm07zcTTk9o/zIB6DmA==} dependencies: workbox-core: 6.2.4 dev: true + /workbox-range-requests/6.3.0: + resolution: {integrity: sha512-AHnGtfSvc/fBt+8NCVT6jVcshv7oFkiuS94YsedQu2sIN1jKHkxLaj7qMBl818FoY6x7r0jw1WLmG/QDmI1/oA==} + dependencies: + workbox-core: 6.3.0 + dev: true + /workbox-recipes/6.2.4: resolution: {integrity: sha512-z7oECGrt940dw1Bv0xIDJEXY1xARiaxsIedeJOutZFkbgaC/yWG61VTr/hmkeJ8Nx6jnY6W7Rc0iOUvg4sePag==} dependencies: @@ -22071,18 +26101,41 @@ packages: workbox-strategies: 6.2.4 dev: true + /workbox-recipes/6.3.0: + resolution: {integrity: sha512-f0AZyxd48E4t+PV+ifgIf8WodfJqRj8/E0t+PwppDIdTPyD59cIh0HZBtgPKFdIMVnltodpMz4zioxym1H3GjQ==} + dependencies: + workbox-cacheable-response: 6.3.0 + workbox-core: 6.3.0 + workbox-expiration: 6.3.0 + workbox-precaching: 6.3.0 + workbox-routing: 6.3.0 + workbox-strategies: 6.3.0 + dev: true + /workbox-routing/6.2.4: resolution: {integrity: sha512-jHnOmpeH4MOWR4eXv6l608npD2y6IFv7yFJ1bT9/RbB8wq2vXHXJQ0ExTZRTWGbVltSG22wEU+MQ8VebDDwDeg==} dependencies: workbox-core: 6.2.4 dev: true + /workbox-routing/6.3.0: + resolution: {integrity: sha512-asajX5UPkaoU4PB9pEpxKWKkcpA+KJQUEeYU6NlK0rXTCpdWQ6iieMRDoBTZBjTzUdL3j3s1Zo2qCOSvtXSYGg==} + dependencies: + workbox-core: 6.3.0 + dev: true + /workbox-strategies/6.2.4: resolution: {integrity: sha512-DKgGC3ruceDuu2o+Ae5qmJy0p0q21mFP+RrkdqKrjyf2u8cJvvtvt1eIt4nevKc5BESiKxmhC2h+TZpOSzUDvA==} dependencies: workbox-core: 6.2.4 dev: true + /workbox-strategies/6.3.0: + resolution: {integrity: sha512-SYZt40y+Iu5nA+UEPQOrAuAMMNTxtUBPLCIaMMb4lcADpBYrNP1CD+/s2QsrxzS651a8hfi06REKt+uTp1tqfw==} + dependencies: + workbox-core: 6.3.0 + dev: true + /workbox-streams/6.2.4: resolution: {integrity: sha512-yG6zV7S2NmYT6koyb7/DoPsyUAat9kD+rOmjP2SbBCtJdLu6ZIi1lgN4/rOkxEby/+Xb4OE4RmCSIZdMyjEmhQ==} dependencies: @@ -22090,10 +26143,21 @@ packages: workbox-routing: 6.2.4 dev: true + /workbox-streams/6.3.0: + resolution: {integrity: sha512-CiRsuoXJOytA7IQriRu6kVCa0L4OdNi0DdniiSageu/EZuxTswNXpgVzkGE4IDArU/5jlzgRtwqrqIWCJX+OMA==} + dependencies: + workbox-core: 6.3.0 + workbox-routing: 6.3.0 + dev: true + /workbox-sw/6.2.4: resolution: {integrity: sha512-OlWLHNNM+j44sN2OaVXnVcf2wwhJUzcHlXrTrbWDu1JWnrQJ/rLicdc/sbxkZoyE0EbQm7Xr1BXcOjsB7PNlXQ==} dev: true + /workbox-sw/6.3.0: + resolution: {integrity: sha512-xwrXRBzw5jwJ7VdAQkTSNTbNZ4S6VhXtbZZ0vY6XKNQARO5nuGphNdif+hJFIejHUgtV6ESpQnixPj5hYB2jKQ==} + dev: true + /workbox-webpack-plugin/6.2.4_webpack@4.46.0: resolution: {integrity: sha512-G6yeOZDYEbtqgNasqwxHFnma0Vp237kMxpsf8JV/YIhvhUuMwnh1WKv4VnFeqmYaWW/ITx0qj92IEMWB/O1mAA==} engines: {node: '>=10.0.0'} @@ -22112,6 +26176,24 @@ packages: - supports-color dev: true + /workbox-webpack-plugin/6.3.0_webpack@4.46.0: + resolution: {integrity: sha512-3l5H8h7O2eUgTAISQoglDe4VJDDYTZaDnkRY0FY2+eFOXA+fZoWuDSmLiMnA0uYqPC4NWVTZwP549E0dWgiWjw==} + engines: {node: '>=10.0.0'} + peerDependencies: + webpack: ^4.4.0 || ^5.9.0 + dependencies: + fast-json-stable-stringify: 2.1.0 + pretty-bytes: 5.6.0 + source-map-url: 0.4.1 + upath: 1.2.0 + webpack: 4.46.0 + webpack-sources: 1.4.3 + workbox-build: 6.3.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + /workbox-window/6.2.4: resolution: {integrity: sha512-9jD6THkwGEASj1YP56ZBHYJ147733FoGpJlMamYk38k/EBFE75oc6K3Vs2tGOBx5ZGq54+mHSStnlrtFG3IiOg==} dependencies: @@ -22119,6 +26201,13 @@ packages: workbox-core: 6.2.4 dev: true + /workbox-window/6.3.0: + resolution: {integrity: sha512-CFP84assX9srH/TOx4OD8z4EBPO/Cq4WKdV2YLcJIFJmVTS/cB63XKeidKl2KJk8qOOLVIKnaO7BLmb0MxGFtA==} + dependencies: + '@types/trusted-types': 2.0.2 + workbox-core: 6.3.0 + dev: true + /worker-farm/1.7.0: resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} dependencies: @@ -22154,8 +26243,8 @@ packages: engines: {node: '>=10'} 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 dev: true /wrappy/1.0.2: @@ -22167,17 +26256,10 @@ packages: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 - signal-exit: 3.0.3 + signal-exit: 3.0.5 typedarray-to-buffer: 3.1.5 dev: true - /write/1.0.3: - resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} - engines: {node: '>=4'} - dependencies: - mkdirp: 0.5.5 - dev: true - /ws/6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} dependencies: @@ -22197,6 +26279,19 @@ packages: optional: true dev: true + /ws/7.5.5: + resolution: {integrity: sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==} + 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 + dev: true + /xdg-basedir/4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} engines: {node: '>=8'} @@ -22301,7 +26396,7 @@ packages: escalade: 3.1.1 get-caller-file: 2.0.5 require-directory: 2.1.1 - string-width: 4.2.2 + string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 dev: true |