gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated: ui testing


From: gnunet
Subject: [taler-wallet-core] branch master updated: ui testing
Date: Wed, 08 Jun 2022 20:19:36 +0200

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository wallet-core.

The following commit(s) were added to refs/heads/master by this push:
     new b419db50 ui testing
b419db50 is described below

commit b419db505b8cd5e7aa92043696f42a0d710d9226
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Wed Jun 8 15:18:41 2022 -0300

    ui testing
---
 packages/anastasis-webui/clean_and_build.sh        |  53 +++-
 packages/anastasis-webui/dev.mjs                   |  25 +-
 packages/anastasis-webui/{ => html}/stories.html   |   0
 .../anastasis-webui/{ui.html => html/ui-dev.html}  |  28 +-
 packages/anastasis-webui/{ => html}/ui.html        |   0
 packages/anastasis-webui/package.json              |   4 +-
 packages/anastasis-webui/src/main.test.ts          |  48 ++++
 .../src/pages/home/AddingProviderScreen.tsx        |   2 +-
 .../src/pages/home/ContinentSelectionScreen.tsx    |  16 +-
 .../pages/home/authMethod/AuthMethodTotpSetup.tsx  |   1 +
 packages/anastasis-webui/src/stories.tsx           |  21 +-
 packages/anastasis-webui/src/test-utils.ts         | 201 +++++++++++++
 packages/anastasis-webui/src/utils/index.tsx       |  14 +
 packages/anastasis-webui/watch/reply.sh            |  17 ++
 packages/anastasis-webui/watch/send_reload.sh      |   7 +
 packages/anastasis-webui/watch/serve.sh            |   4 +
 .../watch/web_socket_client.request                |   6 +
 .../anastasis-webui/watch/web_socket_server.reply  |   5 +
 .../taler-wallet-webextension/clean_and_build.sh   |   2 +-
 packages/taler-wallet-webextension/package.json    |   1 +
 pnpm-lock.yaml                                     | 316 ++++++++++++++-------
 21 files changed, 632 insertions(+), 139 deletions(-)

diff --git a/packages/anastasis-webui/clean_and_build.sh 
b/packages/anastasis-webui/clean_and_build.sh
index 300ed893..2fa3ec77 100755
--- a/packages/anastasis-webui/clean_and_build.sh
+++ b/packages/anastasis-webui/clean_and_build.sh
@@ -10,16 +10,51 @@ cp \
        src/scss/fonts/materialdesignicons-webfont-4.9.95.woff2 \
        dist/fonts
 
-echo css
-pnpm exec sass -I . ./src/scss/main.scss dist/main.css &
-echo js
-pnpm exec esbuild --log-level=error --bundle src/main.ts --outdir=dist 
--target=es6 --loader:.svg=dataurl --format=iife --sourcemap --jsx-factory=h 
--jsx-fragment=Fragment --platform=browser &
+function build_css() {
+       pnpm exec sass -I . ./src/scss/main.scss dist/main.css
+}
+function build_js() {
+       pnpm exec esbuild --log-level=error --bundle $1 --outdir=dist 
--target=es6 --loader:.svg=dataurl --format=iife --sourcemap --jsx-factory=h 
--jsx-fragment=Fragment --platform=browser
+}
+
+function bundle() {
+       cat html/$1.html \
+         | sed -e '/ANASTASIS_SCRIPT_CONTENT/ {' -e 'r dist/main.js' -e 'd' -e 
'}' \
+         | sed -e '/ANASTASIS_STYLE_CONTENT/ {' -e 'r dist/main.css' -e 'd' -e 
'}' \
+         >dist/$1.html
+}
+
+function cleanup {
+ trap - SIGHUP SIGINT SIGTERM SIGQUIT
+ echo -n "Cleaning up... "
+ kill -- -$$
+ exit 1
+}
+trap cleanup SIGHUP SIGINT SIGTERM SIGQUIT
+
+
+echo compile
+build_css &
+build_js src/main.ts &
+build_js src/main.test.ts &
 wait -n
 wait -n
+wait -n
+pnpm run --silent test -- -R dot
 
 echo html
-cat ui.html \
-       | sed -e '/ANASTASIS_SCRIPT_CONTENT/ {' -e 'r dist/main.js' -e 'd' -e 
'}' \
-       | sed -e '/ANASTASIS_STYLE_CONTENT/ {' -e 'r dist/main.css' -e 'd' -e 
'}' \
-       >dist/index.html
-echo done
+bundle ui
+bundle ui-dev
+
+
+if [ "WATCH" == "$1" ]; then
+
+  echo watch mode
+  inotifywait -e close_write -r src -q -m | while read line; do
+    DATE=$(date)
+    echo $DATE $line
+    build_js src/main.ts
+    bundle ui-dev
+    ./watch/send_reload.sh
+  done;
+fi
diff --git a/packages/anastasis-webui/dev.mjs b/packages/anastasis-webui/dev.mjs
index d6b6bf10..3f4915ff 100755
--- a/packages/anastasis-webui/dev.mjs
+++ b/packages/anastasis-webui/dev.mjs
@@ -1,4 +1,19 @@
 #!/usr/bin/env node
+/*
+ This file is part of GNU Anastasis
+ (C) 2021-2022 Anastasis SARL
+
+ GNU Anastasis is free software; you can redistribute it and/or modify it 
under the
+ terms of the GNU Affero General Public License as published by the Free 
Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Anastasis 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 Affero General Public License for more 
details.
+
+ You should have received a copy of the GNU Affero General Public License 
along with
+ GNU Anastasis; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
 /* eslint-disable no-undef */
 import esbuild from 'esbuild'
 import fs from 'fs';
@@ -41,14 +56,17 @@ const watcher = chokidar
     broadcast(file, { type: "RELOAD" });
   });
 
