summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoss Marco <bossm8@bfh.ch>2021-11-05 16:57:32 +0100
committerBoss Marco <bossm8@bfh.ch>2021-11-05 16:57:32 +0100
commit98064f0652d8e1dff661e3bb0d8791f4af04ad6f (patch)
tree5d278fd1fab17b0c4b03cc89bcea678edd3789d3
parent8d9386ac008e9d095867433bfc789d09bd93414d (diff)
parent842cc327541ebcfc761208f42bf5f74e22c6283c (diff)
downloadwallet-core-98064f0652d8e1dff661e3bb0d8791f4af04ad6f.tar.gz
wallet-core-98064f0652d8e1dff661e3bb0d8791f4af04ad6f.tar.bz2
wallet-core-98064f0652d8e1dff661e3bb0d8791f4af04ad6f.zip
added some logging messages
-rw-r--r--package.json6
-rwxr-xr-xpackages/anastasis-core/bin/anastasis-ts-reducer.js14
-rw-r--r--packages/anastasis-core/package.json16
-rw-r--r--packages/anastasis-core/rollup.config.js56
-rw-r--r--packages/anastasis-core/src/challenge-feedback-types.ts168
-rw-r--r--packages/anastasis-core/src/cli-entry.ts15
-rw-r--r--packages/anastasis-core/src/cli.ts64
-rw-r--r--packages/anastasis-core/src/crypto.ts9
-rw-r--r--packages/anastasis-core/src/index.node.ts2
-rw-r--r--packages/anastasis-core/src/index.ts1615
-rw-r--r--packages/anastasis-core/src/policy-suggestion.ts230
-rw-r--r--packages/anastasis-core/src/provider-types.ts13
-rw-r--r--packages/anastasis-core/src/recovery-document-types.ts13
-rw-r--r--packages/anastasis-core/src/reducer-types.ts226
-rw-r--r--packages/anastasis-core/src/validators.ts28
-rw-r--r--packages/anastasis-webui/.storybook/preview.js6
-rw-r--r--packages/anastasis-webui/package.json51
-rw-r--r--packages/anastasis-webui/src/assets/empty.pngbin0 -> 2785 bytes
-rw-r--r--packages/anastasis-webui/src/assets/example/id1.jpgbin0 -> 103558 bytes
-rw-r--r--packages/anastasis-webui/src/assets/icons/auth_method/email.svg1
-rw-r--r--packages/anastasis-webui/src/assets/icons/auth_method/postal.svg1
-rw-r--r--packages/anastasis-webui/src/assets/icons/auth_method/question.svg1
-rw-r--r--packages/anastasis-webui/src/assets/icons/auth_method/sms.svg1
-rw-r--r--packages/anastasis-webui/src/assets/icons/auth_method/video.svg1
-rw-r--r--packages/anastasis-webui/src/components/AsyncButton.tsx49
-rw-r--r--packages/anastasis-webui/src/components/Notifications.tsx59
-rw-r--r--packages/anastasis-webui/src/components/QR.tsx35
-rw-r--r--packages/anastasis-webui/src/components/fields/DateInput.tsx74
-rw-r--r--packages/anastasis-webui/src/components/fields/EmailInput.tsx44
-rw-r--r--packages/anastasis-webui/src/components/fields/FileInput.tsx81
-rw-r--r--packages/anastasis-webui/src/components/fields/ImageInput.tsx81
-rw-r--r--packages/anastasis-webui/src/components/fields/NumberInput.tsx43
-rw-r--r--packages/anastasis-webui/src/components/fields/TextInput.tsx42
-rw-r--r--packages/anastasis-webui/src/components/menu/NavigationBar.tsx2
-rw-r--r--packages/anastasis-webui/src/components/menu/SideBar.tsx66
-rw-r--r--packages/anastasis-webui/src/components/picker/DatePicker.tsx326
-rw-r--r--packages/anastasis-webui/src/components/picker/DurationPicker.stories.tsx50
-rw-r--r--packages/anastasis-webui/src/components/picker/DurationPicker.tsx154
-rw-r--r--packages/anastasis-webui/src/declaration.d.ts7
-rw-r--r--packages/anastasis-webui/src/hooks/async.ts77
-rw-r--r--packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts66
-rw-r--r--packages/anastasis-webui/src/pages/home/AddingProviderScreen.stories.tsx50
-rw-r--r--packages/anastasis-webui/src/pages/home/AddingProviderScreen.tsx101
-rw-r--r--packages/anastasis-webui/src/pages/home/AttributeEntryScreen.stories.tsx81
-rw-r--r--packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx150
-rw-r--r--packages/anastasis-webui/src/pages/home/AuthMethodEmailSetup.tsx42
-rw-r--r--packages/anastasis-webui/src/pages/home/AuthMethodPostSetup.tsx69
-rw-r--r--packages/anastasis-webui/src/pages/home/AuthMethodQuestionSetup.tsx46
-rw-r--r--packages/anastasis-webui/src/pages/home/AuthMethodSmsSetup.tsx51
-rw-r--r--packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.stories.tsx60
-rw-r--r--packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx222
-rw-r--r--packages/anastasis-webui/src/pages/home/BackupFinishedScreen.stories.tsx7
-rw-r--r--packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx33
-rw-r--r--packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.stories.tsx223
-rw-r--r--packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx207
-rw-r--r--packages/anastasis-webui/src/pages/home/ChallengePayingScreen.stories.tsx (renamed from packages/anastasis-webui/src/pages/home/CountrySelectionScreen.stories.tsx)10
-rw-r--r--packages/anastasis-webui/src/pages/home/ChallengePayingScreen.tsx33
-rw-r--r--packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.stories.tsx22
-rw-r--r--packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx98
-rw-r--r--packages/anastasis-webui/src/pages/home/CountrySelectionScreen.tsx27
-rw-r--r--packages/anastasis-webui/src/pages/home/EditPoliciesScreen.stories.tsx109
-rw-r--r--packages/anastasis-webui/src/pages/home/EditPoliciesScreen.tsx133
-rw-r--r--packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.stories.tsx5
-rw-r--r--packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx2
-rw-r--r--packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.stories.tsx7
-rw-r--r--packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx14
-rw-r--r--packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.stories.tsx215
-rw-r--r--packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx78
-rw-r--r--packages/anastasis-webui/src/pages/home/SecretEditorScreen.stories.tsx5
-rw-r--r--packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx33
-rw-r--r--packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx8
-rw-r--r--packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx179
-rw-r--r--packages/anastasis-webui/src/pages/home/SolveEmailEntry.tsx25
-rw-r--r--packages/anastasis-webui/src/pages/home/SolvePostEntry.tsx23
-rw-r--r--packages/anastasis-webui/src/pages/home/SolveQuestionEntry.tsx23
-rw-r--r--packages/anastasis-webui/src/pages/home/SolveScreen.stories.tsx17
-rw-r--r--packages/anastasis-webui/src/pages/home/SolveScreen.tsx220
-rw-r--r--packages/anastasis-webui/src/pages/home/SolveSmsEntry.tsx25
-rw-r--r--packages/anastasis-webui/src/pages/home/SolveUnsupportedEntry.tsx12
-rw-r--r--packages/anastasis-webui/src/pages/home/StartScreen.stories.tsx3
-rw-r--r--packages/anastasis-webui/src/pages/home/StartScreen.tsx33
-rw-r--r--packages/anastasis-webui/src/pages/home/TruthsPayingScreen.stories.tsx5
-rw-r--r--packages/anastasis-webui/src/pages/home/TruthsPayingScreen.tsx4
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.stories.tsx66
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.tsx62
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.stories.tsx65
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.tsx68
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.stories.tsx66
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.tsx102
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.stories.tsx66
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.tsx71
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.stories.tsx66
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.tsx63
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.stories.tsx64
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx81
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.stories.tsx66
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.tsx56
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/index.tsx69
-rw-r--r--packages/anastasis-webui/src/pages/home/authMethod/totp.ts56
-rw-r--r--packages/anastasis-webui/src/pages/home/index.tsx86
-rw-r--r--packages/anastasis-webui/src/scss/_custom-calendar.scss4
-rw-r--r--packages/anastasis-webui/src/scss/main.scss10
-rw-r--r--packages/anastasis-webui/src/utils/index.tsx119
-rw-r--r--packages/taler-util/src/amounts.ts3
-rw-r--r--packages/taler-util/src/clk.ts620
-rw-r--r--packages/taler-util/src/http-status-codes.ts379
-rw-r--r--packages/taler-util/src/index.node.ts1
-rw-r--r--packages/taler-util/src/index.ts1
-rw-r--r--packages/taler-util/src/logging.ts101
-rw-r--r--packages/taler-util/src/time.ts14
-rw-r--r--packages/taler-wallet-cli/src/bench1.ts14
-rw-r--r--packages/taler-wallet-cli/src/harness/harness.ts217
-rw-r--r--packages/taler-wallet-cli/src/harness/helpers.ts10
-rw-r--r--packages/taler-wallet-cli/src/harness/libeufin-apis.ts857
-rw-r--r--packages/taler-wallet-cli/src/harness/libeufin.ts848
-rw-r--r--packages/taler-wallet-cli/src/index.ts8
-rw-r--r--packages/taler-wallet-core/package.json2
-rw-r--r--packages/taler-wallet-core/src/operations/backup/index.ts10
-rw-r--r--packages/taler-wallet-core/src/operations/pay.ts6
-rw-r--r--packages/taler-wallet-core/src/operations/refresh.ts5
-rw-r--r--packages/taler-wallet-core/src/util/http.ts11
-rw-r--r--packages/taler-wallet-webextension/package.json4
-rw-r--r--packages/taler-wallet-webextension/src/wallet/Transaction.tsx14
-rw-r--r--pnpm-lock.yaml7547
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
new file mode 100644
index 000000000..5120d3138
--- /dev/null
+++ b/packages/anastasis-webui/src/assets/empty.png
Binary files differ
diff --git a/packages/anastasis-webui/src/assets/example/id1.jpg b/packages/anastasis-webui/src/assets/example/id1.jpg
new file mode 100644
index 000000000..5d022a379
--- /dev/null
+++ b/packages/anastasis-webui/src/assets/example/id1.jpg
Binary files differ
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=""> &lt;&lt; off &gt;&gt; </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&nbsp;
+ <FileInput
+ label="click here"
+ bind={[secretValue, setSecretValue]}
+ />
+ &nbsp;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