diff options
21 files changed, 657 insertions, 136 deletions
diff --git a/packages/anastasis-webui/clean_and_build.sh b/packages/anastasis-webui/clean_and_build.sh index 300ed8930..2fa3ec777 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 d6b6bf10d..3f4915ffc 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 index 9f41fdeaf..9f41fdeaf 100644 --- a/packages/anastasis-webui/stories.html +++ b/packages/anastasis-webui/html/stories.html diff --git a/packages/anastasis-webui/html/ui-dev.html b/packages/anastasis-webui/html/ui-dev.html new file mode 100644 index 000000000..4cc36268e --- /dev/null +++ b/packages/anastasis-webui/html/ui-dev.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html + lang="en" + class="has-aside-left has-aside-mobile-transition has-navbar-fixed-top has-aside-expanded" +> + <head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width,initial-scale=1" /> + <meta name="mobile-web-app-capable" content="yes" /> + <meta name="apple-mobile-web-app-capable" content="yes" /> + + <link + rel="icon" + 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/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + /> + <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> + <style type="text/css"> + /* <![CDATA[ */ + ANASTASIS_STYLE_CONTENT + /* <![CDATA[ */ + </style> + </head> + + <body> + <div id="container" class="anastasis-container"></div> + <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 index 17c48e904..17c48e904 100644 --- a/packages/anastasis-webui/ui.html +++ b/packages/anastasis-webui/html/ui.html diff --git a/packages/anastasis-webui/package.json b/packages/anastasis-webui/package.json index 95b85585d..7c57160ce 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 000000000..e65cca454 --- /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 feeac274d..d4675f9da 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 43d865b48..534f9136d 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 f9b292d94..0285c87e1 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 a51dfb20f..351d6f37b 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 000000000..1fcc753ee --- /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 ce21071f7..204c48d18 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 000000000..1b42aa4e3 --- /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 000000000..87eef7d54 --- /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 000000000..cf2737416 --- /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 000000000..e7077b0cb --- /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 000000000..b4e0db001 --- /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 2662f8b2d..fb53124ef 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 88baeb261..d9940776c 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 ae0d56255..7e358f620 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==} |