-
-fs.writeFileSync("dist/stories.html", fs.readFileSync("stories.html"))
+/**
+ * Just bundling UI Stories.
+ * FIXME: add linaria CSS after implementing Material so CSS will be bundled
+ */
+fs.writeFileSync("dist/index.html", fs.readFileSync("html/stories.html"))
 fs.writeFileSync("dist/mocha.css", 
fs.readFileSync("node_modules/mocha/mocha.css"))
 fs.writeFileSync("dist/mocha.js", 
fs.readFileSync("node_modules/mocha/mocha.js"))
 fs.writeFileSync("dist/mocha.js.map", 
fs.readFileSync("node_modules/mocha/mocha.js.map"))
 
 export const buildConfig = {
-  entryPoints: ['src/stories.tsx'],
+  entryPoints: ['src/main.ts', 'src/stories.tsx'],
   bundle: true,
   outdir: 'dist',
   minify: false,
@@ -75,7 +93,6 @@ const server = await esbuild
   });
 
 console.log(`Dev server is ready at http://localhost:${server.port}/.
-http://localhost:${server.port}/stories.html for the components stories.
 The server is running a using websocket at ${devServerPort} to notify code 
change and live reload.
 `);
 
diff --git a/packages/anastasis-webui/stories.html 
b/packages/anastasis-webui/html/stories.html
similarity index 100%
rename from packages/anastasis-webui/stories.html
rename to packages/anastasis-webui/html/stories.html
diff --git a/packages/anastasis-webui/ui.html 
b/packages/anastasis-webui/html/ui-dev.html
similarity index 74%
copy from packages/anastasis-webui/ui.html
copy to packages/anastasis-webui/html/ui-dev.html
index 17c48e90..4cc36268 100644
--- a/packages/anastasis-webui/ui.html
+++ b/packages/anastasis-webui/html/ui-dev.html
@@ -14,15 +14,37 @@
       
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/
 [...]
     />
     <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
-    <style>
+    <style type="text/css">
+      /* <![CDATA[ */
       ANASTASIS_STYLE_CONTENT
+      /* <![CDATA[ */
     </style>
   </head>
 
   <body>
     <div id="container" class="anastasis-container"></div>
-    <script>
-      ANASTASIS_SCRIPT_CONTENT
+    <script type="application/javascript">
+      ANASTASIS_SCRIPT_CONTENT;
+    </script>
+    <script type="application/javascript">
+      function setupLiveReload(port) {
+        const socketPath = `ws://localhost:${port}/socket`;
+
+        const ws = new WebSocket(socketPath);
+        ws.onmessage = (message) => {
+          const event = JSON.parse(message.data);
+          if (event.type === "LOG") {
+            console.log(event.message);
+          }
+          if (event.type === "RELOAD") {
+            window.location.reload();
+          }
+        };
+        ws.onerror = (error) => {
+          console.error(error);
+        };
+      }
+      setupLiveReload(8003);
     </script>
   </body>
 </html>
diff --git a/packages/anastasis-webui/ui.html 
b/packages/anastasis-webui/html/ui.html
similarity index 100%
rename from packages/anastasis-webui/ui.html
rename to packages/anastasis-webui/html/ui.html
diff --git a/packages/anastasis-webui/package.json 
b/packages/anastasis-webui/package.json
index 95b85585..7c57160c 100644
--- a/packages/anastasis-webui/package.json
+++ b/packages/anastasis-webui/package.json
@@ -9,7 +9,7 @@
     "dev": "./dev.mjs",
     "prepare": "pnpm compile",
     "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'",
-    "test": "echo no tests",
+    "test": "mocha --enable-source-maps 'dist/**/*.test.js'",
     "pretty": "prettier --write src"
   },
   "dependencies": {
@@ -18,6 +18,7 @@
     "date-fns": "2.28.0",
     "jed": "1.1.1",
     "preact": "^10.5.15",
+    "preact-render-to-string": "^5.1.19",
     "preact-router": "^3.2.1",
     "qrcode-generator": "^1.4.4"
   },
@@ -34,6 +35,7 @@
   },
   "devDependencies": {
     "@creativebulma/bulma-tooltip": "^1.2.0",
+    "@types/mocha": "^9.0.0",
     "bulma": "^0.9.3",
     "bulma-checkbox": "^1.1.1",
     "bulma-radio": "^1.1.1",
diff --git a/packages/anastasis-webui/src/main.test.ts 
b/packages/anastasis-webui/src/main.test.ts
new file mode 100644
index 00000000..e65cca45
--- /dev/null
+++ b/packages/anastasis-webui/src/main.test.ts
@@ -0,0 +1,48 @@
+/*
+ This file is part of GNU Anastasis
+ (C) 2021-2022 Anastasis SARL
+
+ GNU Anastasis is free software; you can redistribute it and/or modify it 
under the
+ terms of the GNU Affero General Public License as published by the Free 
Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Anastasis 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 Affero General Public License for more 
details.
+
+ You should have received a copy of the GNU Affero General Public License 
along with
+ GNU Anastasis; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
+
+/**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
+import { setupI18n } from "@gnu-taler/taler-util";
+import { renderNodeOrBrowser } from "./test-utils.js";
+import * as pages from "./pages/home/index.storiesNo.js";
+
+setupI18n("en", { en: {} });
+
+function testThisStory(st: any): any {
+  describe(`render examples for ${(st as any).default.title}`, () => {
+    Object.keys(st).forEach((k) => {
+      const Component = (st as any)[k];
+      if (k === "default" || !Component) return;
+
+      it(`example: ${k}`, () => {
+        renderNodeOrBrowser(Component, Component.args);
+      });
+    });
+  });
+}
+
+describe("render every storybook example", () => {
+  [pages].forEach(function testAll(st: any) {
+    if (Array.isArray(st.default)) {
+      st.default.forEach(testAll);
+    } else {
+      testThisStory(st);
+    }
+  });
+});
diff --git a/packages/anastasis-webui/src/pages/home/AddingProviderScreen.tsx 
b/packages/anastasis-webui/src/pages/home/AddingProviderScreen.tsx
index feeac274..d4675f9d 100644
--- a/packages/anastasis-webui/src/pages/home/AddingProviderScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/AddingProviderScreen.tsx
@@ -223,7 +223,7 @@ function TableRow({
   onDelete: (s: string) => void;
   url: string;
   info: AuthenticationProviderStatusOk;
-}) {
+}): VNode {
   const [status, setStatus] = useState("checking");
   useEffect(function () {
     testProvider(url.endsWith("/") ? url.substring(0, url.length - 1) : url)
diff --git 
a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx 
b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx
index 43d865b4..534f9136 100644
--- a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx
@@ -125,13 +125,6 @@ export function ContinentSelectionScreen(): VNode {
               </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>
@@ -151,18 +144,11 @@ export function ContinentSelectionScreen(): VNode {
             }}
           >
             <p>
-              If you just want to try out Anastasis, we recomment that you
+              If you just want to try out Anastasis, we recommend that you
               choose <b>Testcontinent</b> with <b>Demoland</b>. For this 
special
               country, you will be asked for a simple number and not real,
               personal identifiable information.
             </p>
-            {/*             
-            <p>
-              Because of the diversity of personally identifying information in
-              different countries and cultures, we do not support all countries
-              yet. If you want to improve the supported countries,{" "}
-              <a href="mailto:contact@anastasis.lu";>contact us</a>.
-            </p> */}
           </div>
         </div>
       </div>
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx
index f9b292d9..0285c87e 100644
--- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx
+++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx
@@ -36,6 +36,7 @@ export function AuthMethodTotpSetup({
   const [test, setTest] = useState("");
   const secretKey = useMemo(() => {
     const array = new Uint8Array(32);
+    if (typeof window === "undefined") return array;
     return window.crypto.getRandomValues(array);
   }, []);
 
diff --git a/packages/anastasis-webui/src/stories.tsx 
b/packages/anastasis-webui/src/stories.tsx
index a51dfb20..351d6f37 100644
--- a/packages/anastasis-webui/src/stories.tsx
+++ b/packages/anastasis-webui/src/stories.tsx
@@ -143,21 +143,24 @@ function ExampleList({
               {k.examples.map((r) => {
                 const e = encodeURIComponent;
                 const eId = `${e(r.group)}-${e(r.component)}-${e(r.name)}`;
+                function doSelection(e: any): void {
+                  e.preventDefault();
+                  location.hash = `#${eId}`;
+                  onSelectStory(r, eId);
+                }
                 const isSelected =
                   selected &&
                   selected.component === r.component &&
                   selected.group === r.group &&
                   selected.name === r.name;
                 return (
-                  <dd id={eId} key={r.name} data-selected={isSelected}>
-                    <a
-                      href={`#${eId}`}
-                      onClick={(e) => {
-                        e.preventDefault();
-                        location.hash = `#${eId}`;
-                        onSelectStory(r, eId);
-                      }}
-                    >
+                  <dd
+                    id={eId}
+                    key={r.name}
+                    data-selected={isSelected}
+                    onClick={doSelection}
+                  >
+                    <a href={`#${eId}`} onClick={doSelection}>
                       {r.name}
                     </a>
                   </dd>
diff --git a/packages/anastasis-webui/src/test-utils.ts 
b/packages/anastasis-webui/src/test-utils.ts
new file mode 100644
index 00000000..1fcc753e
--- /dev/null
+++ b/packages/anastasis-webui/src/test-utils.ts
@@ -0,0 +1,201 @@
+/*
+ This file is part of GNU Anastasis
+ (C) 2021-2022 Anastasis SARL
+
+ GNU Anastasis is free software; you can redistribute it and/or modify it 
under the
+ terms of the GNU Affero General Public License as published by the Free 
Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Anastasis 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 Affero General Public License for more 
details.
+
+ You should have received a copy of the GNU Affero General Public License 
along with
+ GNU Anastasis; see the file COPYING.  If not, see 
<http://www.gnu.org/licenses/>
+ */
+
+import {
+  ComponentChildren,
+  Fragment,
+  FunctionalComponent,
+  h as create,
+  options,
+  render as renderIntoDom,
+  VNode,
+} from "preact";
+import { render as renderToString } from "preact-render-to-string";
+
+// When doing tests we want the requestAnimationFrame to be as fast as 
possible.
+// without this option the RAF will timeout after 100ms making the tests slower
+options.requestAnimationFrame = (fn: () => void) => {
+  // console.log("RAF called")
+  return fn();
+};
+
+export function createExample<Props>(
+  Component: FunctionalComponent<Props>,
+  props: Partial<Props> | (() => Partial<Props>),
+): ComponentChildren {
+  //FIXME: props are evaluated on build time
+  // in some cases we want to evaluated the props on render time so we can get 
some relative timestamp
+  // check how we can build evaluatedProps in render time
+  const evaluatedProps = typeof props === "function" ? props() : props;
+  const Render = (args: any): VNode => create(Component, args);
+  Render.args = evaluatedProps;
+  return Render;
+}
+
+export function createExampleWithCustomContext<Props, ContextProps>(
+  Component: FunctionalComponent<Props>,
+  props: Partial<Props> | (() => Partial<Props>),
+  ContextProvider: FunctionalComponent<ContextProps>,
+  contextProps: Partial<ContextProps>,
+): ComponentChildren {
+  const evaluatedProps = typeof props === "function" ? props() : props;
+  const Render = (args: any): VNode => create(Component, args);
+  const WithContext = (args: any): VNode =>
+    create(ContextProvider, {
+      ...contextProps,
+      children: [Render(args)],
+    } as any);
+  WithContext.args = evaluatedProps;
+  return WithContext;
+}
+
+export function NullLink({
+  children,
+}: {
+  children?: ComponentChildren;
+}): VNode {
+  return create("a", { children, href: "javascript:void(0);" });
+}
+
+export function renderNodeOrBrowser(Component: any, args: any): void {
+  const vdom = create(Component, args);
+  if (typeof window === "undefined") {
+    renderToString(vdom);
+  } else {
+    const div = document.createElement("div");
+    document.body.appendChild(div);
+    renderIntoDom(vdom, div);
+    renderIntoDom(null, div);
+    document.body.removeChild(div);
+  }
+}
+
+interface Mounted<T> {
+  unmount: () => void;
+  getLastResultOrThrow: () => T;
+  assertNoPendingUpdate: () => void;
+  waitNextUpdate: (s?: string) => Promise<void>;
+}
+
+const isNode = typeof window === "undefined";
+
+export function mountHook<T>(
+  callback: () => T,
+  Context?: ({ children }: { children: any }) => VNode,
+): Mounted<T> {
+  // const result: { current: T | null } = {
+  //   current: null
+  // }
+  let lastResult: T | Error | null = null;
+
+  const listener: Array<() => void> = [];
+
+  // component that's going to hold the hook
+  function Component(): VNode {
+    try {
+      lastResult = callback();
+    } catch (e) {
+      if (e instanceof Error) {
+        lastResult = e;
+      } else {
+        lastResult = new Error(`mounting the hook throw an exception: ${e}`);
+      }
+    }
+
+    // notify to everyone waiting for an update and clean the queue
+    listener.splice(0, listener.length).forEach((cb) => cb());
+    return create(Fragment, {});
+  }
+
+  // create the vdom with context if required
+  const vdom = !Context
+    ? create(Component, {})
+    : create(Context, { children: [create(Component, {})] });
+
+  // waiter callback
+  async function waitNextUpdate(_label = ""): Promise<void> {
+    if (_label) _label = `. label: "${_label}"`;
+    await new Promise((res, rej) => {
+      const tid = setTimeout(() => {
+        rej(
+          Error(`waiting for an update but the hook didn't make one${_label}`),
+        );
+      }, 100);
+
+      listener.push(() => {
+        clearTimeout(tid);
+        res(undefined);
+      });
+    });
+  }
+
+  const customElement = {} as Element;
+  const parentElement = isNode ? customElement : document.createElement("div");
+  if (!isNode) {
+    document.body.appendChild(parentElement);
+  }
+
+  renderIntoDom(vdom, parentElement);
+
+  // clean up callback
+  function unmount(): void {
+    if (!isNode) {
+      document.body.removeChild(parentElement);
+    }
+  }
+
+  function getLastResult(): T | Error | null {
+    const copy = lastResult;
+    lastResult = null;
+    return copy;
+  }
+
+  function getLastResultOrThrow(): T {
+    const r = getLastResult();
+    if (r instanceof Error) throw r;
+    if (!r) throw Error("there was no last result");
+    return r;
+  }
+
+  async function assertNoPendingUpdate(): Promise<void> {
+    await new Promise((res, rej) => {
+      const tid = setTimeout(() => {
+        res(undefined);
+      }, 10);
+
+      listener.push(() => {
+        clearTimeout(tid);
+        rej(
+          Error(`Expecting no pending result but the hook got updated. 
+        If the update was not intended you need to check the hook dependencies 
+        (or dependencies of the internal state) but otherwise make 
+        sure to consume the result before ending the test.`),
+        );
+      });
+    });
+
+    const r = getLastResult();
+    if (r)
+      throw Error(`There are still pending results.
+    This may happen because the hook did a new update but the test didn't 
consume the result using getLastResult`);
+  }
+  return {
+    unmount,
+    getLastResultOrThrow,
+    waitNextUpdate,
+    assertNoPendingUpdate,
+  };
+}
diff --git a/packages/anastasis-webui/src/utils/index.tsx 
b/packages/anastasis-webui/src/utils/index.tsx
index ce21071f..204c48d1 100644
--- a/packages/anastasis-webui/src/utils/index.tsx
+++ b/packages/anastasis-webui/src/utils/index.tsx
@@ -209,10 +209,12 @@ export const reducerStatesExample = {
   initial: undefined,
   recoverySelectCountry: {
     ...base,
+    reducer_type: "recovery",
     recovery_state: RecoveryStates.CountrySelecting,
   } as ReducerState,
   recoverySelectContinent: {
     ...base,
+    reducer_type: "recovery",
     recovery_state: RecoveryStates.ContinentSelecting,
   } as ReducerState,
   secretSelection: {
@@ -222,10 +224,12 @@ export const reducerStatesExample = {
   } as ReducerState,
   recoveryFinished: {
     ...base,
+    reducer_type: "recovery",
     recovery_state: RecoveryStates.RecoveryFinished,
   } as ReducerState,
   challengeSelecting: {
     ...base,
+    reducer_type: "recovery",
     recovery_state: RecoveryStates.ChallengeSelecting,
   } as ReducerState,
   challengeSolving: {
@@ -235,34 +239,42 @@ export const reducerStatesExample = {
   } as ReducerStateRecovery,
   challengePaying: {
     ...base,
+    reducer_type: "recovery",
     recovery_state: RecoveryStates.ChallengePaying,
   } as ReducerState,
   recoveryAttributeEditing: {
     ...base,
+    reducer_type: "recovery",
     recovery_state: RecoveryStates.UserAttributesCollecting,
   } as ReducerState,
   backupSelectCountry: {
     ...base,
+    reducer_type: "backup",
     backup_state: BackupStates.CountrySelecting,
   } as ReducerState,
   backupSelectContinent: {
     ...base,
+    reducer_type: "backup",
     backup_state: BackupStates.ContinentSelecting,
   } as ReducerState,
   secretEdition: {
     ...base,
+    reducer_type: "backup",
     backup_state: BackupStates.SecretEditing,
   } as ReducerState,
   policyReview: {
     ...base,
+    reducer_type: "backup",
     backup_state: BackupStates.PoliciesReviewing,
   } as ReducerState,
   policyPay: {
     ...base,
+    reducer_type: "backup",
     backup_state: BackupStates.PoliciesPaying,
   } as ReducerState,
   backupFinished: {
     ...base,
+    reducer_type: "backup",
     backup_state: BackupStates.BackupFinished,
   } as ReducerState,
   authEditing: {
@@ -272,10 +284,12 @@ export const reducerStatesExample = {
   } as ReducerState,
   backupAttributeEditing: {
     ...base,
+    reducer_type: "backup",
     backup_state: BackupStates.UserAttributesCollecting,
   } as ReducerState,
   truthsPaying: {
     ...base,
+    reducer_type: "backup",
     backup_state: BackupStates.TruthsPaying,
   } as ReducerState,
 };
diff --git a/packages/anastasis-webui/watch/reply.sh 
b/packages/anastasis-webui/watch/reply.sh
new file mode 100755
index 00000000..1b42aa4e
--- /dev/null
+++ b/packages/anastasis-webui/watch/reply.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+SERVER_KEY=258EAFA5-E914-47DA-95CA-C5AB0DC85B11
+
+while read line; do
+  LINE=$(echo $line | tr -d '\r')
+  case $LINE in 
+    Sec-WebSocket-Key:*)
+      CLIENT_KEY="${LINE:19}"
+      export WS_ACCEPT=$( echo -n $CLIENT_KEY$SERVER_KEY | sha1sum | xxd -r -p 
| base64 )
+      ;;
+     "") break ;;
+  esac
+done
+
+cat watch/web_socket_server.reply | sed 's/$'"/`echo \\\r`/" | envsubst 
'$WS_ACCEPT'
+
+socat UNIX-RECV:./send_signal STDOUT
diff --git a/packages/anastasis-webui/watch/send_reload.sh 
b/packages/anastasis-webui/watch/send_reload.sh
new file mode 100755
index 00000000..87eef7d5
--- /dev/null
+++ b/packages/anastasis-webui/watch/send_reload.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+COMMAND='{"type":"RELOAD"}'
+LEN=$(printf '%x\n' ${#COMMAND})
+OPCODE=81
+cat <(echo -n $OPCODE$LEN | xxd -r -p) <(echo -n $COMMAND) | socat - 
UNIX-SEND:./send_signal
+
diff --git a/packages/anastasis-webui/watch/serve.sh 
b/packages/anastasis-webui/watch/serve.sh
new file mode 100755
index 00000000..cf273741
--- /dev/null
+++ b/packages/anastasis-webui/watch/serve.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+socat TCP-LISTEN:8003,fork EXEC:"./watch/reply.sh"
+
diff --git a/packages/anastasis-webui/watch/web_socket_client.request 
b/packages/anastasis-webui/watch/web_socket_client.request
new file mode 100644
index 00000000..e7077b0c
--- /dev/null
+++ b/packages/anastasis-webui/watch/web_socket_client.request
@@ -0,0 +1,6 @@
+GET /socket HTTP/1.1
+Connection: Upgrade
+Upgrade: websocket
+Sec-WebSocket-Version: 13
+Sec-WebSocket-Key: aaaaaaaaaaaaaaaaaaaaaa==
+
diff --git a/packages/anastasis-webui/watch/web_socket_server.reply 
b/packages/anastasis-webui/watch/web_socket_server.reply
new file mode 100644
index 00000000..b4e0db00
--- /dev/null
+++ b/packages/anastasis-webui/watch/web_socket_server.reply
@@ -0,0 +1,5 @@
+HTTP/1.1 101 Switching Protocols
+Upgrade: websocket
+Connection: Upgrade
+Sec-WebSocket-Accept: $WS_ACCEPT
+
diff --git a/packages/taler-wallet-webextension/clean_and_build.sh 
b/packages/taler-wallet-webextension/clean_and_build.sh
index 2662f8b2..fb53124e 100755
--- a/packages/taler-wallet-webextension/clean_and_build.sh
+++ b/packages/taler-wallet-webextension/clean_and_build.sh
@@ -2,7 +2,7 @@
 
 set -e
 
-#rm -rf dist lib tsconfig.tsbuildinfo .linaria-cache
+rm -rf dist lib tsconfig.tsbuildinfo .linaria-cache
 
 echo typecheck and bundle...
 node build-fast-with-linaria.mjs &
diff --git a/packages/taler-wallet-webextension/package.json 
b/packages/taler-wallet-webextension/package.json
index 88baeb26..d9940776 100644
--- a/packages/taler-wallet-webextension/package.json
+++ b/packages/taler-wallet-webextension/package.json
@@ -44,6 +44,7 @@
   },
   "devDependencies": {
     "@babel/core": "7.13.16",
+    "@babel/plugin-transform-modules-commonjs": "^7.18.2",
     "@babel/plugin-transform-react-jsx-source": "^7.12.13",
     "@babel/preset-typescript": "^7.13.0",
     "@babel/runtime": "^7.17.8",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ae0d5625..7e358f62 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -56,6 +56,7 @@ importers:
       '@creativebulma/bulma-tooltip': ^1.2.0
       '@gnu-taler/anastasis-core': workspace:*
       '@gnu-taler/taler-util': workspace:*
+      '@types/mocha': ^9.0.0
       bulma: ^0.9.3
       bulma-checkbox: ^1.1.1
       bulma-radio: ^1.1.1
@@ -66,6 +67,7 @@ importers:
       jssha: ^3.2.0
       mocha: ^9.2.0
       preact: ^10.5.15
+      preact-render-to-string: ^5.1.19
       preact-router: ^3.2.1
       qrcode-generator: ^1.4.4
       sass: 1.32.13
@@ -77,10 +79,12 @@ importers:
       date-fns: 2.28.0
       jed: 1.1.1
       preact: 10.6.5
+      preact-render-to-string: 5.1.19_preact@10.6.5
       preact-router: 3.2.1_preact@10.6.5
       qrcode-generator: 1.4.4
     devDependencies:
       '@creativebulma/bulma-tooltip': 1.2.0
+      '@types/mocha': 9.0.0
       bulma: 0.9.3
       bulma-checkbox: 1.2.1
       bulma-radio: 1.2.0
@@ -316,6 +320,7 @@ importers:
   packages/taler-wallet-webextension:
     specifiers:
       '@babel/core': 7.13.16
+      '@babel/plugin-transform-modules-commonjs': ^7.18.2
       '@babel/plugin-transform-react-jsx-source': ^7.12.13
       '@babel/preset-typescript': ^7.13.0
       '@babel/runtime': ^7.17.8
@@ -363,6 +368,7 @@ importers:
       ws: 7.4.5
     devDependencies:
       '@babel/core': 7.13.16
+      '@babel/plugin-transform-modules-commonjs': 7.18.2_@babel+core@7.13.16
       '@babel/plugin-transform-react-jsx-source': 7.14.5_@babel+core@7.13.16
       '@babel/preset-typescript': 7.15.0_@babel+core@7.13.16
       '@babel/runtime': 7.17.8
@@ -461,7 +467,7 @@ packages:
       '@babel/code-frame': 7.16.7
       '@babel/generator': 7.17.0
       '@babel/helper-compilation-targets': 7.16.7_@babel+core@7.16.7
-      '@babel/helper-module-transforms': 7.16.7
+      '@babel/helper-module-transforms': 7.18.0
       '@babel/helpers': 7.16.7
       '@babel/parser': 7.17.0
       '@babel/template': 7.16.7
@@ -518,11 +524,20 @@ packages:
       source-map: 0.5.7
     dev: true
 
+  /@babel/generator/7.18.2:
+    resolution: {integrity: 
sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.18.4
+      '@jridgewell/gen-mapping': 0.3.1
+      jsesc: 2.5.2
+    dev: true
+
   /@babel/helper-annotate-as-pure/7.14.5:
     resolution: {integrity: 
sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-annotate-as-pure/7.16.7:
@@ -537,7 +552,7 @@ packages:
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/helper-explode-assignable-expression': 7.16.7
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-compilation-targets/7.16.7_@babel+core@7.13.16:
@@ -680,7 +695,7 @@ packages:
       '@babel/core': 7.17.2
       '@babel/helper-compilation-targets': 7.16.7_@babel+core@7.17.2
       '@babel/helper-module-imports': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/traverse': 7.17.0
       debug: 4.3.3
       lodash.debounce: 4.0.8
@@ -697,11 +712,16 @@ packages:
       '@babel/types': 7.17.0
     dev: true
 
+  /@babel/helper-environment-visitor/7.18.2:
+    resolution: {integrity: 
sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==}
+    engines: {node: '>=6.9.0'}
+    dev: true
+
   /@babel/helper-explode-assignable-expression/7.16.7:
     resolution: {integrity: 
sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-function-name/7.14.5:
@@ -710,7 +730,7 @@ packages:
     dependencies:
       '@babel/helper-get-function-arity': 7.14.5
       '@babel/template': 7.16.7
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-function-name/7.16.7:
@@ -722,18 +742,26 @@ packages:
       '@babel/types': 7.17.0
     dev: true
 
+  /@babel/helper-function-name/7.17.9:
+    resolution: {integrity: 
sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/template': 7.16.7
+      '@babel/types': 7.18.4
+    dev: true
+
   /@babel/helper-get-function-arity/7.14.5:
     resolution: {integrity: 
sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-get-function-arity/7.16.7:
     resolution: {integrity: 
sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-hoist-variables/7.16.7:
@@ -747,14 +775,14 @@ packages:
     resolution: {integrity: 
sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-member-expression-to-functions/7.16.7:
     resolution: {integrity: 
sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-module-imports/7.16.7:
@@ -780,18 +808,34 @@ packages:
       - supports-color
     dev: true
 
+  /@babel/helper-module-transforms/7.18.0:
+    resolution: {integrity: 
sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-environment-visitor': 7.16.7
+      '@babel/helper-module-imports': 7.16.7
+      '@babel/helper-simple-access': 7.18.2
+      '@babel/helper-split-export-declaration': 7.16.7
+      '@babel/helper-validator-identifier': 7.16.7
+      '@babel/template': 7.16.7
+      '@babel/traverse': 7.18.2
+      '@babel/types': 7.18.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@babel/helper-optimise-call-expression/7.14.5:
     resolution: {integrity: 
sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-optimise-call-expression/7.16.7:
     resolution: {integrity: 
sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-plugin-utils/7.14.5:
@@ -804,13 +848,18 @@ packages:
     engines: {node: '>=6.9.0'}
     dev: true
 
+  /@babel/helper-plugin-utils/7.17.12:
+    resolution: {integrity: 
sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==}
+    engines: {node: '>=6.9.0'}
+    dev: true
+
   /@babel/helper-remap-async-to-generator/7.16.8:
     resolution: {integrity: 
sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/helper-annotate-as-pure': 7.16.7
       '@babel/helper-wrap-function': 7.16.8
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -821,8 +870,8 @@ packages:
     dependencies:
       '@babel/helper-member-expression-to-functions': 7.15.0
       '@babel/helper-optimise-call-expression': 7.14.5
-      '@babel/traverse': 7.17.0
-      '@babel/types': 7.17.0
+      '@babel/traverse': 7.18.2
+      '@babel/types': 7.18.4
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -847,18 +896,25 @@ packages:
       '@babel/types': 7.17.0
     dev: true
 
+  /@babel/helper-simple-access/7.18.2:
+    resolution: {integrity: 
sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.18.4
+    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.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-split-export-declaration/7.14.5:
     resolution: {integrity: 
sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     dev: true
 
   /@babel/helper-split-export-declaration/7.16.7:
@@ -894,8 +950,8 @@ packages:
     dependencies:
       '@babel/helper-function-name': 7.16.7
       '@babel/template': 7.16.7
-      '@babel/traverse': 7.17.0
-      '@babel/types': 7.17.0
+      '@babel/traverse': 7.18.2
+      '@babel/types': 7.18.4
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -906,7 +962,7 @@ packages:
     dependencies:
       '@babel/template': 7.16.7
       '@babel/traverse': 7.17.0
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -947,6 +1003,14 @@ packages:
       '@babel/types': 7.17.0
     dev: true
 
+  /@babel/parser/7.18.4:
+    resolution: {integrity: 
sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+    dependencies:
+      '@babel/types': 7.18.4
+    dev: true
+
   
/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.13.16:
     resolution: {integrity: 
sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==}
     engines: {node: '>=6.9.0'}
@@ -964,7 +1028,7 @@ packages:
       '@babel/core': ^7.0.0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   
/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.13.16:
@@ -986,7 +1050,7 @@ packages:
       '@babel/core': ^7.13.0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/helper-skip-transparent-expression-wrappers': 7.16.0
       '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.2
     dev: true
@@ -1012,7 +1076,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/helper-remap-async-to-generator': 7.16.8
       '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.2
     transitivePeerDependencies:
@@ -1067,7 +1131,7 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-create-class-features-plugin': 7.17.1_@babel+core@7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.2
     transitivePeerDependencies:
       - supports-color
@@ -1107,7 +1171,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.2
     dev: true
 
@@ -1129,7 +1193,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.2
     dev: true
 
@@ -1151,7 +1215,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.2
     dev: true
 
@@ -1173,7 +1237,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-logical-assignment-operators': 
7.10.4_@babel+core@7.17.2
     dev: true
 
@@ -1195,7 +1259,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-nullish-coalescing-operator': 
7.8.3_@babel+core@7.17.2
     dev: true
 
@@ -1217,7 +1281,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.2
     dev: true
 
@@ -1267,7 +1331,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.2
     dev: true
 
@@ -1290,7 +1354,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/helper-skip-transparent-expression-wrappers': 7.16.0
       '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.2
     dev: true
@@ -1316,7 +1380,7 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-create-class-features-plugin': 7.17.1_@babel+core@7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -1345,7 +1409,7 @@ packages:
       '@babel/core': 7.17.2
       '@babel/helper-annotate-as-pure': 7.16.7
       '@babel/helper-create-class-features-plugin': 7.17.1_@babel+core@7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-private-property-in-object': 
7.14.5_@babel+core@7.17.2
     transitivePeerDependencies:
       - supports-color
@@ -1370,7 +1434,7 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.13.16:
@@ -1388,7 +1452,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.13.16:
@@ -1406,7 +1470,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.13.16:
@@ -1426,7 +1490,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-decorators/7.17.0_@babel+core@7.17.2:
@@ -1436,7 +1500,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.13.16:
@@ -1472,7 +1536,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.13.16:
@@ -1490,7 +1554,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.17.2:
@@ -1500,7 +1564,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   
/@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.13.16:
@@ -1518,7 +1582,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.13.16:
@@ -1536,7 +1600,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.13.16:
@@ -1554,7 +1618,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.13.16:
@@ -1572,7 +1636,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.13.16:
@@ -1590,7 +1654,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.13.16:
@@ -1608,7 +1672,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.13.16:
@@ -1628,7 +1692,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.13.16:
@@ -1648,7 +1712,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-typescript/7.14.5_@babel+core@7.13.16:
@@ -1658,7 +1722,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.13.16
-      '@babel/helper-plugin-utils': 7.14.5
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.17.2:
@@ -1668,7 +1732,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.13.16:
@@ -1688,7 +1752,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.13.16:
@@ -1713,7 +1777,7 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-module-imports': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/helper-remap-async-to-generator': 7.16.8
     transitivePeerDependencies:
       - supports-color
@@ -1736,7 +1800,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.13.16:
@@ -1756,7 +1820,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-classes/7.16.7_@babel+core@7.13.16:
@@ -1789,7 +1853,7 @@ packages:
       '@babel/helper-environment-visitor': 7.16.7
       '@babel/helper-function-name': 7.16.7
       '@babel/helper-optimise-call-expression': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/helper-replace-supers': 7.16.7
       '@babel/helper-split-export-declaration': 7.16.7
       globals: 11.12.0
@@ -1814,7 +1878,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-destructuring/7.16.7_@babel+core@7.13.16:
@@ -1834,7 +1898,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.13.16:
@@ -1856,7 +1920,7 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.13.16:
@@ -1876,7 +1940,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.13.16:
@@ -1898,7 +1962,7 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.13.16:
@@ -1918,7 +1982,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.13.16:
@@ -1942,7 +2006,7 @@ packages:
       '@babel/core': 7.17.2
       '@babel/helper-compilation-targets': 7.16.7_@babel+core@7.17.2
       '@babel/helper-function-name': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-literals/7.16.7_@babel+core@7.13.16:
@@ -1962,7 +2026,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   
/@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.13.16:
@@ -1982,7 +2046,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.13.16:
@@ -2006,8 +2070,8 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-module-transforms': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-module-transforms': 7.18.0
+      '@babel/helper-plugin-utils': 7.17.12
       babel-plugin-dynamic-import-node: 2.3.3
     transitivePeerDependencies:
       - supports-color
@@ -2028,16 +2092,31 @@ packages:
       - supports-color
     dev: true
 
-  /@babel/plugin-transform-modules-commonjs/7.16.8_@babel+core@7.17.2:
-    resolution: {integrity: 
sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==}
+  /@babel/plugin-transform-modules-commonjs/7.18.2_@babel+core@7.13.16:
+    resolution: {integrity: 
sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.13.16
+      '@babel/helper-module-transforms': 7.18.0
+      '@babel/helper-plugin-utils': 7.17.12
+      '@babel/helper-simple-access': 7.18.2
+      babel-plugin-dynamic-import-node: 2.3.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-modules-commonjs/7.18.2_@babel+core@7.17.2:
+    resolution: {integrity: 
sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-module-transforms': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
-      '@babel/helper-simple-access': 7.16.7
+      '@babel/helper-module-transforms': 7.18.0
+      '@babel/helper-plugin-utils': 7.17.12
+      '@babel/helper-simple-access': 7.18.2
       babel-plugin-dynamic-import-node: 2.3.3
     transitivePeerDependencies:
       - supports-color
@@ -2067,8 +2146,8 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-hoist-variables': 7.16.7
-      '@babel/helper-module-transforms': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-module-transforms': 7.18.0
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/helper-validator-identifier': 7.16.7
       babel-plugin-dynamic-import-node: 2.3.3
     transitivePeerDependencies:
@@ -2095,8 +2174,8 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-module-transforms': 7.16.7
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-module-transforms': 7.18.0
+      '@babel/helper-plugin-utils': 7.17.12
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -2138,7 +2217,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-object-assign/7.16.7_@babel+core@7.17.2:
@@ -2171,7 +2250,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/helper-replace-supers': 7.16.7
     transitivePeerDependencies:
       - supports-color
@@ -2194,7 +2273,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.13.16:
@@ -2214,7 +2293,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-react-jsx-source/7.14.5_@babel+core@7.13.16:
@@ -2278,7 +2357,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-runtime/7.17.0_@babel+core@7.13.16:
@@ -2315,7 +2394,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-spread/7.16.7_@babel+core@7.13.16:
@@ -2336,7 +2415,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/helper-skip-transparent-expression-wrappers': 7.16.0
     dev: true
 
@@ -2357,7 +2436,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.13.16:
@@ -2377,7 +2456,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.13.16:
@@ -2397,7 +2476,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-typescript/7.15.0_@babel+core@7.13.16:
@@ -2422,7 +2501,7 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-create-class-features-plugin': 7.17.1_@babel+core@7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.17.2
     transitivePeerDependencies:
       - supports-color
@@ -2445,7 +2524,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.13.16:
@@ -2467,7 +2546,7 @@ packages:
     dependencies:
       '@babel/core': 7.17.2
       '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.2
-      '@babel/helper-plugin-utils': 7.16.7
+      '@babel/helper-plugin-utils': 7.17.12
     dev: true
 
   /@babel/preset-env/7.16.11_@babel+core@7.13.16:
@@ -2612,7 +2691,7 @@ packages:
       '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.17.2
       '@babel/plugin-transform-member-expression-literals': 
7.16.7_@babel+core@7.17.2
       '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.17.2
-      '@babel/plugin-transform-modules-commonjs': 7.16.8_@babel+core@7.17.2
+      '@babel/plugin-transform-modules-commonjs': 7.18.2_@babel+core@7.17.2
       '@babel/plugin-transform-modules-systemjs': 7.16.7_@babel+core@7.17.2
       '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.17.2
       '@babel/plugin-transform-named-capturing-groups-regex': 
7.16.8_@babel+core@7.17.2
@@ -2659,7 +2738,7 @@ packages:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.17.2
-      '@babel/helper-plugin-utils': 7.14.5
+      '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-proposal-unicode-property-regex': 
7.16.7_@babel+core@7.17.2
       '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.17.2
       '@babel/types': 7.17.0
@@ -2766,7 +2845,7 @@ packages:
       '@babel/helper-hoist-variables': 7.16.7
       '@babel/helper-split-export-declaration': 7.16.7
       '@babel/parser': 7.17.0
-      '@babel/types': 7.17.0
+      '@babel/types': 7.18.4
       debug: 4.3.3
       globals: 11.12.0
     transitivePeerDependencies:
@@ -2791,6 +2870,24 @@ packages:
       - supports-color
     dev: true
 
+  /@babel/traverse/7.18.2:
+    resolution: {integrity: 
sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/code-frame': 7.16.7
+      '@babel/generator': 7.18.2
+      '@babel/helper-environment-visitor': 7.18.2
+      '@babel/helper-function-name': 7.17.9
+      '@babel/helper-hoist-variables': 7.16.7
+      '@babel/helper-split-export-declaration': 7.16.7
+      '@babel/parser': 7.18.4
+      '@babel/types': 7.18.4
+      debug: 4.3.3
+      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'}
@@ -2815,6 +2912,14 @@ packages:
       to-fast-properties: 2.0.0
     dev: true
 
+  /@babel/types/7.18.4:
+    resolution: {integrity: 
sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-validator-identifier': 7.16.7
+      to-fast-properties: 2.0.0
+    dev: true
+
   /@bcoe/v8-coverage/0.2.3:
     resolution: {integrity: 
sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
     dev: true
@@ -2896,15 +3001,36 @@ packages:
       chalk: 4.1.2
     dev: true
 
+  /@jridgewell/gen-mapping/0.3.1:
+    resolution: {integrity: 
sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      '@jridgewell/set-array': 1.1.1
+      '@jridgewell/sourcemap-codec': 1.4.10
+      '@jridgewell/trace-mapping': 0.3.13
+    dev: true
+
   /@jridgewell/resolve-uri/3.0.4:
     resolution: {integrity: 
sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg==}
     engines: {node: '>=6.0.0'}
     dev: true
 
+  /@jridgewell/set-array/1.1.1:
+    resolution: {integrity: 
sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==}
+    engines: {node: '>=6.0.0'}
+    dev: true
+
   /@jridgewell/sourcemap-codec/1.4.10:
     resolution: {integrity: 
sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg==}
     dev: true
 
+  /@jridgewell/trace-mapping/0.3.13:
+    resolution: {integrity: 
sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==}
+    dependencies:
+      '@jridgewell/resolve-uri': 3.0.4
+      '@jridgewell/sourcemap-codec': 1.4.10
+    dev: true
+
   /@jridgewell/trace-mapping/0.3.4:
     resolution: {integrity: 
sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==}
     dependencies:
@@ -11193,7 +11319,6 @@ packages:
     dependencies:
       preact: 10.6.5
       pretty-format: 3.8.0
-    dev: true
 
   /preact-router/3.2.1_preact@10.6.5:
     resolution: {integrity: 
sha512-KEN2VN1DxUlTwzW5IFkF13YIA2OdQ2OvgJTkQREF+AA2NrHRLaGbB68EjS4IeZOa1shvQ1FvEm3bSLta4sXBhg==}
@@ -11255,8 +11380,7 @@ packages:
     dev: true
 
   /pretty-format/3.8.0:
-    resolution: {integrity: sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U=}
-    dev: true
+    resolution: {integrity: 
sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
 
   /pretty-ms/7.0.1:
     resolution: {integrity: 
sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]