From b794e4ab53b9197cbc2647df6b9fa585b94667c8 Mon Sep 17 00:00:00 2001 From: evantahler Date: Wed, 1 Jun 2022 14:10:26 -0700 Subject: [PATCH 01/20] Display Connection State in Setting page --- .../src/components/StateBlock/StateBlock.tsx | 67 +++++++++++++++++++ .../src/components/StateBlock/index.tsx | 3 + .../domain/connection/ConnectionService.ts | 6 +- .../src/hooks/services/useConnectionHook.tsx | 7 ++ airbyte-webapp/src/locales/en.json | 4 ++ .../components/SettingsView.tsx | 2 + 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 airbyte-webapp/src/components/StateBlock/StateBlock.tsx create mode 100644 airbyte-webapp/src/components/StateBlock/index.tsx diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx new file mode 100644 index 00000000000000..e44fafcd59ecbb --- /dev/null +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -0,0 +1,67 @@ +import React, { useState, useEffect } from "react"; +import { FormattedMessage } from "react-intl"; +import styled from "styled-components"; + +import { H5 } from "components"; +import ContentCard from "components/ContentCard"; + +import { ConnectionStateObject } from "core/request/AirbyteClient"; +import { useGetConnectionState } from "hooks/services/useConnectionHook"; + +type IProps = { + connectionId: string; +}; + +const StateBlockComponent = styled(ContentCard)` + margin-top: 12px; + padding: 19px 20px 20px; + display: flex; + align-items: center; + justify-content: space-between; +`; + +const Text = styled.div` + margin-left: 20px; + font-size: 11px; + line-height: 13px; + color: ${({ theme }) => theme.greyColor40}; + white-space: pre-line; +`; + +const CodeBox = styled.pre` + display: block; + padding: 10px 30px; + margin: 0; + overflow: scroll; +`; + +const StateBlock: React.FC = ({ connectionId }) => { + const [state, setState] = useState(); + const { mutateAsync: getState } = useGetConnectionState(); + + async function loadState() { + const state = await getState(connectionId); + if (state) setState(state.state); + } + + useEffect(() => { + loadState(); + }, []); + + return ( + + +
+ +
+ .
+ . +
+ {state ? formatState(state) : } +
+ ); +}; + +const formatState = (state: ConnectionStateObject) => JSON.stringify(state, null, 2); + +export default StateBlock; diff --git a/airbyte-webapp/src/components/StateBlock/index.tsx b/airbyte-webapp/src/components/StateBlock/index.tsx new file mode 100644 index 00000000000000..85f0e9c2c80b79 --- /dev/null +++ b/airbyte-webapp/src/components/StateBlock/index.tsx @@ -0,0 +1,3 @@ +import StateBlock from "./StateBlock"; + +export default StateBlock; diff --git a/airbyte-webapp/src/core/domain/connection/ConnectionService.ts b/airbyte-webapp/src/core/domain/connection/ConnectionService.ts index 259ed0ad068d25..a4616be27e5697 100644 --- a/airbyte-webapp/src/core/domain/connection/ConnectionService.ts +++ b/airbyte-webapp/src/core/domain/connection/ConnectionService.ts @@ -1,4 +1,4 @@ -import { deleteConnection, resetConnection, syncConnection } from "../../request/AirbyteClient"; +import { deleteConnection, resetConnection, syncConnection, getState } from "../../request/AirbyteClient"; import { AirbyteRequestService } from "../../request/AirbyteRequestService"; export class ConnectionService extends AirbyteRequestService { @@ -13,4 +13,8 @@ export class ConnectionService extends AirbyteRequestService { public delete(connectionId: string) { return deleteConnection({ connectionId }, this.requestOptions); } + + public getState(connectionId: string) { + return getState({ connectionId }, this.requestOptions); + } } diff --git a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx index 33c8b99575e007..e1f69a5029d227 100644 --- a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx +++ b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx @@ -215,9 +215,16 @@ const invalidateConnectionsList = async (queryClient: QueryClient) => { await queryClient.invalidateQueries(connectionsKeys.lists()); }; +const useGetConnectionState = () => { + const service = useConnectionService(); + + return useMutation((connectionId: string) => service.getState(connectionId)); +}; + export { useConnectionList, useGetConnection, + useGetConnectionState, useUpdateConnection, useCreateConnection, useDeleteConnection, diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 4b05031e59f335..5ce80887a4706b 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -399,6 +399,10 @@ "tables.sourceDeleteModalText": "This can not be un-done without a full re-sync. Note that:\n - All connections with this source will be deleted, including their past logs and configurations.\n - No existing data in the destination will be altered", "tables.destinationDeleteModalText": "This can not be un-done. Note that:\n - All connections with this destination will be deleted, including their past logs and configurations.\n - No existing data in the destination will be altered.", "tables.connectionDeleteModalText": "This can not be un-done without a full re-sync. Note that:\n - All past logs and configurations will be deleted\n - Updates of new data will stop\n - No existing data in the destination will be altered", + "tables.State.title": "Connection State", + "tables.State.p1": "The connection's current state", + "tables.State.p2": "Airbyte does not store historic connection state", + "tables.State.stateLoading": "Loading Connection State", "admin.destinations": "Destinations", "admin.sources": "Sources", diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/SettingsView.tsx b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/SettingsView.tsx index 48a9a168ece688..a96707ef51551c 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/SettingsView.tsx +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/SettingsView.tsx @@ -2,6 +2,7 @@ import React from "react"; import styled from "styled-components"; import DeleteBlock from "components/DeleteBlock"; +import StateBlock from "components/StateBlock"; import { useDeleteConnection } from "hooks/services/useConnectionHook"; @@ -22,6 +23,7 @@ const SettingsView: React.FC = ({ connectionId }) => { return ( + ); From ec2c77fe86c32e89696e7c17dbd91a0d2d163181 Mon Sep 17 00:00:00 2001 From: evantahler Date: Wed, 1 Jun 2022 14:33:11 -0700 Subject: [PATCH 02/20] memoize callback --- .../src/components/StateBlock/StateBlock.tsx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index e44fafcd59ecbb..e2271de0f530c3 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useCallback } from "react"; import { FormattedMessage } from "react-intl"; import styled from "styled-components"; @@ -39,14 +39,18 @@ const StateBlock: React.FC = ({ connectionId }) => { const [state, setState] = useState(); const { mutateAsync: getState } = useGetConnectionState(); - async function loadState() { + const loadState = async () => { const state = await getState(connectionId); if (state) setState(state.state); - } + }; - useEffect(() => { + const loadStateMemoized = useCallback(() => { loadState(); - }, []); + }, [connectionId]); + + useEffect(() => { + loadStateMemoized(); + }, [loadStateMemoized]); return ( @@ -54,8 +58,9 @@ const StateBlock: React.FC = ({ connectionId }) => {
- .
- . + . + .
+ . {state ? formatState(state) : }
From 62ceedf5f7c1f6739b65817216cdaf95cd1007eb Mon Sep 17 00:00:00 2001 From: evantahler Date: Wed, 1 Jun 2022 15:22:41 -0700 Subject: [PATCH 03/20] rendering and confirmaton --- airbyte-webapp/package-lock.json | 2148 +++++++++-------- airbyte-webapp/package.json | 1 + .../src/components/StateBlock/StateBlock.tsx | 76 +- .../src/components/StateBlock/prismjs.d.ts | 8 + airbyte-webapp/src/locales/en.json | 4 + 5 files changed, 1156 insertions(+), 1081 deletions(-) create mode 100644 airbyte-webapp/src/components/StateBlock/prismjs.d.ts diff --git a/airbyte-webapp/package-lock.json b/airbyte-webapp/package-lock.json index 5d51262ae94cf2..3010267a8eceb8 100644 --- a/airbyte-webapp/package-lock.json +++ b/airbyte-webapp/package-lock.json @@ -24,6 +24,7 @@ "framer-motion": "^6.3.11", "launchdarkly-js-client-sdk": "^2.22.1", "lodash": "^4.17.21", + "prismjs": "^1.28.0", "query-string": "^6.13.1", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -2569,14 +2570,14 @@ "dev": true }, "node_modules/@firebase/analytics": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.9.tgz", - "integrity": "sha512-h/2L2q4/+mmV9EdvVC3XwFFbKSh8bvaYu4DMJIKnPAuGze6W5ALBLkK2GcVti6Kz1NTMJ3puxTRWE9XxRGZipQ==", - "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/installations": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.10.tgz", + "integrity": "sha512-efZ9jdzTW1/COE5gVdJVdplsltooKPH7M3XpSi/kDyegR1sC05C5NQaiBIYcaTyX2yf1OVcCfsWEcZFhhPTPGw==", + "dependencies": { + "@firebase/component": "0.5.15", + "@firebase/installations": "0.5.10", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2584,14 +2585,14 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.10.tgz", - "integrity": "sha512-7zfB+BBO5RbF7RSHOA4ZPyLvOEEvMOhRbfIjh5ZmizAQY2J6tZB8t+dwQ/q4hqZVGgw4ds4g0JYuRKZKYsWADg==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.11.tgz", + "integrity": "sha512-Jx5iXM3nlMa6utqGWNDtmdIztFhLCqMx2Iw809BbynhTSa3esF4e5RevCRk+5oDDfW11uLHckLpe6MhmINKIkA==", "dependencies": { - "@firebase/analytics": "0.7.9", + "@firebase/analytics": "0.7.10", "@firebase/analytics-types": "0.7.0", - "@firebase/component": "0.5.14", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2614,25 +2615,25 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/app": { - "version": "0.7.25", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.25.tgz", - "integrity": "sha512-OemDA3NZS1oEbAPFlWHeVI8Od26ZHAXUivUWFYIsYrw+YjS7FloltwyHB06Q8LQyPJIBPubGkEuzNTHz32EDCQ==", + "version": "0.7.26", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.26.tgz", + "integrity": "sha512-FmJ4uaUyazmOZZWJO9OviKfnw+lrwMPQbWBMutymSQT8Gx783Ddnhs5IdmfV0NeLrlGy4ZwfP6/+RJyy2wGDXw==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "idb": "7.0.1", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-check": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.8.tgz", - "integrity": "sha512-DgrXnrJT0S5csa5CsvmWWSWqy61T3rOE2iZ/L4Q8+xZsjU2McpUj8g/lU8NDa4qc5mGRZ/Qjozqog1H3pwPgGw==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.9.tgz", + "integrity": "sha512-IxOSpw4cL6fQD2AGLhXHxsdCjzQEYGyRwvS2vtguMxTYhRQ/EWXvej+P42cXf373vDrmAMKrnIUgC4P1yMPLSA==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2640,15 +2641,15 @@ } }, "node_modules/@firebase/app-check-compat": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.8.tgz", - "integrity": "sha512-EAqFa0juE2xc52IGh2nv8E+avTLsZfbO7fkJnhPu07e5FU39pptcsRckTdHU7v1/DuWuigUVFcOD5iic9I8TQw==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.9.tgz", + "integrity": "sha512-DgHCcUR3vC3KrAQccs+cggTjNusF/oxPJmw1397H0jw5vWVu0oTtmIduyKB2GE0KDo0q0bHNPPR8GEVugjeFPg==", "dependencies": { - "@firebase/app-check": "0.5.8", + "@firebase/app-check": "0.5.9", "@firebase/app-check-types": "0.4.0", - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2676,14 +2677,14 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/app-compat": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.26.tgz", - "integrity": "sha512-i5UTq1HZAHuhe7RNjgFSezbow4jVxc2oe3Gndsv+Hdut92f8L0AyssOtdU2iOylLlxbTijewAXXui4FAUzXubw==", - "dependencies": { - "@firebase/app": "0.7.25", - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.27.tgz", + "integrity": "sha512-0A5ENP/KK0Eev94qPuxaclfOE0oA6hyCVQTdi0ox1bPm+VzGGD/jXP6Bzw+IUmy33ChjP/639bm6Myh8AG4PwA==", + "dependencies": { + "@firebase/app": "0.7.26", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" } }, @@ -2703,13 +2704,13 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/auth": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.20.2.tgz", - "integrity": "sha512-anv2dhHXnlHSuXDuXIoCm/w/JJ+SiQ1TAKgNVYlhfq+yvx9Op8CxfTqcfBwfbIZ1gizw4PNLuk82m8KelsKl6Q==", + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.20.3.tgz", + "integrity": "sha512-iElaZvVxxW2WAAmmqwTkdPBdixdI2TpURACwNn0G4XpuxlNeF3hYK1nDla2Oa/r39QGtlb9FChTTBby4Uu/Flw==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "node-fetch": "2.6.7", "selenium-webdriver": "4.1.2", "tslib": "^2.1.0" @@ -2719,14 +2720,14 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.15.tgz", - "integrity": "sha512-Kl8pujKWVBJ+76h4tRsS5xI9Dvk8MVSP6eN82rnEgmCxiUsnVj5Adb/WzvS3p4/l++4mRSAEnlIVxZ2Pyaeirg==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.16.tgz", + "integrity": "sha512-wwyuBwtCXwygr1Vyr7M4v8iD1eGRUEGM0XNGG2BQkFnlF7rkwpGsmgiiSkaA8kFYibNSTx2TkdBNfvJXzYPL6A==", "dependencies": { - "@firebase/auth": "0.20.2", + "@firebase/auth": "0.20.3", "@firebase/auth-types": "0.11.0", - "@firebase/component": "0.5.14", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/util": "1.6.1", "node-fetch": "2.6.7", "selenium-webdriver": "4.1.2", "tslib": "^2.1.0" @@ -2764,11 +2765,11 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/component": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.14.tgz", - "integrity": "sha512-ct2p1MTMV5P/nGIlkC3XjAVwHwjsIZaeo8JVyDAkJCNTROu5mYX3FBK16hjIUIIVJDpgnnzFh9nP74gciL4WrA==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.15.tgz", + "integrity": "sha512-VRnZxmvtJmXupTPg37LxM0zdyMN54EXkmsFD4x5Bm4eZUay9VGnhfiGnE3m9Af/2hnURA2idIBN/23L6982iPQ==", "dependencies": { - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" } }, @@ -2778,32 +2779,29 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/database": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.0.tgz", - "integrity": "sha512-lskyf5+FDnytrPJt3MLjkTDxYxutKtaYL7j/Z/De2DSVZJSR+weE/D/r47iK/+tyzMaew2v3joSgZOHvVlWshw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.1.tgz", + "integrity": "sha512-k6PeAzf9x9DG3AJtA6SkJsTD1ivOWvrV71VPOYabBch05QDB0HOYs1EauGhzqa6GOcYz+ncb4pNEkgFDvcnEfQ==", "dependencies": { "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-compat": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.0.tgz", - "integrity": "sha512-t2HVI1RrMz8cbmhyo2LQGSInhRN9DZTDKXm55iFQgSihcnCbfoMAFyRv/FFa1Y+iERgcDI8LaOMS/LTjpYVz4g==", - "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/database": "0.13.0", - "@firebase/database-types": "0.9.8", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.1.tgz", + "integrity": "sha512-xpru5ZtO7um2FmfIw4gCAbkWpyOEwxzamU/5phuwze3ZihMdh+UrDrwrhvfqzQ/KIKXsK76Uyx5F3NCAS8+5eg==", + "dependencies": { + "@firebase/component": "0.5.15", + "@firebase/database": "0.13.1", + "@firebase/database-types": "0.9.9", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/database-compat/node_modules/tslib": { @@ -2812,12 +2810,12 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/database-types": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.8.tgz", - "integrity": "sha512-bI7bwF5xc0nPi6Oa3JVt6JJdfhVAnEpCwgfTNILR4lYDPtxdxlRXhZzQ5lfqlCj7PR+drKh9RvMu6C24N1q04w==", + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.9.tgz", + "integrity": "sha512-Zp86fHzQFZKYVM7yDWVAgVTeOJ39g2wT0ijeiN0jpHAHceeoV013q3jPIIGuooV2HMwWOTIBZGqh+DxrHMFyUw==", "dependencies": { "@firebase/app-types": "0.7.0", - "@firebase/util": "1.6.0" + "@firebase/util": "1.6.1" } }, "node_modules/@firebase/database/node_modules/faye-websocket": { @@ -2837,14 +2835,14 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/firestore": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.4.9.tgz", - "integrity": "sha512-EiSG/uYDyUmrrHlwrsP9WqWI8ChD0hUW/+0MS3NDh8Cfo1Dfb/sM3YWKzgnIZ3wKTxn/nbe9oidHZp5cqI9G+w==", - "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", - "@firebase/webchannel-wrapper": "0.6.1", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.4.10.tgz", + "integrity": "sha512-QUW9B7U8G0zbontuEPCJaoD320AZPOM4skV+Jd+WJIUUrmg/pLCW68Tt9ycg6zQ+1WdJtzaOU35NPJS7VIP8Ug==", + "dependencies": { + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", + "@firebase/webchannel-wrapper": "0.6.2", "@grpc/grpc-js": "^1.3.2", "@grpc/proto-loader": "^0.6.0", "node-fetch": "2.6.7", @@ -2858,14 +2856,14 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.18.tgz", - "integrity": "sha512-D6VXudL/B2jlZ6MGpsDPHHm/DSpfKuUOnEb5wwH89Sw0nW5snSMNG8QfYTQYKUxrX35ma+nWUnaa18LlVTUMXQ==", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.19.tgz", + "integrity": "sha512-fE3anYxNvX50zILPdGZaJBFcK3NPOHzZR7lLupFBsmd0YFtFT4E89p0QQ3A/oZK9/74jNuvjZoJ8hamknPkZHQ==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/firestore": "3.4.9", + "@firebase/component": "0.5.15", + "@firebase/firestore": "3.4.10", "@firebase/firestore-types": "2.5.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2892,15 +2890,15 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/functions": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.8.1.tgz", - "integrity": "sha512-UF5187TPn1Q1sFmAUU1oZdKub1t0Z6MAjcskGS6CV4OwAkILZQ9v38LIbo3wnA62R5hr3IFpdEJxKkqHojMwSg==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.8.2.tgz", + "integrity": "sha512-w2ng6vodOYj7Xo/J3h0SN6NfpRzId00DOKZDvGylH+LoQPFBshHJmv2mpM5ljEntxWvtv3aGrjD6YvgKr9JUJA==", "dependencies": { "@firebase/app-check-interop-types": "0.1.0", "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.14", + "@firebase/component": "0.5.15", "@firebase/messaging-interop-types": "0.1.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "node-fetch": "2.6.7", "tslib": "^2.1.0" }, @@ -2909,14 +2907,14 @@ } }, "node_modules/@firebase/functions-compat": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.2.1.tgz", - "integrity": "sha512-1epI+TGb3CxpQrnoSJnKMUqBLn9b6KA1Rro6ISmZIEkaDEi8p8q3UI917XP+OewiPG71xvpySiEIIxWyktcl+A==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.2.2.tgz", + "integrity": "sha512-CeAoQDVrrqjc6q0prgyO3mEDDQM84vSH09sNRRMxd9kTjZtKZD4DXf+BKfULSvMAK9mgmL70LBz8RsrcXs6YXg==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/functions": "0.8.1", + "@firebase/component": "0.5.15", + "@firebase/functions": "0.8.2", "@firebase/functions-types": "0.5.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2939,12 +2937,12 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/installations": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.9.tgz", - "integrity": "sha512-0XvF9ig8Zj7MWP4Aq5/Wcyjq9f/cDtD6DKFJhp3BT1AjmACdmq7WD72xok8UBhkOiqymIiGd5eQf7rX225D2Sw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.10.tgz", + "integrity": "sha512-lTnYmtGPXwLqjiqvS4KH/V9a3vtZYWBU3Lsx+iOndFkzEyEANQ4qwUgZsP94qWRFd1WumcgDqhFmoVeYkDQCew==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/util": "1.6.1", "idb": "7.0.1", "tslib": "^2.1.0" }, @@ -2958,9 +2956,9 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/logger": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz", - "integrity": "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.3.tgz", + "integrity": "sha512-POTJl07jOKTOevLXrTvJD/VZ0M6PnJXflbAh5J9VGkmtXPXNG6MdZ9fmRgqYhXKTaDId6AQenQ262uwgpdtO0Q==", "dependencies": { "tslib": "^2.1.0" } @@ -2971,14 +2969,14 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/messaging": { - "version": "0.9.13", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.13.tgz", - "integrity": "sha512-wR/SGYGG/bmz1gRqm6/eGI6zRg/X3qNP0BCk0Oa6xVDKK04UCE9zNRgQYgCSKNP+zuLfDhpHbXvvXQp9/vBYVA==", + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.14.tgz", + "integrity": "sha512-TrSDdZT/wI94m+kay4ibYDUsBiSkijU71zWhSXPJRGSUNuq8EP0ecs2eu01Kipb6ghl5YUiFFL/uY5Y6WK/I5A==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/installations": "0.5.9", + "@firebase/component": "0.5.15", + "@firebase/installations": "0.5.10", "@firebase/messaging-interop-types": "0.1.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "idb": "7.0.1", "tslib": "^2.1.0" }, @@ -2987,13 +2985,13 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.13.tgz", - "integrity": "sha512-kGuzjpl+pcTRmEgGDjyOKQnxxQgC7wIJIIHhLMIpfxHHL5+ysN1Tjq0Ztr1t/gcdHKErtnD/n9To5eoGZHqpzA==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.14.tgz", + "integrity": "sha512-XNF5+TxhbFa5nAmkf/PbbNFfmiTcyBfjIl322Me6ZYK4leC8+O9beR7w0wWei8+GhUSIHn3D69ZZRewUUkXukA==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/messaging": "0.9.13", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/messaging": "0.9.14", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3016,14 +3014,14 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/performance": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.9.tgz", - "integrity": "sha512-cA1pea1hkIZt0FG0a42tjKQNBhdY7q4apqHML92vBCS9QOOR0SHBui44IGQJRfRBGiVICHW03Q+ikSZv08g+jw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.10.tgz", + "integrity": "sha512-rX+OsVMc6IIkrZqFmIjvEfRuRJ84ftPJDDpnqZ134pqTPr3MQgRzU/gPgLio8EdUN5YCthWyA8nB8NrEzBysSA==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/installations": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/installations": "0.5.10", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3031,15 +3029,15 @@ } }, "node_modules/@firebase/performance-compat": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.9.tgz", - "integrity": "sha512-EBX4u/uK76ikJSyoWZ2cEMj63G01w1DA68KDpSypSMhKPJE2eiCtWABRTSXhcaisq/FDwZzl4XhNjDyfzArwhA==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.10.tgz", + "integrity": "sha512-WhY2pjpXHiyRfnk9t3/BKGK/C0u4pC61mEYh8t8MLayz8KwuiavJj1wuCN2nG2R0y8CXZAsifFLQs1h0K3XzDA==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/performance": "0.5.9", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/performance": "0.5.10", "@firebase/performance-types": "0.1.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3087,14 +3085,14 @@ "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, "node_modules/@firebase/remote-config": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.8.tgz", - "integrity": "sha512-z5HYrjrgzkR25nlvQqiPowDGatlEJirA5sN1B6rOy+KYMLsb6IXLVOdKjj/Tg/uHAErwd0DblGxwBUZKTCuo1g==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.9.tgz", + "integrity": "sha512-SQ7tArNyI3sPlbmyAB3X2rS8lHcVlPWIQPRLCmgpKjPKM6Jsv7onCUK+M23DW95iEjK4vEVU5QkxUP3fUXWkxg==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/installations": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/installations": "0.5.10", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3102,15 +3100,15 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.9.tgz", - "integrity": "sha512-ud4yINy8cegE82KoBDXS4fOp6qwy0+7zl0k587kMXHSWHbWVRZ/uKMQGJQc7kG0EQp0tZhM20CxVwtcCGsABBA==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.10.tgz", + "integrity": "sha512-FSZg9JqgnYIDV78J74W6JUANGjrzCgTRKHioBifONo3e2CdEqQKrvIuGCXEE9+9vYyuqNEtmv5DUIPC4n6XYCQ==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/remote-config": "0.3.8", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/remote-config": "0.3.9", "@firebase/remote-config-types": "0.2.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3133,12 +3131,12 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/storage": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.6.tgz", - "integrity": "sha512-q8/s3qFbFl+AlKbyEtGA7FRVhcMu3NKPqHueBTn5XSI0B3bfxptBcDJMb9txs69ppve6P3jrK1//TEWpjTGJUg==", + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.7.tgz", + "integrity": "sha512-0unWzgx5bceyO3SX/ilHaxwwHidN5sXZGakFLjAn8cbpjVpmybcKaLOduBxlMXeDCdUFfO8FcvEajFkV+0t2hA==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/util": "1.6.1", "node-fetch": "2.6.7", "tslib": "^2.1.0" }, @@ -3147,14 +3145,14 @@ } }, "node_modules/@firebase/storage-compat": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.14.tgz", - "integrity": "sha512-/Fey1n+ryIeAEyd/qXPXh32ReFZUhzE5W0z/+LDA+3yyMGw/a6wCzQqe7wBiGiCRhjd+5XiV++jkCXTflun3Dg==", + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.15.tgz", + "integrity": "sha512-XjqAYIc8oJv6OAeeLdCUC3KF0wXAzRoBGktRhPMc9umSxVE7Dnr960kF6qtdAbLFGi/uhj478AdpKSQgZ75rQA==", "dependencies": { - "@firebase/component": "0.5.14", - "@firebase/storage": "0.9.6", + "@firebase/component": "0.5.15", + "@firebase/storage": "0.9.7", "@firebase/storage-types": "0.6.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3181,9 +3179,9 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/util": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.6.0.tgz", - "integrity": "sha512-6+hhqb4Zzjoo12xofTDHPkgW3FnN4ydBsjd5X2KuQI268DR3W3Ld64W/gkKPZrKRgUxeNeb+pykfP3qRe7q+vA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.6.1.tgz", + "integrity": "sha512-+eDE6uG5GgvXYHbAzfP1mpJUX1VDBD+A8CjBeBoNAKAVAApMSDxDODqRcOq7NW7kFJXSUkMzDJWhnUIifX2R8w==", "dependencies": { "tslib": "^2.1.0" } @@ -3194,9 +3192,9 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@firebase/webchannel-wrapper": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz", - "integrity": "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ==" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.2.tgz", + "integrity": "sha512-zThUKcqIU6utWzM93uEvhlh8qj8A5LMPFJPvk/ODb+8GSSif19xM2Lw1M2ijyBy8+6skSkQBbavPzOU5Oh/8tQ==" }, "node_modules/@formatjs/ecma402-abstract": { "version": "1.11.4", @@ -6571,18 +6569,18 @@ "dev": true }, "node_modules/@storybook/addon-actions": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.7.tgz", - "integrity": "sha512-gTkPr2FYX+vySZKEg5Wq7uHPkVUq3hJ7ZKvGls+/xjgaTwfu3iIly53FEFUl8A6kMQ+4gtTC+YRr3cSJgXMbAg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.8.tgz", + "integrity": "sha512-9ciR1iWBTzQNBDlq0iQs9+TV7gng+FbQxW5mHNxNvT9SxY1dt02wCPHZeVE/5la61wBXZs/zpEepZA93VzVBDw==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -6614,18 +6612,18 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.7.tgz", - "integrity": "sha512-ryisDpxbIEZbYJkQWU5xvsj940jhWrWizedFsY9g/qBIBi33UrW/H1hKZQtmg0bzuNTgYcBjRy50ikJgH/eKAQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.8.tgz", + "integrity": "sha512-pvlP5ZVVfd2sWzgCqG/f6RJX/h9648znYbzaLQ4Z6whQIFobP3H3/cj9k/RTy3uXg5vC0IWDHSEaCXgin2sW1Q==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -6651,20 +6649,20 @@ } }, "node_modules/@storybook/addon-controls": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.7.tgz", - "integrity": "sha512-1JGphHk1gcLLpkft/D5BkygXwelSdWQqvXnfFc62BVqvzxv8hCF4zuUosKLWMlB/nzVbd6W4oEDV/Mqmt6h/7w==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.8.tgz", + "integrity": "sha512-fB6p5DgVHUnJKUzOlT2mtvaSCincnO+vuYLyf++f+l4BlYK1Es9HNl/puaRoMgdW+LoGJjXPTIMcMByeHVIt6Q==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-common": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-common": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/node-logger": "6.5.7", - "@storybook/store": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/node-logger": "6.5.8", + "@storybook/store": "6.5.8", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" @@ -6687,29 +6685,29 @@ } }, "node_modules/@storybook/addon-docs": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.7.tgz", - "integrity": "sha512-RghRpimJOJl9c/H6qvCCD0zHLETBIVWXsdYJF8GiY6iTKd+tgQYizuuoBT4f3PAMEMHVhmvWSjkkFLxKxzQLjQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.8.tgz", + "integrity": "sha512-pAvWwh5YCrsW9nHCrd5BpFigvqn92JisX0aEnwAqKC9B1AW1LxhdPn1o9CQCeszQGaq163RA6AzkCejvAqhtUQ==", "dev": true, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.12.12", "@babel/preset-env": "^7.12.11", "@jest/transform": "^26.6.2", "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/docs-tools": "6.5.7", + "@storybook/docs-tools": "6.5.8", "@storybook/mdx1-csf": "^0.0.1", - "@storybook/node-logger": "6.5.7", - "@storybook/postinstall": "6.5.7", - "@storybook/preview-web": "6.5.7", - "@storybook/source-loader": "6.5.7", - "@storybook/store": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/node-logger": "6.5.8", + "@storybook/postinstall": "6.5.8", + "@storybook/preview-web": "6.5.8", + "@storybook/source-loader": "6.5.8", + "@storybook/store": "6.5.8", + "@storybook/theming": "6.5.8", "babel-loader": "^8.0.0", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", @@ -6743,23 +6741,23 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.7.tgz", - "integrity": "sha512-JZ80W9PgZOEUp2SjhBYyYHxQduxSIe4n9Wdoy8XDtV28152jDNms6UPjFeEVb+a9rVybYOwWnOnEhBWF6ZfJ/g==", - "dev": true, - "dependencies": { - "@storybook/addon-actions": "6.5.7", - "@storybook/addon-backgrounds": "6.5.7", - "@storybook/addon-controls": "6.5.7", - "@storybook/addon-docs": "6.5.7", - "@storybook/addon-measure": "6.5.7", - "@storybook/addon-outline": "6.5.7", - "@storybook/addon-toolbars": "6.5.7", - "@storybook/addon-viewport": "6.5.7", - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/node-logger": "6.5.7", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.8.tgz", + "integrity": "sha512-K/Aw/GLugCz5/S3c2tz5lnfC8aN6dSoQQDr8xaMDcBlT9h/xZ1l4jQQnx/mvY/qEvXtexBF41DE6ROWGKSZeSg==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "6.5.8", + "@storybook/addon-backgrounds": "6.5.8", + "@storybook/addon-controls": "6.5.8", + "@storybook/addon-docs": "6.5.8", + "@storybook/addon-measure": "6.5.8", + "@storybook/addon-outline": "6.5.8", + "@storybook/addon-toolbars": "6.5.8", + "@storybook/addon-viewport": "6.5.8", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/node-logger": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0" @@ -6826,16 +6824,16 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.7.tgz", - "integrity": "sha512-NMth6CErySKQ9WnfzMZ4nelHa2bBzZ60ZgsDq5s5dKHhJzZPm2nclmGAGE+VhqI/USe8b1fnjKFeHH485T8J2g==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.8.tgz", + "integrity": "sha512-zpNAt1XwBLnQ3OjCfj63J7vC2WCTyAjvbGVAsUkpQb21vr/e3sPFQZPKGwio85SYjIX7AJ+Oi28mbEwWzS8wFA==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "global": "^4.4.0" @@ -6858,16 +6856,16 @@ } }, "node_modules/@storybook/addon-outline": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.7.tgz", - "integrity": "sha512-qTu19FnZz+rjY7SxPOgiQkuAxHRNRhUYgvUwI+ep0ZQcBddsRgniQjzXtErlUMeVoMZ63mDuOaJp67ltkriAOQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.8.tgz", + "integrity": "sha512-/bEjYTVJNM5QEiguS5nVQlerl5NhgOod1zLExnkchc8+FTJC58Vy7CRfzr2iaIMuf1QRPqBwSIy6ZqLJOdUfnQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "global": "^4.4.0", @@ -6892,16 +6890,16 @@ } }, "node_modules/@storybook/addon-toolbars": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.7.tgz", - "integrity": "sha512-+MUG5t4isQNf+q7BpEsGwuYAvYgs9XTdzzdvL/9jedQ7udJsWmG1q9a6m9+iQGPr/WK+88F2kgSOknpib3J21w==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.8.tgz", + "integrity": "sha512-16eRbbtn4/cH1xU8JlPZRdShwUwSsPcqpyH1JNl+rgYQ6SaSNq3aO/jDFeQe93guSD0YPRWHz8dKtn6OxVeozQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" }, @@ -6923,17 +6921,17 @@ } }, "node_modules/@storybook/addon-viewport": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.7.tgz", - "integrity": "sha512-8VmSTGKY3+9kZ09THC7546OaFbjLu5kEAGU5ZFSZaNlsJwRg7bC3bScKbnyX5EhihgZ3W8oJt/eMAIqXKHxA8g==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.8.tgz", + "integrity": "sha512-MTpZWkBWNPH55iNHK4tBNKTdew5xKfoNvOj0pZn1rYDHlylMTlq7aoccwRjjK2jZeHHNnb1rm6ZkQDjmYu0Tcw==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -6958,18 +6956,18 @@ } }, "node_modules/@storybook/addons": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.7.tgz", - "integrity": "sha512-tUZ2c1uegUcwY31ztNQZGU/HUwAEEGIR8fEOvvO8S0TNQGoo6cwFtZmWBh3mTSRGcmzK2SNBjFHZua5Ee9TefA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.8.tgz", + "integrity": "sha512-L3LmbsYP9tDHHvpr/yv8YuEkzym7SXp/jZ0km31tpG3EuZmgGu7MXPrZ2ymEw4PkAhQzztgRr23VTfKobGUojA==", "dev": true, "dependencies": { - "@storybook/api": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/api": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/router": "6.5.8", + "@storybook/theming": "6.5.8", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -6985,18 +6983,18 @@ } }, "node_modules/@storybook/api": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.7.tgz", - "integrity": "sha512-QCNypz4X+lYuFW7EzvRPXMf8uS3gfSIV8sqXtEe5XoMb0HQXhy6AGU7/4iAeuUimtETqLTxq+kOxaSg4uPowxg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.8.tgz", + "integrity": "sha512-/MueV+wLCvy9gFA3ih4g7QYjDmn14i+D2ydonfaEC7R+agFGXxXwJGPKkz3yBNrRpNkBwcbY9mAmv8lE2AqgqQ==", "dev": true, "dependencies": { - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.7", + "@storybook/router": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -7018,28 +7016,28 @@ } }, "node_modules/@storybook/builder-webpack4": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.7.tgz", - "integrity": "sha512-8OB3mZ2L6kQBiAXlkhna/MHREXIPtqXi2AJLT3+bTzBlqkusH+PwMZxWHbcPl1vZrlNQBC40Elx9tdynGkVQ6g==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.8.tgz", + "integrity": "sha512-4/CVp/AlOxCeWZ/DF1TVS/TuzHao4l9KCq7DhL+utFEVl9c/dpgoZXc0Gy2FfHa2RXHKckrH/VUfV2KQk4TNSw==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/core-events": "6.5.7", - "@storybook/node-logger": "6.5.7", - "@storybook/preview-web": "6.5.7", - "@storybook/router": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/core-events": "6.5.8", + "@storybook/node-logger": "6.5.8", + "@storybook/preview-web": "6.5.8", + "@storybook/router": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.7", - "@storybook/theming": "6.5.7", - "@storybook/ui": "6.5.7", + "@storybook/store": "6.5.8", + "@storybook/theming": "6.5.8", + "@storybook/ui": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "@types/webpack": "^4.41.26", "autoprefixer": "^9.8.6", @@ -7719,7 +7717,7 @@ "node_modules/@storybook/builder-webpack4/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -7834,27 +7832,27 @@ "dev": true }, "node_modules/@storybook/builder-webpack5": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.5.7.tgz", - "integrity": "sha512-3mbQ09KBTUsFYxnEtR4vr7W1wodRen3o8fANY5XxvE1sr1TopHVOKpIlePjrpcrXcLKFI/ZWrX3IfK88LCuI9w==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.5.8.tgz", + "integrity": "sha512-bc7LSGzOqTUImejsfjWAHEHwBreoPQKS6pfnWYkjKMvfvWOwlHSAxwOSM5DyS4cvpcpMDG8yBJNz2QcvXFVLxA==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/core-events": "6.5.7", - "@storybook/node-logger": "6.5.7", - "@storybook/preview-web": "6.5.7", - "@storybook/router": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/core-events": "6.5.8", + "@storybook/node-logger": "6.5.8", + "@storybook/preview-web": "6.5.8", + "@storybook/router": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/store": "6.5.8", + "@storybook/theming": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "babel-loader": "^8.0.0", "babel-plugin-named-exports-order": "^0.0.2", @@ -8467,14 +8465,14 @@ "dev": true }, "node_modules/@storybook/channel-postmessage": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.7.tgz", - "integrity": "sha512-X4UPgm4O0503CsSnqAM1ht/6R9ofnoMcqFZxYRu9PSvHlhaFR9V9AU4VjQhakH7alFzRsAhcAV2PFVTAdWhgtA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.8.tgz", + "integrity": "sha512-6IkIKk+UMYKk05vN8gWHvvOV/EZNXpQG/5gesGDALjkCyvRmcktHak1a9tHpoihZ3L7/gDwXOZraCZmuy8vBcQ==", "dev": true, "dependencies": { - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "core-js": "^3.8.2", "global": "^4.4.0", "qs": "^6.10.0", @@ -8486,13 +8484,13 @@ } }, "node_modules/@storybook/channel-websocket": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.7.tgz", - "integrity": "sha512-C+l6t3ZgHzU8gL8GJ8c4GMttJglGJIwq1LtJJKnGzx2kJCD0HRMMqc/qFS2K2EwP99hLwwGIlCpom3UZ1aEanA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.8.tgz", + "integrity": "sha512-lAtvgO0FWsyS3u7uFbsGIYp2aSWJfWU/LOtc3x1K5c84JJAd9fncYkyZMwP1gMbdNgYxJoxe8HXtVtfeNegPuQ==", "dev": true, "dependencies": { - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", "core-js": "^3.8.2", "global": "^4.4.0", "telejson": "^6.0.8" @@ -8503,9 +8501,9 @@ } }, "node_modules/@storybook/channels": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.7.tgz", - "integrity": "sha512-v880fWBpWgiWrDmZesTIstNfMZhrPfgXAtLNcL5Z89NAPahsHskOSszc0BDxKN3gb+ZeTKUqHxY57dQdp+1rhg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.8.tgz", + "integrity": "sha512-fNql1lEIvWlI1NiRtwFMWOOvfW6qxgeSP6xoqiAJ0b+QYegEFG9UxJDuEvVHq++S81FulgQ5U+p+5R9XSV19tQ==", "dev": true, "dependencies": { "core-js": "^3.8.2", @@ -8518,18 +8516,18 @@ } }, "node_modules/@storybook/client-api": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.7.tgz", - "integrity": "sha512-na8NZhB6GnAGp3jRTV9wwue3WGwSZoi5jfxrKSYMPL/s/2n07/soixHggqueBDXuNBrPoJaXbY/nRHmSjLwxtQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.8.tgz", + "integrity": "sha512-mdU+qQ4+T2OUbEnl+3MWRKxEPju/EOIUg66hMgmif8c5u7YFYBFulUMUYLICMjll8Jlu+37+g+qO3K2eEz6CEw==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.7", + "@storybook/store": "6.5.8", "@types/qs": "^6.9.5", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -8554,9 +8552,9 @@ } }, "node_modules/@storybook/client-logger": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.7.tgz", - "integrity": "sha512-ycDy1kXeXRg3djSTXRGMVxc0kvaWw/UhHDs2VGFmOPScsoeWpdbePHXJMFbsqippxuexpsofqTryBwH2b6BPhw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.8.tgz", + "integrity": "sha512-dH6HSaVuOIMHy1+rpsqcD3SJxVZEEbuEtsNpdUGwLJaIuduhUJJpM2xQfUW0siZDyrgwoa+znll+G0YNUbv7sg==", "dev": true, "dependencies": { "core-js": "^3.8.2", @@ -8568,14 +8566,14 @@ } }, "node_modules/@storybook/components": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.7.tgz", - "integrity": "sha512-xSOaOK8q6bXYkmN4LZKucvXU2HRHqKwwTafFDh5yzsCSEB2VQIJlyo4ePVyv/GJgBUX6+WdSA7c5r5ePXK6IYQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.8.tgz", + "integrity": "sha512-YE+LZ1/GXoqertxodsf+L9ehcohbICRAxgE/iNqc7MZfk95SD3XRSUbxhCpGe8QTIZJpzs1tK4LFZ3Fg5w/+Lg==", "dev": true, "dependencies": { - "@storybook/client-logger": "6.5.7", + "@storybook/client-logger": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "@types/react-syntax-highlighter": "11.0.5", "core-js": "^3.8.2", "qs": "^6.10.0", @@ -8593,13 +8591,13 @@ } }, "node_modules/@storybook/core": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.5.7.tgz", - "integrity": "sha512-YSu2qur1E5y9rjVspchtCfupPT3y1XyjBInhwzo8jC3rvm2WY0RS80VQU3dga4QBllO1M+cDmLzmOEPL82+Juw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.5.8.tgz", + "integrity": "sha512-+Fv4n1E5N4Avty9GcRbz4vB2IWH//se2OUU+RTT3vneCOGjyus5bj0Or6GU5wef5UGuvHF78mHg/frhWpguzsw==", "dev": true, "dependencies": { - "@storybook/core-client": "6.5.7", - "@storybook/core-server": "6.5.7" + "@storybook/core-client": "6.5.8", + "@storybook/core-server": "6.5.8" }, "funding": { "type": "opencollective", @@ -8623,21 +8621,21 @@ } }, "node_modules/@storybook/core-client": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.7.tgz", - "integrity": "sha512-GL7m33tpEyornhfnTddbvDuLkA9EMe1zKv9oZGsUYo78cWRTiEibYyHegIi9/ThplRXvpFR/5uHY4Zx5Z5rxJg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.8.tgz", + "integrity": "sha512-8x8qKQ2clvpfDcoWrNBmQ8Xt9z/i32TFIBp4PEZMcbB7eqo517nzfllLiXDipiJgO7BGxKtY5CRHQ9pAU9G27A==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/channel-websocket": "6.5.7", - "@storybook/client-api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/channel-websocket": "6.5.8", + "@storybook/client-api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/preview-web": "6.5.7", - "@storybook/store": "6.5.7", - "@storybook/ui": "6.5.7", + "@storybook/preview-web": "6.5.8", + "@storybook/store": "6.5.8", + "@storybook/ui": "6.5.8", "airbnb-js-shims": "^2.2.1", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", @@ -8665,9 +8663,9 @@ } }, "node_modules/@storybook/core-common": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.7.tgz", - "integrity": "sha512-/b1oQlmhek8tKDu9ky2O1oEk9g2giAPpl192yRz4lIxap5CFJ7RCfgbkq+F3JBXnH2P84BufC0x3dj4jvBhxCw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.8.tgz", + "integrity": "sha512-ELGKLMx1d0oEA2LT+fsmo85X2RNE1EO+It7B1bw//g7jyf1hmZ7t3lXMZUCqt7eml1qy1N72LDkfmmU+H9H6ww==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", @@ -8692,7 +8690,7 @@ "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", "@babel/register": "^7.12.1", - "@storybook/node-logger": "6.5.7", + "@storybook/node-logger": "6.5.8", "@storybook/semver": "^7.3.2", "@types/node": "^14.0.10 || ^16.0.0", "@types/pretty-hrtime": "^1.0.0", @@ -9491,7 +9489,7 @@ "node_modules/@storybook/core-common/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -9580,9 +9578,9 @@ "dev": true }, "node_modules/@storybook/core-events": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.7.tgz", - "integrity": "sha512-epqYy67Ypry5QdCt7FpN57/X9uuS7R2+DLFORZIpL/SJG1dIdN4POQ1icWOhPzHl+eiSgaV7e2oPaUsN+LPhJQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.8.tgz", + "integrity": "sha512-lzG4Lg65WFYvjs2k/E3CP4+eyPexEGrDyRMO9Pbj9H9x+eosYptauEbT/wXF83bmUWZKLWWVUAZX7hDcxBO8cw==", "dev": true, "dependencies": { "core-js": "^3.8.2" @@ -9593,23 +9591,23 @@ } }, "node_modules/@storybook/core-server": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.7.tgz", - "integrity": "sha512-CGwFZ5kmKaCS/+tcrAbqQu4Owq86wXkWRapJB55S8AlUsf3c9gEC8a3+Ed9tZUlmjSH56CnDDfmt7AleToaQ9w==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.8.tgz", + "integrity": "sha512-ti7+MW1xzD9O0JLwgZTwulxhJx5YGPNu+hRpGhJSjKrqGX1h6K6ilmkBSHvyLqpiE+F4mxvqb5Rx3KBIEdEgbw==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-webpack4": "6.5.7", - "@storybook/core-client": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/builder-webpack4": "6.5.8", + "@storybook/core-client": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/csf-tools": "6.5.7", - "@storybook/manager-webpack4": "6.5.7", - "@storybook/node-logger": "6.5.7", + "@storybook/csf-tools": "6.5.8", + "@storybook/manager-webpack4": "6.5.8", + "@storybook/node-logger": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.7", - "@storybook/telemetry": "6.5.7", + "@storybook/store": "6.5.8", + "@storybook/telemetry": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "@types/node-fetch": "^2.5.7", "@types/pretty-hrtime": "^1.0.0", @@ -10317,7 +10315,7 @@ "node_modules/@storybook/core-server/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -10400,9 +10398,9 @@ } }, "node_modules/@storybook/core-server/node_modules/ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -10436,9 +10434,9 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.7.tgz", - "integrity": "sha512-/vBaknzD8c7H/Zsz0gwhmlNlMwe5slZwXadi6rAQXDkKLzaR1kmz4cQFs8yDR1wWpXaGjNvQxOUAGYjFoGQxzA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.8.tgz", + "integrity": "sha512-4VrjIMxKcp29OFSMDub52aQOMP4EvtZ5eWZkPeORRNQoJsnQaxhF9GGf71QdSaAQZhMoxdvmpA47ehrFk8Rnfw==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", @@ -10506,14 +10504,14 @@ } }, "node_modules/@storybook/docs-tools": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.7.tgz", - "integrity": "sha512-Aw9uUsqeuw0Z9fpiwxrstMNjNGB9s1Tm57SpMF8ibjLYBYFf5Apz5CwDX7bm6YFtCweaawx4MeQta8qnQMWCFw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.8.tgz", + "integrity": "sha512-CWMW+3LSstvQmHKV5ggPR1beQZTpwCXEhfysZ9u4Yp/4fcoDIuQ7DTOK5uNFynGCGl1FG3lATriEOhEZ3bZCvQ==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.7", + "@storybook/store": "6.5.8", "core-js": "^3.8.2", "doctrine": "^3.0.0", "lodash": "^4.17.21", @@ -10525,20 +10523,20 @@ } }, "node_modules/@storybook/manager-webpack4": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.7.tgz", - "integrity": "sha512-RmGsr/6PNsafaSm8aTD7e2VXSKT8BQ6Hkg6TAArLoS2TpIUvrNuM2hEqOHzm2POcApC+OE/HN1H0GiXBkH533Q==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.8.tgz", + "integrity": "sha512-qW5/L3cJHvtNi5ylDxObALZWaAHMsWQlPP8GRxm95NHpff4CfRo/qs7puY9ZeLmJSic0KchoHEH/8AScflLOgA==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.5.7", - "@storybook/core-client": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/node-logger": "6.5.7", - "@storybook/theming": "6.5.7", - "@storybook/ui": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/core-client": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/node-logger": "6.5.8", + "@storybook/theming": "6.5.8", + "@storybook/ui": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "@types/webpack": "^4.41.26", "babel-loader": "^8.0.0", @@ -11301,7 +11299,7 @@ "node_modules/@storybook/manager-webpack4/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -11413,20 +11411,20 @@ "dev": true }, "node_modules/@storybook/manager-webpack5": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.5.7.tgz", - "integrity": "sha512-4TZKe71noCRui8sUxSuSqO6zMnCxCLn7dE1dOlCr/UvyZbCaGWACO5olUDQrT+n1glZL8i9L998JGQroksucNw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.5.8.tgz", + "integrity": "sha512-foW/ZvTqGZAl4TfcfGKdS3RlaBDDAgEjUCbCaVShlZRshZ8tzWBVu3JQFqbPVGslH89T5qp9DUYoN/SJqTUpcg==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.5.7", - "@storybook/core-client": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/node-logger": "6.5.7", - "@storybook/theming": "6.5.7", - "@storybook/ui": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/core-client": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/node-logger": "6.5.8", + "@storybook/theming": "6.5.8", + "@storybook/ui": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "babel-loader": "^8.0.0", "case-sensitive-paths-webpack-plugin": "^2.3.0", @@ -12258,9 +12256,9 @@ } }, "node_modules/@storybook/node-logger": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.7.tgz", - "integrity": "sha512-OrHu5p2E5i7P2v2hQAOtZw6Od1e2nrP6L7w5SxUPgccUnKUD9dRX5Y8qbAcPZO3XCkMLjpjAbC1xBXG0eFkn9g==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.8.tgz", + "integrity": "sha512-BHdkSipgjnfsh4FRYbV2R0npM5gVx9JLRsDQ0KiTolRpN4SU98kT/6885zb9jZg6I0EY+UG9Qdr3fvL9VLpY1g==", "dev": true, "dependencies": { "@types/npmlog": "^4.1.2", @@ -12345,9 +12343,9 @@ } }, "node_modules/@storybook/postinstall": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.7.tgz", - "integrity": "sha512-902JjgB2o+NiiLCPV0b4GHX9SbnY1OkvfvmkqpD3UqWh8djpkSQwvli9npM1J2NEu4BxCqbifYJI7V4JmZbdsw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.8.tgz", + "integrity": "sha512-Z6zQnBOaMj+gHtF1XPMpwTIxYRCmh6eNirrJLrkPk5c+fKXtw6+vNCbmPvsyTGxGEHnyn/tYwe1fvwJTHDctUw==", "dev": true, "dependencies": { "core-js": "^3.8.2" @@ -12580,17 +12578,17 @@ } }, "node_modules/@storybook/preview-web": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.7.tgz", - "integrity": "sha512-EH8gdl334D8EDVL1VJjRURcUou5Sv6BwgismL4E6wjSFmWxL9egxYDnGJJEh3mjIkAtGb0zpksYn/VNWPA8c8A==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.8.tgz", + "integrity": "sha512-jEEAgvTVZfFA0B20mRJfLW6dPA5mG5PxUJtjMx6wH4Yw4+i3Sld/U63hTRt7ktpKdrcu4lX9E+PuaRLPq7S2kg==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.7", + "@storybook/store": "6.5.8", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", "global": "^4.4.0", @@ -12612,24 +12610,24 @@ } }, "node_modules/@storybook/react": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.5.7.tgz", - "integrity": "sha512-jMY1vk1WL1otEODl5BxD1kSh5Eqg+SvZW5CJ7sS6q53i3teOhaGhugvuSTuV9lnBzLOZu8atIdFL0ewdOkpwsg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.5.8.tgz", + "integrity": "sha512-LdObfhhPb9gAFBtRNb3awYJe1qMiYeda1ppkj0ZvccbV04YrmbW5bzYvfOCvU6D34ugbQJhJyWuvraO/0EJK6w==", "dev": true, "dependencies": { "@babel/preset-flow": "^7.12.1", "@babel/preset-react": "^7.12.10", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@storybook/addons": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core": "6.5.7", - "@storybook/core-common": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core": "6.5.8", + "@storybook/core-common": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/docs-tools": "6.5.7", - "@storybook/node-logger": "6.5.7", + "@storybook/docs-tools": "6.5.8", + "@storybook/node-logger": "6.5.8", "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.7", + "@storybook/store": "6.5.8", "@types/estree": "^0.0.51", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", @@ -12978,12 +12976,12 @@ } }, "node_modules/@storybook/router": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.7.tgz", - "integrity": "sha512-edWEdAb8O0rSgdXoBZDDuNlQg2cOmC/nJ6gXj9zBotzmXqsbxWyjKGooG1dU6dnKshUqE1RmWF7/N1WMluLf0A==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.8.tgz", + "integrity": "sha512-tseNJpZ2ZzVYowjekUMpGJVVRMrwOkttieD9mRbHrhh+2n7b+SoMKnuLi3ow0xeOyPL8ZDng2FgRjQzQHXA5Sw==", "dev": true, "dependencies": { - "@storybook/client-logger": "6.5.7", + "@storybook/client-logger": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" }, @@ -13013,13 +13011,13 @@ } }, "node_modules/@storybook/source-loader": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.7.tgz", - "integrity": "sha512-nj24TSGdF9J1gD5Fj9Z2hPRAQwqBJoBKD/fmTSFZop0qaJOOyeuxZR5022dQh8UWWoBa3WOQADMTNi5RqQZkiA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.8.tgz", + "integrity": "sha512-3bVxXKE2o6lS4WGga/S7WwgITxPQ96qsY+pQ1I7A+e4/cKSmZxlVWM9qfMW2ScmHTVoZE0Ujsmn6DWftxzCyrQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/client-logger": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/client-logger": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "estraverse": "^5.2.0", @@ -13086,14 +13084,14 @@ } }, "node_modules/@storybook/store": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.5.7.tgz", - "integrity": "sha512-d64towcdylC6TXNL2oJklCpwN3XcUGgZzQ9zgoV8BUlOlsj9tNq8eo95uzTURnLg1Q5uHoDDKWuXrrKj03HHxw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.5.8.tgz", + "integrity": "sha512-5rhGjN/O0oLebRv947B0vgapq48qBBBYYOgq4krRUYU2ecS6LUgtAHR/kTa324o9aBO8cnIXHH78jZcSvMiJlQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", @@ -13117,13 +13115,13 @@ } }, "node_modules/@storybook/telemetry": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.7.tgz", - "integrity": "sha512-RHrjAConMqGIsu1TgNXztWtWOXTvvCHDWyGoLagCgZYgjGJ4sukp+ZtrbkayNDkkWWD0lpMzsdDEYCJuru/Sig==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.8.tgz", + "integrity": "sha512-QnAhYF8CwcjC1bT2PK7Zqvo6E42TPl0MY6JS+H6qSZU/BmYeS0It8ZURNfPsA/OzVVLHUkQs96CisKh3N0WWaw==", "dev": true, "dependencies": { - "@storybook/client-logger": "6.5.7", - "@storybook/core-common": "6.5.7", + "@storybook/client-logger": "6.5.8", + "@storybook/core-common": "6.5.8", "chalk": "^4.1.0", "core-js": "^3.8.2", "detect-package-manager": "^2.0.1", @@ -13247,12 +13245,12 @@ } }, "node_modules/@storybook/theming": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.7.tgz", - "integrity": "sha512-6zp1V84DSBcS8BtFOCJlF2/nIonjQmr+dILPxaM3lCm/X003i2jAQrBKTfPlmzCeDn07PBhzHaRJ3wJskfmeNw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.8.tgz", + "integrity": "sha512-1VaKHqj38Ls1bJwDpg3+aEOlvVib/DCFkP6WYrP/AQtNAzxiyw5WkaoRlTVJZvCdu5TxjpG4O6/Ai5TI9QftIg==", "dev": true, "dependencies": { - "@storybook/client-logger": "6.5.7", + "@storybook/client-logger": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" }, @@ -13266,20 +13264,20 @@ } }, "node_modules/@storybook/ui": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.7.tgz", - "integrity": "sha512-NOg44bc/w7FweuM2fa99PxsgI9qoG2p5vhTQ4MOI/7QnOUDn+EenlapsRos+/Sk2XTaB2QmM43boUkravMSouA==", - "dev": true, - "dependencies": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", - "@storybook/router": "6.5.7", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.8.tgz", + "integrity": "sha512-rL09kxgY9pCVbxr/VUK4b5FL5VbALfciZR+50sNT1EcTDb9k0OPeqx7a4Ptc+KNkgyPdSTxUGvhzVqH5PYrhZQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", + "@storybook/router": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7", "resolve-from": "^5.0.0" @@ -19118,7 +19116,7 @@ "node_modules/cpy/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -20507,6 +20505,29 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "peer": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -20733,22 +20754,6 @@ "esbuild-windows-arm64": "0.14.39" } }, - "node_modules/esbuild-linux-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.39.tgz", - "integrity": "sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -22642,36 +22647,36 @@ } }, "node_modules/firebase": { - "version": "9.8.2", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.8.2.tgz", - "integrity": "sha512-cVPpiR18vsLuGWAAVkVhNO6mYsEgYBqawvMI2zxKo2FCtneyBgMwOyWKI8VyCmL5ze5p5QJTPjkoatM6rZkd0Q==", - "dependencies": { - "@firebase/analytics": "0.7.9", - "@firebase/analytics-compat": "0.1.10", - "@firebase/app": "0.7.25", - "@firebase/app-check": "0.5.8", - "@firebase/app-check-compat": "0.2.8", - "@firebase/app-compat": "0.1.26", + "version": "9.8.3", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.8.3.tgz", + "integrity": "sha512-PCThy5cFXnbiUtFPJ9vVdcG7wKibOKNR+iuNXf+54xMGJzYb+rM2P8GUqtr2fhVQkfs42uJ6gGKG4soNGkP64w==", + "dependencies": { + "@firebase/analytics": "0.7.10", + "@firebase/analytics-compat": "0.1.11", + "@firebase/app": "0.7.26", + "@firebase/app-check": "0.5.9", + "@firebase/app-check-compat": "0.2.9", + "@firebase/app-compat": "0.1.27", "@firebase/app-types": "0.7.0", - "@firebase/auth": "0.20.2", - "@firebase/auth-compat": "0.2.15", - "@firebase/database": "0.13.0", - "@firebase/database-compat": "0.2.0", - "@firebase/firestore": "3.4.9", - "@firebase/firestore-compat": "0.1.18", - "@firebase/functions": "0.8.1", - "@firebase/functions-compat": "0.2.1", - "@firebase/installations": "0.5.9", - "@firebase/messaging": "0.9.13", - "@firebase/messaging-compat": "0.1.13", - "@firebase/performance": "0.5.9", - "@firebase/performance-compat": "0.1.9", + "@firebase/auth": "0.20.3", + "@firebase/auth-compat": "0.2.16", + "@firebase/database": "0.13.1", + "@firebase/database-compat": "0.2.1", + "@firebase/firestore": "3.4.10", + "@firebase/firestore-compat": "0.1.19", + "@firebase/functions": "0.8.2", + "@firebase/functions-compat": "0.2.2", + "@firebase/installations": "0.5.10", + "@firebase/messaging": "0.9.14", + "@firebase/messaging-compat": "0.1.14", + "@firebase/performance": "0.5.10", + "@firebase/performance-compat": "0.1.10", "@firebase/polyfill": "0.3.36", - "@firebase/remote-config": "0.3.8", - "@firebase/remote-config-compat": "0.1.9", - "@firebase/storage": "0.9.6", - "@firebase/storage-compat": "0.1.14", - "@firebase/util": "1.6.0" + "@firebase/remote-config": "0.3.9", + "@firebase/remote-config-compat": "0.1.10", + "@firebase/storage": "0.9.7", + "@firebase/storage-compat": "0.1.15", + "@firebase/util": "1.6.1" } }, "node_modules/flat": { @@ -30058,7 +30063,7 @@ "node_modules/load-json-file/node_modules/strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dev": true, "optional": true, "dependencies": { @@ -31270,7 +31275,7 @@ "node_modules/meow/node_modules/strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "dev": true, "optional": true, "dependencies": { @@ -34743,7 +34748,6 @@ "version": "1.28.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", - "dev": true, "engines": { "node": ">=6" } @@ -40417,7 +40421,7 @@ "node_modules/renderkid/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { "ansi-regex": "^2.0.0" @@ -40894,7 +40898,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "node_modules/sane": { "version": "4.1.0", @@ -41138,7 +41142,7 @@ "node_modules/sane/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { "shebang-regex": "^1.0.0" @@ -41150,7 +41154,7 @@ "node_modules/sane/node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -41159,7 +41163,7 @@ "node_modules/sane/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "dependencies": { "is-number": "^3.0.0", @@ -41245,9 +41249,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.52.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.2.tgz", - "integrity": "sha512-mfHB2VSeFS7sZlPv9YohB9GB7yWIgQNTGniQwfQ04EoQN0wsQEv7SwpCwy/x48Af+Z3vDeFXz+iuXM3HK/phZQ==", + "version": "1.52.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz", + "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -41466,7 +41470,7 @@ "node_modules/serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", "dev": true, "dependencies": { "etag": "~1.8.1", @@ -41610,7 +41614,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -43229,9 +43233,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", - "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", + "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -43389,7 +43393,7 @@ "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, "node_modules/to-fast-properties": { @@ -45165,7 +45169,7 @@ "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "optional": true, "dependencies": { @@ -48091,14 +48095,14 @@ "dev": true }, "@firebase/analytics": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.9.tgz", - "integrity": "sha512-h/2L2q4/+mmV9EdvVC3XwFFbKSh8bvaYu4DMJIKnPAuGze6W5ALBLkK2GcVti6Kz1NTMJ3puxTRWE9XxRGZipQ==", - "requires": { - "@firebase/component": "0.5.14", - "@firebase/installations": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.10.tgz", + "integrity": "sha512-efZ9jdzTW1/COE5gVdJVdplsltooKPH7M3XpSi/kDyegR1sC05C5NQaiBIYcaTyX2yf1OVcCfsWEcZFhhPTPGw==", + "requires": { + "@firebase/component": "0.5.15", + "@firebase/installations": "0.5.10", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48110,14 +48114,14 @@ } }, "@firebase/analytics-compat": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.10.tgz", - "integrity": "sha512-7zfB+BBO5RbF7RSHOA4ZPyLvOEEvMOhRbfIjh5ZmizAQY2J6tZB8t+dwQ/q4hqZVGgw4ds4g0JYuRKZKYsWADg==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.11.tgz", + "integrity": "sha512-Jx5iXM3nlMa6utqGWNDtmdIztFhLCqMx2Iw809BbynhTSa3esF4e5RevCRk+5oDDfW11uLHckLpe6MhmINKIkA==", "requires": { - "@firebase/analytics": "0.7.9", + "@firebase/analytics": "0.7.10", "@firebase/analytics-types": "0.7.0", - "@firebase/component": "0.5.14", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48134,13 +48138,13 @@ "integrity": "sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==" }, "@firebase/app": { - "version": "0.7.25", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.25.tgz", - "integrity": "sha512-OemDA3NZS1oEbAPFlWHeVI8Od26ZHAXUivUWFYIsYrw+YjS7FloltwyHB06Q8LQyPJIBPubGkEuzNTHz32EDCQ==", + "version": "0.7.26", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.26.tgz", + "integrity": "sha512-FmJ4uaUyazmOZZWJO9OviKfnw+lrwMPQbWBMutymSQT8Gx783Ddnhs5IdmfV0NeLrlGy4ZwfP6/+RJyy2wGDXw==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "idb": "7.0.1", "tslib": "^2.1.0" }, @@ -48153,13 +48157,13 @@ } }, "@firebase/app-check": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.8.tgz", - "integrity": "sha512-DgrXnrJT0S5csa5CsvmWWSWqy61T3rOE2iZ/L4Q8+xZsjU2McpUj8g/lU8NDa4qc5mGRZ/Qjozqog1H3pwPgGw==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.9.tgz", + "integrity": "sha512-IxOSpw4cL6fQD2AGLhXHxsdCjzQEYGyRwvS2vtguMxTYhRQ/EWXvej+P42cXf373vDrmAMKrnIUgC4P1yMPLSA==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48171,15 +48175,15 @@ } }, "@firebase/app-check-compat": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.8.tgz", - "integrity": "sha512-EAqFa0juE2xc52IGh2nv8E+avTLsZfbO7fkJnhPu07e5FU39pptcsRckTdHU7v1/DuWuigUVFcOD5iic9I8TQw==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.9.tgz", + "integrity": "sha512-DgHCcUR3vC3KrAQccs+cggTjNusF/oxPJmw1397H0jw5vWVu0oTtmIduyKB2GE0KDo0q0bHNPPR8GEVugjeFPg==", "requires": { - "@firebase/app-check": "0.5.8", + "@firebase/app-check": "0.5.9", "@firebase/app-check-types": "0.4.0", - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48201,14 +48205,14 @@ "integrity": "sha512-SsWafqMABIOu7zLgWbmwvHGOeQQVQlwm42kwwubsmfLmL4Sf5uGpBfDhQ0CAkpi7bkJ/NwNFKafNDL9prRNP0Q==" }, "@firebase/app-compat": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.26.tgz", - "integrity": "sha512-i5UTq1HZAHuhe7RNjgFSezbow4jVxc2oe3Gndsv+Hdut92f8L0AyssOtdU2iOylLlxbTijewAXXui4FAUzXubw==", - "requires": { - "@firebase/app": "0.7.25", - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.27.tgz", + "integrity": "sha512-0A5ENP/KK0Eev94qPuxaclfOE0oA6hyCVQTdi0ox1bPm+VzGGD/jXP6Bzw+IUmy33ChjP/639bm6Myh8AG4PwA==", + "requires": { + "@firebase/app": "0.7.26", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48225,13 +48229,13 @@ "integrity": "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" }, "@firebase/auth": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.20.2.tgz", - "integrity": "sha512-anv2dhHXnlHSuXDuXIoCm/w/JJ+SiQ1TAKgNVYlhfq+yvx9Op8CxfTqcfBwfbIZ1gizw4PNLuk82m8KelsKl6Q==", + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.20.3.tgz", + "integrity": "sha512-iElaZvVxxW2WAAmmqwTkdPBdixdI2TpURACwNn0G4XpuxlNeF3hYK1nDla2Oa/r39QGtlb9FChTTBby4Uu/Flw==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "node-fetch": "2.6.7", "selenium-webdriver": "4.1.2", "tslib": "^2.1.0" @@ -48245,14 +48249,14 @@ } }, "@firebase/auth-compat": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.15.tgz", - "integrity": "sha512-Kl8pujKWVBJ+76h4tRsS5xI9Dvk8MVSP6eN82rnEgmCxiUsnVj5Adb/WzvS3p4/l++4mRSAEnlIVxZ2Pyaeirg==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.16.tgz", + "integrity": "sha512-wwyuBwtCXwygr1Vyr7M4v8iD1eGRUEGM0XNGG2BQkFnlF7rkwpGsmgiiSkaA8kFYibNSTx2TkdBNfvJXzYPL6A==", "requires": { - "@firebase/auth": "0.20.2", + "@firebase/auth": "0.20.3", "@firebase/auth-types": "0.11.0", - "@firebase/component": "0.5.14", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/util": "1.6.1", "node-fetch": "2.6.7", "selenium-webdriver": "4.1.2", "tslib": "^2.1.0" @@ -48278,11 +48282,11 @@ "requires": {} }, "@firebase/component": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.14.tgz", - "integrity": "sha512-ct2p1MTMV5P/nGIlkC3XjAVwHwjsIZaeo8JVyDAkJCNTROu5mYX3FBK16hjIUIIVJDpgnnzFh9nP74gciL4WrA==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.15.tgz", + "integrity": "sha512-VRnZxmvtJmXupTPg37LxM0zdyMN54EXkmsFD4x5Bm4eZUay9VGnhfiGnE3m9Af/2hnURA2idIBN/23L6982iPQ==", "requires": { - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48294,14 +48298,14 @@ } }, "@firebase/database": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.0.tgz", - "integrity": "sha512-lskyf5+FDnytrPJt3MLjkTDxYxutKtaYL7j/Z/De2DSVZJSR+weE/D/r47iK/+tyzMaew2v3joSgZOHvVlWshw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.1.tgz", + "integrity": "sha512-k6PeAzf9x9DG3AJtA6SkJsTD1ivOWvrV71VPOYabBch05QDB0HOYs1EauGhzqa6GOcYz+ncb4pNEkgFDvcnEfQ==", "requires": { "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "faye-websocket": "0.11.4", "tslib": "^2.1.0" }, @@ -48322,15 +48326,15 @@ } }, "@firebase/database-compat": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.0.tgz", - "integrity": "sha512-t2HVI1RrMz8cbmhyo2LQGSInhRN9DZTDKXm55iFQgSihcnCbfoMAFyRv/FFa1Y+iERgcDI8LaOMS/LTjpYVz4g==", - "requires": { - "@firebase/component": "0.5.14", - "@firebase/database": "0.13.0", - "@firebase/database-types": "0.9.8", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.1.tgz", + "integrity": "sha512-xpru5ZtO7um2FmfIw4gCAbkWpyOEwxzamU/5phuwze3ZihMdh+UrDrwrhvfqzQ/KIKXsK76Uyx5F3NCAS8+5eg==", + "requires": { + "@firebase/component": "0.5.15", + "@firebase/database": "0.13.1", + "@firebase/database-types": "0.9.9", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48342,23 +48346,23 @@ } }, "@firebase/database-types": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.8.tgz", - "integrity": "sha512-bI7bwF5xc0nPi6Oa3JVt6JJdfhVAnEpCwgfTNILR4lYDPtxdxlRXhZzQ5lfqlCj7PR+drKh9RvMu6C24N1q04w==", + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.9.tgz", + "integrity": "sha512-Zp86fHzQFZKYVM7yDWVAgVTeOJ39g2wT0ijeiN0jpHAHceeoV013q3jPIIGuooV2HMwWOTIBZGqh+DxrHMFyUw==", "requires": { "@firebase/app-types": "0.7.0", - "@firebase/util": "1.6.0" + "@firebase/util": "1.6.1" } }, "@firebase/firestore": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.4.9.tgz", - "integrity": "sha512-EiSG/uYDyUmrrHlwrsP9WqWI8ChD0hUW/+0MS3NDh8Cfo1Dfb/sM3YWKzgnIZ3wKTxn/nbe9oidHZp5cqI9G+w==", - "requires": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", - "@firebase/webchannel-wrapper": "0.6.1", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.4.10.tgz", + "integrity": "sha512-QUW9B7U8G0zbontuEPCJaoD320AZPOM4skV+Jd+WJIUUrmg/pLCW68Tt9ycg6zQ+1WdJtzaOU35NPJS7VIP8Ug==", + "requires": { + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", + "@firebase/webchannel-wrapper": "0.6.2", "@grpc/grpc-js": "^1.3.2", "@grpc/proto-loader": "^0.6.0", "node-fetch": "2.6.7", @@ -48373,14 +48377,14 @@ } }, "@firebase/firestore-compat": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.18.tgz", - "integrity": "sha512-D6VXudL/B2jlZ6MGpsDPHHm/DSpfKuUOnEb5wwH89Sw0nW5snSMNG8QfYTQYKUxrX35ma+nWUnaa18LlVTUMXQ==", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.19.tgz", + "integrity": "sha512-fE3anYxNvX50zILPdGZaJBFcK3NPOHzZR7lLupFBsmd0YFtFT4E89p0QQ3A/oZK9/74jNuvjZoJ8hamknPkZHQ==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/firestore": "3.4.9", + "@firebase/component": "0.5.15", + "@firebase/firestore": "3.4.10", "@firebase/firestore-types": "2.5.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48398,15 +48402,15 @@ "requires": {} }, "@firebase/functions": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.8.1.tgz", - "integrity": "sha512-UF5187TPn1Q1sFmAUU1oZdKub1t0Z6MAjcskGS6CV4OwAkILZQ9v38LIbo3wnA62R5hr3IFpdEJxKkqHojMwSg==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.8.2.tgz", + "integrity": "sha512-w2ng6vodOYj7Xo/J3h0SN6NfpRzId00DOKZDvGylH+LoQPFBshHJmv2mpM5ljEntxWvtv3aGrjD6YvgKr9JUJA==", "requires": { "@firebase/app-check-interop-types": "0.1.0", "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.14", + "@firebase/component": "0.5.15", "@firebase/messaging-interop-types": "0.1.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "node-fetch": "2.6.7", "tslib": "^2.1.0" }, @@ -48419,14 +48423,14 @@ } }, "@firebase/functions-compat": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.2.1.tgz", - "integrity": "sha512-1epI+TGb3CxpQrnoSJnKMUqBLn9b6KA1Rro6ISmZIEkaDEi8p8q3UI917XP+OewiPG71xvpySiEIIxWyktcl+A==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.2.2.tgz", + "integrity": "sha512-CeAoQDVrrqjc6q0prgyO3mEDDQM84vSH09sNRRMxd9kTjZtKZD4DXf+BKfULSvMAK9mgmL70LBz8RsrcXs6YXg==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/functions": "0.8.1", + "@firebase/component": "0.5.15", + "@firebase/functions": "0.8.2", "@firebase/functions-types": "0.5.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48443,12 +48447,12 @@ "integrity": "sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==" }, "@firebase/installations": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.9.tgz", - "integrity": "sha512-0XvF9ig8Zj7MWP4Aq5/Wcyjq9f/cDtD6DKFJhp3BT1AjmACdmq7WD72xok8UBhkOiqymIiGd5eQf7rX225D2Sw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.10.tgz", + "integrity": "sha512-lTnYmtGPXwLqjiqvS4KH/V9a3vtZYWBU3Lsx+iOndFkzEyEANQ4qwUgZsP94qWRFd1WumcgDqhFmoVeYkDQCew==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/util": "1.6.1", "idb": "7.0.1", "tslib": "^2.1.0" }, @@ -48461,9 +48465,9 @@ } }, "@firebase/logger": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz", - "integrity": "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.3.tgz", + "integrity": "sha512-POTJl07jOKTOevLXrTvJD/VZ0M6PnJXflbAh5J9VGkmtXPXNG6MdZ9fmRgqYhXKTaDId6AQenQ262uwgpdtO0Q==", "requires": { "tslib": "^2.1.0" }, @@ -48476,14 +48480,14 @@ } }, "@firebase/messaging": { - "version": "0.9.13", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.13.tgz", - "integrity": "sha512-wR/SGYGG/bmz1gRqm6/eGI6zRg/X3qNP0BCk0Oa6xVDKK04UCE9zNRgQYgCSKNP+zuLfDhpHbXvvXQp9/vBYVA==", + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.14.tgz", + "integrity": "sha512-TrSDdZT/wI94m+kay4ibYDUsBiSkijU71zWhSXPJRGSUNuq8EP0ecs2eu01Kipb6ghl5YUiFFL/uY5Y6WK/I5A==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/installations": "0.5.9", + "@firebase/component": "0.5.15", + "@firebase/installations": "0.5.10", "@firebase/messaging-interop-types": "0.1.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "idb": "7.0.1", "tslib": "^2.1.0" }, @@ -48496,13 +48500,13 @@ } }, "@firebase/messaging-compat": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.13.tgz", - "integrity": "sha512-kGuzjpl+pcTRmEgGDjyOKQnxxQgC7wIJIIHhLMIpfxHHL5+ysN1Tjq0Ztr1t/gcdHKErtnD/n9To5eoGZHqpzA==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.14.tgz", + "integrity": "sha512-XNF5+TxhbFa5nAmkf/PbbNFfmiTcyBfjIl322Me6ZYK4leC8+O9beR7w0wWei8+GhUSIHn3D69ZZRewUUkXukA==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/messaging": "0.9.13", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/messaging": "0.9.14", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48519,14 +48523,14 @@ "integrity": "sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==" }, "@firebase/performance": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.9.tgz", - "integrity": "sha512-cA1pea1hkIZt0FG0a42tjKQNBhdY7q4apqHML92vBCS9QOOR0SHBui44IGQJRfRBGiVICHW03Q+ikSZv08g+jw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.10.tgz", + "integrity": "sha512-rX+OsVMc6IIkrZqFmIjvEfRuRJ84ftPJDDpnqZ134pqTPr3MQgRzU/gPgLio8EdUN5YCthWyA8nB8NrEzBysSA==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/installations": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/installations": "0.5.10", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48538,15 +48542,15 @@ } }, "@firebase/performance-compat": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.9.tgz", - "integrity": "sha512-EBX4u/uK76ikJSyoWZ2cEMj63G01w1DA68KDpSypSMhKPJE2eiCtWABRTSXhcaisq/FDwZzl4XhNjDyfzArwhA==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.10.tgz", + "integrity": "sha512-WhY2pjpXHiyRfnk9t3/BKGK/C0u4pC61mEYh8t8MLayz8KwuiavJj1wuCN2nG2R0y8CXZAsifFLQs1h0K3XzDA==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/performance": "0.5.9", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/performance": "0.5.10", "@firebase/performance-types": "0.1.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48585,14 +48589,14 @@ } }, "@firebase/remote-config": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.8.tgz", - "integrity": "sha512-z5HYrjrgzkR25nlvQqiPowDGatlEJirA5sN1B6rOy+KYMLsb6IXLVOdKjj/Tg/uHAErwd0DblGxwBUZKTCuo1g==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.9.tgz", + "integrity": "sha512-SQ7tArNyI3sPlbmyAB3X2rS8lHcVlPWIQPRLCmgpKjPKM6Jsv7onCUK+M23DW95iEjK4vEVU5QkxUP3fUXWkxg==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/installations": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/installations": "0.5.10", + "@firebase/logger": "0.3.3", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48604,15 +48608,15 @@ } }, "@firebase/remote-config-compat": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.9.tgz", - "integrity": "sha512-ud4yINy8cegE82KoBDXS4fOp6qwy0+7zl0k587kMXHSWHbWVRZ/uKMQGJQc7kG0EQp0tZhM20CxVwtcCGsABBA==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.10.tgz", + "integrity": "sha512-FSZg9JqgnYIDV78J74W6JUANGjrzCgTRKHioBifONo3e2CdEqQKrvIuGCXEE9+9vYyuqNEtmv5DUIPC4n6XYCQ==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/logger": "0.3.2", - "@firebase/remote-config": "0.3.8", + "@firebase/component": "0.5.15", + "@firebase/logger": "0.3.3", + "@firebase/remote-config": "0.3.9", "@firebase/remote-config-types": "0.2.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48629,12 +48633,12 @@ "integrity": "sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==" }, "@firebase/storage": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.6.tgz", - "integrity": "sha512-q8/s3qFbFl+AlKbyEtGA7FRVhcMu3NKPqHueBTn5XSI0B3bfxptBcDJMb9txs69ppve6P3jrK1//TEWpjTGJUg==", + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.7.tgz", + "integrity": "sha512-0unWzgx5bceyO3SX/ilHaxwwHidN5sXZGakFLjAn8cbpjVpmybcKaLOduBxlMXeDCdUFfO8FcvEajFkV+0t2hA==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/util": "1.6.0", + "@firebase/component": "0.5.15", + "@firebase/util": "1.6.1", "node-fetch": "2.6.7", "tslib": "^2.1.0" }, @@ -48647,14 +48651,14 @@ } }, "@firebase/storage-compat": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.14.tgz", - "integrity": "sha512-/Fey1n+ryIeAEyd/qXPXh32ReFZUhzE5W0z/+LDA+3yyMGw/a6wCzQqe7wBiGiCRhjd+5XiV++jkCXTflun3Dg==", + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.15.tgz", + "integrity": "sha512-XjqAYIc8oJv6OAeeLdCUC3KF0wXAzRoBGktRhPMc9umSxVE7Dnr960kF6qtdAbLFGi/uhj478AdpKSQgZ75rQA==", "requires": { - "@firebase/component": "0.5.14", - "@firebase/storage": "0.9.6", + "@firebase/component": "0.5.15", + "@firebase/storage": "0.9.7", "@firebase/storage-types": "0.6.0", - "@firebase/util": "1.6.0", + "@firebase/util": "1.6.1", "tslib": "^2.1.0" }, "dependencies": { @@ -48672,9 +48676,9 @@ "requires": {} }, "@firebase/util": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.6.0.tgz", - "integrity": "sha512-6+hhqb4Zzjoo12xofTDHPkgW3FnN4ydBsjd5X2KuQI268DR3W3Ld64W/gkKPZrKRgUxeNeb+pykfP3qRe7q+vA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.6.1.tgz", + "integrity": "sha512-+eDE6uG5GgvXYHbAzfP1mpJUX1VDBD+A8CjBeBoNAKAVAApMSDxDODqRcOq7NW7kFJXSUkMzDJWhnUIifX2R8w==", "requires": { "tslib": "^2.1.0" }, @@ -48687,9 +48691,9 @@ } }, "@firebase/webchannel-wrapper": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz", - "integrity": "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ==" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.2.tgz", + "integrity": "sha512-zThUKcqIU6utWzM93uEvhlh8qj8A5LMPFJPvk/ODb+8GSSif19xM2Lw1M2ijyBy8+6skSkQBbavPzOU5Oh/8tQ==" }, "@formatjs/ecma402-abstract": { "version": "1.11.4", @@ -51392,18 +51396,18 @@ "dev": true }, "@storybook/addon-actions": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.7.tgz", - "integrity": "sha512-gTkPr2FYX+vySZKEg5Wq7uHPkVUq3hJ7ZKvGls+/xjgaTwfu3iIly53FEFUl8A6kMQ+4gtTC+YRr3cSJgXMbAg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.8.tgz", + "integrity": "sha512-9ciR1iWBTzQNBDlq0iQs9+TV7gng+FbQxW5mHNxNvT9SxY1dt02wCPHZeVE/5la61wBXZs/zpEepZA93VzVBDw==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -51419,18 +51423,18 @@ } }, "@storybook/addon-backgrounds": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.7.tgz", - "integrity": "sha512-ryisDpxbIEZbYJkQWU5xvsj940jhWrWizedFsY9g/qBIBi33UrW/H1hKZQtmg0bzuNTgYcBjRy50ikJgH/eKAQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.8.tgz", + "integrity": "sha512-pvlP5ZVVfd2sWzgCqG/f6RJX/h9648znYbzaLQ4Z6whQIFobP3H3/cj9k/RTy3uXg5vC0IWDHSEaCXgin2sW1Q==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -51440,49 +51444,49 @@ } }, "@storybook/addon-controls": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.7.tgz", - "integrity": "sha512-1JGphHk1gcLLpkft/D5BkygXwelSdWQqvXnfFc62BVqvzxv8hCF4zuUosKLWMlB/nzVbd6W4oEDV/Mqmt6h/7w==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.8.tgz", + "integrity": "sha512-fB6p5DgVHUnJKUzOlT2mtvaSCincnO+vuYLyf++f+l4BlYK1Es9HNl/puaRoMgdW+LoGJjXPTIMcMByeHVIt6Q==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-common": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-common": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/node-logger": "6.5.7", - "@storybook/store": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/node-logger": "6.5.8", + "@storybook/store": "6.5.8", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" } }, "@storybook/addon-docs": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.7.tgz", - "integrity": "sha512-RghRpimJOJl9c/H6qvCCD0zHLETBIVWXsdYJF8GiY6iTKd+tgQYizuuoBT4f3PAMEMHVhmvWSjkkFLxKxzQLjQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.8.tgz", + "integrity": "sha512-pAvWwh5YCrsW9nHCrd5BpFigvqn92JisX0aEnwAqKC9B1AW1LxhdPn1o9CQCeszQGaq163RA6AzkCejvAqhtUQ==", "dev": true, "requires": { "@babel/plugin-transform-react-jsx": "^7.12.12", "@babel/preset-env": "^7.12.11", "@jest/transform": "^26.6.2", "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/docs-tools": "6.5.7", + "@storybook/docs-tools": "6.5.8", "@storybook/mdx1-csf": "^0.0.1", - "@storybook/node-logger": "6.5.7", - "@storybook/postinstall": "6.5.7", - "@storybook/preview-web": "6.5.7", - "@storybook/source-loader": "6.5.7", - "@storybook/store": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/node-logger": "6.5.8", + "@storybook/postinstall": "6.5.8", + "@storybook/preview-web": "6.5.8", + "@storybook/source-loader": "6.5.8", + "@storybook/store": "6.5.8", + "@storybook/theming": "6.5.8", "babel-loader": "^8.0.0", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", @@ -51496,55 +51500,55 @@ } }, "@storybook/addon-essentials": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.7.tgz", - "integrity": "sha512-JZ80W9PgZOEUp2SjhBYyYHxQduxSIe4n9Wdoy8XDtV28152jDNms6UPjFeEVb+a9rVybYOwWnOnEhBWF6ZfJ/g==", - "dev": true, - "requires": { - "@storybook/addon-actions": "6.5.7", - "@storybook/addon-backgrounds": "6.5.7", - "@storybook/addon-controls": "6.5.7", - "@storybook/addon-docs": "6.5.7", - "@storybook/addon-measure": "6.5.7", - "@storybook/addon-outline": "6.5.7", - "@storybook/addon-toolbars": "6.5.7", - "@storybook/addon-viewport": "6.5.7", - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/node-logger": "6.5.7", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.8.tgz", + "integrity": "sha512-K/Aw/GLugCz5/S3c2tz5lnfC8aN6dSoQQDr8xaMDcBlT9h/xZ1l4jQQnx/mvY/qEvXtexBF41DE6ROWGKSZeSg==", + "dev": true, + "requires": { + "@storybook/addon-actions": "6.5.8", + "@storybook/addon-backgrounds": "6.5.8", + "@storybook/addon-controls": "6.5.8", + "@storybook/addon-docs": "6.5.8", + "@storybook/addon-measure": "6.5.8", + "@storybook/addon-outline": "6.5.8", + "@storybook/addon-toolbars": "6.5.8", + "@storybook/addon-viewport": "6.5.8", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/node-logger": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0" } }, "@storybook/addon-measure": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.7.tgz", - "integrity": "sha512-NMth6CErySKQ9WnfzMZ4nelHa2bBzZ60ZgsDq5s5dKHhJzZPm2nclmGAGE+VhqI/USe8b1fnjKFeHH485T8J2g==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.8.tgz", + "integrity": "sha512-zpNAt1XwBLnQ3OjCfj63J7vC2WCTyAjvbGVAsUkpQb21vr/e3sPFQZPKGwio85SYjIX7AJ+Oi28mbEwWzS8wFA==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "global": "^4.4.0" } }, "@storybook/addon-outline": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.7.tgz", - "integrity": "sha512-qTu19FnZz+rjY7SxPOgiQkuAxHRNRhUYgvUwI+ep0ZQcBddsRgniQjzXtErlUMeVoMZ63mDuOaJp67ltkriAOQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.8.tgz", + "integrity": "sha512-/bEjYTVJNM5QEiguS5nVQlerl5NhgOod1zLExnkchc8+FTJC58Vy7CRfzr2iaIMuf1QRPqBwSIy6ZqLJOdUfnQ==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "global": "^4.4.0", @@ -51553,32 +51557,32 @@ } }, "@storybook/addon-toolbars": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.7.tgz", - "integrity": "sha512-+MUG5t4isQNf+q7BpEsGwuYAvYgs9XTdzzdvL/9jedQ7udJsWmG1q9a6m9+iQGPr/WK+88F2kgSOknpib3J21w==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.8.tgz", + "integrity": "sha512-16eRbbtn4/cH1xU8JlPZRdShwUwSsPcqpyH1JNl+rgYQ6SaSNq3aO/jDFeQe93guSD0YPRWHz8dKtn6OxVeozQ==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" } }, "@storybook/addon-viewport": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.7.tgz", - "integrity": "sha512-8VmSTGKY3+9kZ09THC7546OaFbjLu5kEAGU5ZFSZaNlsJwRg7bC3bScKbnyX5EhihgZ3W8oJt/eMAIqXKHxA8g==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.8.tgz", + "integrity": "sha512-MTpZWkBWNPH55iNHK4tBNKTdew5xKfoNvOj0pZn1rYDHlylMTlq7aoccwRjjK2jZeHHNnb1rm6ZkQDjmYu0Tcw==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -51587,18 +51591,18 @@ } }, "@storybook/addons": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.7.tgz", - "integrity": "sha512-tUZ2c1uegUcwY31ztNQZGU/HUwAEEGIR8fEOvvO8S0TNQGoo6cwFtZmWBh3mTSRGcmzK2SNBjFHZua5Ee9TefA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.8.tgz", + "integrity": "sha512-L3LmbsYP9tDHHvpr/yv8YuEkzym7SXp/jZ0km31tpG3EuZmgGu7MXPrZ2ymEw4PkAhQzztgRr23VTfKobGUojA==", "dev": true, "requires": { - "@storybook/api": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/api": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/router": "6.5.8", + "@storybook/theming": "6.5.8", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -51606,18 +51610,18 @@ } }, "@storybook/api": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.7.tgz", - "integrity": "sha512-QCNypz4X+lYuFW7EzvRPXMf8uS3gfSIV8sqXtEe5XoMb0HQXhy6AGU7/4iAeuUimtETqLTxq+kOxaSg4uPowxg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.8.tgz", + "integrity": "sha512-/MueV+wLCvy9gFA3ih4g7QYjDmn14i+D2ydonfaEC7R+agFGXxXwJGPKkz3yBNrRpNkBwcbY9mAmv8lE2AqgqQ==", "dev": true, "requires": { - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.7", + "@storybook/router": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -51631,28 +51635,28 @@ } }, "@storybook/builder-webpack4": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.7.tgz", - "integrity": "sha512-8OB3mZ2L6kQBiAXlkhna/MHREXIPtqXi2AJLT3+bTzBlqkusH+PwMZxWHbcPl1vZrlNQBC40Elx9tdynGkVQ6g==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.8.tgz", + "integrity": "sha512-4/CVp/AlOxCeWZ/DF1TVS/TuzHao4l9KCq7DhL+utFEVl9c/dpgoZXc0Gy2FfHa2RXHKckrH/VUfV2KQk4TNSw==", "dev": true, "requires": { "@babel/core": "^7.12.10", - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/core-events": "6.5.7", - "@storybook/node-logger": "6.5.7", - "@storybook/preview-web": "6.5.7", - "@storybook/router": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/core-events": "6.5.8", + "@storybook/node-logger": "6.5.8", + "@storybook/preview-web": "6.5.8", + "@storybook/router": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.7", - "@storybook/theming": "6.5.7", - "@storybook/ui": "6.5.7", + "@storybook/store": "6.5.8", + "@storybook/theming": "6.5.8", + "@storybook/ui": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "@types/webpack": "^4.41.26", "autoprefixer": "^9.8.6", @@ -52217,7 +52221,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -52302,27 +52306,27 @@ } }, "@storybook/builder-webpack5": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.5.7.tgz", - "integrity": "sha512-3mbQ09KBTUsFYxnEtR4vr7W1wodRen3o8fANY5XxvE1sr1TopHVOKpIlePjrpcrXcLKFI/ZWrX3IfK88LCuI9w==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.5.8.tgz", + "integrity": "sha512-bc7LSGzOqTUImejsfjWAHEHwBreoPQKS6pfnWYkjKMvfvWOwlHSAxwOSM5DyS4cvpcpMDG8yBJNz2QcvXFVLxA==", "dev": true, "requires": { "@babel/core": "^7.12.10", - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/core-events": "6.5.7", - "@storybook/node-logger": "6.5.7", - "@storybook/preview-web": "6.5.7", - "@storybook/router": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/core-events": "6.5.8", + "@storybook/node-logger": "6.5.8", + "@storybook/preview-web": "6.5.8", + "@storybook/router": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.7", - "@storybook/theming": "6.5.7", + "@storybook/store": "6.5.8", + "@storybook/theming": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "babel-loader": "^8.0.0", "babel-plugin-named-exports-order": "^0.0.2", @@ -52731,14 +52735,14 @@ } }, "@storybook/channel-postmessage": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.7.tgz", - "integrity": "sha512-X4UPgm4O0503CsSnqAM1ht/6R9ofnoMcqFZxYRu9PSvHlhaFR9V9AU4VjQhakH7alFzRsAhcAV2PFVTAdWhgtA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.8.tgz", + "integrity": "sha512-6IkIKk+UMYKk05vN8gWHvvOV/EZNXpQG/5gesGDALjkCyvRmcktHak1a9tHpoihZ3L7/gDwXOZraCZmuy8vBcQ==", "dev": true, "requires": { - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "core-js": "^3.8.2", "global": "^4.4.0", "qs": "^6.10.0", @@ -52746,22 +52750,22 @@ } }, "@storybook/channel-websocket": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.7.tgz", - "integrity": "sha512-C+l6t3ZgHzU8gL8GJ8c4GMttJglGJIwq1LtJJKnGzx2kJCD0HRMMqc/qFS2K2EwP99hLwwGIlCpom3UZ1aEanA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.8.tgz", + "integrity": "sha512-lAtvgO0FWsyS3u7uFbsGIYp2aSWJfWU/LOtc3x1K5c84JJAd9fncYkyZMwP1gMbdNgYxJoxe8HXtVtfeNegPuQ==", "dev": true, "requires": { - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", "core-js": "^3.8.2", "global": "^4.4.0", "telejson": "^6.0.8" } }, "@storybook/channels": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.7.tgz", - "integrity": "sha512-v880fWBpWgiWrDmZesTIstNfMZhrPfgXAtLNcL5Z89NAPahsHskOSszc0BDxKN3gb+ZeTKUqHxY57dQdp+1rhg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.8.tgz", + "integrity": "sha512-fNql1lEIvWlI1NiRtwFMWOOvfW6qxgeSP6xoqiAJ0b+QYegEFG9UxJDuEvVHq++S81FulgQ5U+p+5R9XSV19tQ==", "dev": true, "requires": { "core-js": "^3.8.2", @@ -52770,18 +52774,18 @@ } }, "@storybook/client-api": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.7.tgz", - "integrity": "sha512-na8NZhB6GnAGp3jRTV9wwue3WGwSZoi5jfxrKSYMPL/s/2n07/soixHggqueBDXuNBrPoJaXbY/nRHmSjLwxtQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.8.tgz", + "integrity": "sha512-mdU+qQ4+T2OUbEnl+3MWRKxEPju/EOIUg66hMgmif8c5u7YFYBFulUMUYLICMjll8Jlu+37+g+qO3K2eEz6CEw==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.7", + "@storybook/store": "6.5.8", "@types/qs": "^6.9.5", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -52798,9 +52802,9 @@ } }, "@storybook/client-logger": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.7.tgz", - "integrity": "sha512-ycDy1kXeXRg3djSTXRGMVxc0kvaWw/UhHDs2VGFmOPScsoeWpdbePHXJMFbsqippxuexpsofqTryBwH2b6BPhw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.8.tgz", + "integrity": "sha512-dH6HSaVuOIMHy1+rpsqcD3SJxVZEEbuEtsNpdUGwLJaIuduhUJJpM2xQfUW0siZDyrgwoa+znll+G0YNUbv7sg==", "dev": true, "requires": { "core-js": "^3.8.2", @@ -52808,14 +52812,14 @@ } }, "@storybook/components": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.7.tgz", - "integrity": "sha512-xSOaOK8q6bXYkmN4LZKucvXU2HRHqKwwTafFDh5yzsCSEB2VQIJlyo4ePVyv/GJgBUX6+WdSA7c5r5ePXK6IYQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.8.tgz", + "integrity": "sha512-YE+LZ1/GXoqertxodsf+L9ehcohbICRAxgE/iNqc7MZfk95SD3XRSUbxhCpGe8QTIZJpzs1tK4LFZ3Fg5w/+Lg==", "dev": true, "requires": { - "@storybook/client-logger": "6.5.7", + "@storybook/client-logger": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "@types/react-syntax-highlighter": "11.0.5", "core-js": "^3.8.2", "qs": "^6.10.0", @@ -52825,31 +52829,31 @@ } }, "@storybook/core": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.5.7.tgz", - "integrity": "sha512-YSu2qur1E5y9rjVspchtCfupPT3y1XyjBInhwzo8jC3rvm2WY0RS80VQU3dga4QBllO1M+cDmLzmOEPL82+Juw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.5.8.tgz", + "integrity": "sha512-+Fv4n1E5N4Avty9GcRbz4vB2IWH//se2OUU+RTT3vneCOGjyus5bj0Or6GU5wef5UGuvHF78mHg/frhWpguzsw==", "dev": true, "requires": { - "@storybook/core-client": "6.5.7", - "@storybook/core-server": "6.5.7" + "@storybook/core-client": "6.5.8", + "@storybook/core-server": "6.5.8" } }, "@storybook/core-client": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.7.tgz", - "integrity": "sha512-GL7m33tpEyornhfnTddbvDuLkA9EMe1zKv9oZGsUYo78cWRTiEibYyHegIi9/ThplRXvpFR/5uHY4Zx5Z5rxJg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.8.tgz", + "integrity": "sha512-8x8qKQ2clvpfDcoWrNBmQ8Xt9z/i32TFIBp4PEZMcbB7eqo517nzfllLiXDipiJgO7BGxKtY5CRHQ9pAU9G27A==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/channel-websocket": "6.5.7", - "@storybook/client-api": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/channel-websocket": "6.5.8", + "@storybook/client-api": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/preview-web": "6.5.7", - "@storybook/store": "6.5.7", - "@storybook/ui": "6.5.7", + "@storybook/preview-web": "6.5.8", + "@storybook/store": "6.5.8", + "@storybook/ui": "6.5.8", "airbnb-js-shims": "^2.2.1", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", @@ -52863,9 +52867,9 @@ } }, "@storybook/core-common": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.7.tgz", - "integrity": "sha512-/b1oQlmhek8tKDu9ky2O1oEk9g2giAPpl192yRz4lIxap5CFJ7RCfgbkq+F3JBXnH2P84BufC0x3dj4jvBhxCw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.8.tgz", + "integrity": "sha512-ELGKLMx1d0oEA2LT+fsmo85X2RNE1EO+It7B1bw//g7jyf1hmZ7t3lXMZUCqt7eml1qy1N72LDkfmmU+H9H6ww==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -52890,7 +52894,7 @@ "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", "@babel/register": "^7.12.1", - "@storybook/node-logger": "6.5.7", + "@storybook/node-logger": "6.5.8", "@storybook/semver": "^7.3.2", "@types/node": "^14.0.10 || ^16.0.0", "@types/pretty-hrtime": "^1.0.0", @@ -53537,7 +53541,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -53602,32 +53606,32 @@ } }, "@storybook/core-events": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.7.tgz", - "integrity": "sha512-epqYy67Ypry5QdCt7FpN57/X9uuS7R2+DLFORZIpL/SJG1dIdN4POQ1icWOhPzHl+eiSgaV7e2oPaUsN+LPhJQ==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.8.tgz", + "integrity": "sha512-lzG4Lg65WFYvjs2k/E3CP4+eyPexEGrDyRMO9Pbj9H9x+eosYptauEbT/wXF83bmUWZKLWWVUAZX7hDcxBO8cw==", "dev": true, "requires": { "core-js": "^3.8.2" } }, "@storybook/core-server": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.7.tgz", - "integrity": "sha512-CGwFZ5kmKaCS/+tcrAbqQu4Owq86wXkWRapJB55S8AlUsf3c9gEC8a3+Ed9tZUlmjSH56CnDDfmt7AleToaQ9w==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.8.tgz", + "integrity": "sha512-ti7+MW1xzD9O0JLwgZTwulxhJx5YGPNu+hRpGhJSjKrqGX1h6K6ilmkBSHvyLqpiE+F4mxvqb5Rx3KBIEdEgbw==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-webpack4": "6.5.7", - "@storybook/core-client": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/builder-webpack4": "6.5.8", + "@storybook/core-client": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/csf-tools": "6.5.7", - "@storybook/manager-webpack4": "6.5.7", - "@storybook/node-logger": "6.5.7", + "@storybook/csf-tools": "6.5.8", + "@storybook/manager-webpack4": "6.5.8", + "@storybook/node-logger": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.7", - "@storybook/telemetry": "6.5.7", + "@storybook/store": "6.5.8", + "@storybook/telemetry": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "@types/node-fetch": "^2.5.7", "@types/pretty-hrtime": "^1.0.0", @@ -54217,7 +54221,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -54276,9 +54280,9 @@ } }, "ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", "dev": true, "requires": {} }, @@ -54300,9 +54304,9 @@ } }, "@storybook/csf-tools": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.7.tgz", - "integrity": "sha512-/vBaknzD8c7H/Zsz0gwhmlNlMwe5slZwXadi6rAQXDkKLzaR1kmz4cQFs8yDR1wWpXaGjNvQxOUAGYjFoGQxzA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.8.tgz", + "integrity": "sha512-4VrjIMxKcp29OFSMDub52aQOMP4EvtZ5eWZkPeORRNQoJsnQaxhF9GGf71QdSaAQZhMoxdvmpA47ehrFk8Rnfw==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -54352,14 +54356,14 @@ } }, "@storybook/docs-tools": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.7.tgz", - "integrity": "sha512-Aw9uUsqeuw0Z9fpiwxrstMNjNGB9s1Tm57SpMF8ibjLYBYFf5Apz5CwDX7bm6YFtCweaawx4MeQta8qnQMWCFw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.8.tgz", + "integrity": "sha512-CWMW+3LSstvQmHKV5ggPR1beQZTpwCXEhfysZ9u4Yp/4fcoDIuQ7DTOK5uNFynGCGl1FG3lATriEOhEZ3bZCvQ==", "dev": true, "requires": { "@babel/core": "^7.12.10", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.7", + "@storybook/store": "6.5.8", "core-js": "^3.8.2", "doctrine": "^3.0.0", "lodash": "^4.17.21", @@ -54367,20 +54371,20 @@ } }, "@storybook/manager-webpack4": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.7.tgz", - "integrity": "sha512-RmGsr/6PNsafaSm8aTD7e2VXSKT8BQ6Hkg6TAArLoS2TpIUvrNuM2hEqOHzm2POcApC+OE/HN1H0GiXBkH533Q==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.8.tgz", + "integrity": "sha512-qW5/L3cJHvtNi5ylDxObALZWaAHMsWQlPP8GRxm95NHpff4CfRo/qs7puY9ZeLmJSic0KchoHEH/8AScflLOgA==", "dev": true, "requires": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.5.7", - "@storybook/core-client": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/node-logger": "6.5.7", - "@storybook/theming": "6.5.7", - "@storybook/ui": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/core-client": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/node-logger": "6.5.8", + "@storybook/theming": "6.5.8", + "@storybook/ui": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "@types/webpack": "^4.41.26", "babel-loader": "^8.0.0", @@ -55003,7 +55007,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -55087,20 +55091,20 @@ } }, "@storybook/manager-webpack5": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.5.7.tgz", - "integrity": "sha512-4TZKe71noCRui8sUxSuSqO6zMnCxCLn7dE1dOlCr/UvyZbCaGWACO5olUDQrT+n1glZL8i9L998JGQroksucNw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.5.8.tgz", + "integrity": "sha512-foW/ZvTqGZAl4TfcfGKdS3RlaBDDAgEjUCbCaVShlZRshZ8tzWBVu3JQFqbPVGslH89T5qp9DUYoN/SJqTUpcg==", "dev": true, "requires": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.5.7", - "@storybook/core-client": "6.5.7", - "@storybook/core-common": "6.5.7", - "@storybook/node-logger": "6.5.7", - "@storybook/theming": "6.5.7", - "@storybook/ui": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/core-client": "6.5.8", + "@storybook/core-common": "6.5.8", + "@storybook/node-logger": "6.5.8", + "@storybook/theming": "6.5.8", + "@storybook/ui": "6.5.8", "@types/node": "^14.0.10 || ^16.0.0", "babel-loader": "^8.0.0", "case-sensitive-paths-webpack-plugin": "^2.3.0", @@ -55664,9 +55668,9 @@ } }, "@storybook/node-logger": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.7.tgz", - "integrity": "sha512-OrHu5p2E5i7P2v2hQAOtZw6Od1e2nrP6L7w5SxUPgccUnKUD9dRX5Y8qbAcPZO3XCkMLjpjAbC1xBXG0eFkn9g==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.8.tgz", + "integrity": "sha512-BHdkSipgjnfsh4FRYbV2R0npM5gVx9JLRsDQ0KiTolRpN4SU98kT/6885zb9jZg6I0EY+UG9Qdr3fvL9VLpY1g==", "dev": true, "requires": { "@types/npmlog": "^4.1.2", @@ -55728,9 +55732,9 @@ } }, "@storybook/postinstall": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.7.tgz", - "integrity": "sha512-902JjgB2o+NiiLCPV0b4GHX9SbnY1OkvfvmkqpD3UqWh8djpkSQwvli9npM1J2NEu4BxCqbifYJI7V4JmZbdsw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.8.tgz", + "integrity": "sha512-Z6zQnBOaMj+gHtF1XPMpwTIxYRCmh6eNirrJLrkPk5c+fKXtw6+vNCbmPvsyTGxGEHnyn/tYwe1fvwJTHDctUw==", "dev": true, "requires": { "core-js": "^3.8.2" @@ -55867,17 +55871,17 @@ } }, "@storybook/preview-web": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.7.tgz", - "integrity": "sha512-EH8gdl334D8EDVL1VJjRURcUou5Sv6BwgismL4E6wjSFmWxL9egxYDnGJJEh3mjIkAtGb0zpksYn/VNWPA8c8A==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.8.tgz", + "integrity": "sha512-jEEAgvTVZfFA0B20mRJfLW6dPA5mG5PxUJtjMx6wH4Yw4+i3Sld/U63hTRt7ktpKdrcu4lX9E+PuaRLPq7S2kg==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/channel-postmessage": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/channel-postmessage": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/store": "6.5.7", + "@storybook/store": "6.5.8", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", "global": "^4.4.0", @@ -55891,24 +55895,24 @@ } }, "@storybook/react": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.5.7.tgz", - "integrity": "sha512-jMY1vk1WL1otEODl5BxD1kSh5Eqg+SvZW5CJ7sS6q53i3teOhaGhugvuSTuV9lnBzLOZu8atIdFL0ewdOkpwsg==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.5.8.tgz", + "integrity": "sha512-LdObfhhPb9gAFBtRNb3awYJe1qMiYeda1ppkj0ZvccbV04YrmbW5bzYvfOCvU6D34ugbQJhJyWuvraO/0EJK6w==", "dev": true, "requires": { "@babel/preset-flow": "^7.12.1", "@babel/preset-react": "^7.12.10", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@storybook/addons": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core": "6.5.7", - "@storybook/core-common": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core": "6.5.8", + "@storybook/core-common": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/docs-tools": "6.5.7", - "@storybook/node-logger": "6.5.7", + "@storybook/docs-tools": "6.5.8", + "@storybook/node-logger": "6.5.8", "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.7", + "@storybook/store": "6.5.8", "@types/estree": "^0.0.51", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", @@ -56125,12 +56129,12 @@ } }, "@storybook/router": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.7.tgz", - "integrity": "sha512-edWEdAb8O0rSgdXoBZDDuNlQg2cOmC/nJ6gXj9zBotzmXqsbxWyjKGooG1dU6dnKshUqE1RmWF7/N1WMluLf0A==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.8.tgz", + "integrity": "sha512-tseNJpZ2ZzVYowjekUMpGJVVRMrwOkttieD9mRbHrhh+2n7b+SoMKnuLi3ow0xeOyPL8ZDng2FgRjQzQHXA5Sw==", "dev": true, "requires": { - "@storybook/client-logger": "6.5.7", + "@storybook/client-logger": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" } @@ -56146,13 +56150,13 @@ } }, "@storybook/source-loader": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.7.tgz", - "integrity": "sha512-nj24TSGdF9J1gD5Fj9Z2hPRAQwqBJoBKD/fmTSFZop0qaJOOyeuxZR5022dQh8UWWoBa3WOQADMTNi5RqQZkiA==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.8.tgz", + "integrity": "sha512-3bVxXKE2o6lS4WGga/S7WwgITxPQ96qsY+pQ1I7A+e4/cKSmZxlVWM9qfMW2ScmHTVoZE0Ujsmn6DWftxzCyrQ==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/client-logger": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/client-logger": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "estraverse": "^5.2.0", @@ -56195,14 +56199,14 @@ } }, "@storybook/store": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.5.7.tgz", - "integrity": "sha512-d64towcdylC6TXNL2oJklCpwN3XcUGgZzQ9zgoV8BUlOlsj9tNq8eo95uzTURnLg1Q5uHoDDKWuXrrKj03HHxw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.5.8.tgz", + "integrity": "sha512-5rhGjN/O0oLebRv947B0vgapq48qBBBYYOgq4krRUYU2ecS6LUgtAHR/kTa324o9aBO8cnIXHH78jZcSvMiJlQ==", "dev": true, "requires": { - "@storybook/addons": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/core-events": "6.5.7", + "@storybook/addons": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/core-events": "6.5.8", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", @@ -56218,13 +56222,13 @@ } }, "@storybook/telemetry": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.7.tgz", - "integrity": "sha512-RHrjAConMqGIsu1TgNXztWtWOXTvvCHDWyGoLagCgZYgjGJ4sukp+ZtrbkayNDkkWWD0lpMzsdDEYCJuru/Sig==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.8.tgz", + "integrity": "sha512-QnAhYF8CwcjC1bT2PK7Zqvo6E42TPl0MY6JS+H6qSZU/BmYeS0It8ZURNfPsA/OzVVLHUkQs96CisKh3N0WWaw==", "dev": true, "requires": { - "@storybook/client-logger": "6.5.7", - "@storybook/core-common": "6.5.7", + "@storybook/client-logger": "6.5.8", + "@storybook/core-common": "6.5.8", "chalk": "^4.1.0", "core-js": "^3.8.2", "detect-package-manager": "^2.0.1", @@ -56317,31 +56321,31 @@ } }, "@storybook/theming": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.7.tgz", - "integrity": "sha512-6zp1V84DSBcS8BtFOCJlF2/nIonjQmr+dILPxaM3lCm/X003i2jAQrBKTfPlmzCeDn07PBhzHaRJ3wJskfmeNw==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.8.tgz", + "integrity": "sha512-1VaKHqj38Ls1bJwDpg3+aEOlvVib/DCFkP6WYrP/AQtNAzxiyw5WkaoRlTVJZvCdu5TxjpG4O6/Ai5TI9QftIg==", "dev": true, "requires": { - "@storybook/client-logger": "6.5.7", + "@storybook/client-logger": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" } }, "@storybook/ui": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.7.tgz", - "integrity": "sha512-NOg44bc/w7FweuM2fa99PxsgI9qoG2p5vhTQ4MOI/7QnOUDn+EenlapsRos+/Sk2XTaB2QmM43boUkravMSouA==", - "dev": true, - "requires": { - "@storybook/addons": "6.5.7", - "@storybook/api": "6.5.7", - "@storybook/channels": "6.5.7", - "@storybook/client-logger": "6.5.7", - "@storybook/components": "6.5.7", - "@storybook/core-events": "6.5.7", - "@storybook/router": "6.5.7", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.8.tgz", + "integrity": "sha512-rL09kxgY9pCVbxr/VUK4b5FL5VbALfciZR+50sNT1EcTDb9k0OPeqx7a4Ptc+KNkgyPdSTxUGvhzVqH5PYrhZQ==", + "dev": true, + "requires": { + "@storybook/addons": "6.5.8", + "@storybook/api": "6.5.8", + "@storybook/channels": "6.5.8", + "@storybook/client-logger": "6.5.8", + "@storybook/components": "6.5.8", + "@storybook/core-events": "6.5.8", + "@storybook/router": "6.5.8", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.7", + "@storybook/theming": "6.5.8", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7", "resolve-from": "^5.0.0" @@ -60965,7 +60969,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -62127,6 +62131,28 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "peer": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "peer": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -62323,13 +62349,6 @@ "esbuild-windows-arm64": "0.14.39" } }, - "esbuild-linux-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.39.tgz", - "integrity": "sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ==", - "dev": true, - "optional": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -63772,36 +63791,36 @@ } }, "firebase": { - "version": "9.8.2", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.8.2.tgz", - "integrity": "sha512-cVPpiR18vsLuGWAAVkVhNO6mYsEgYBqawvMI2zxKo2FCtneyBgMwOyWKI8VyCmL5ze5p5QJTPjkoatM6rZkd0Q==", - "requires": { - "@firebase/analytics": "0.7.9", - "@firebase/analytics-compat": "0.1.10", - "@firebase/app": "0.7.25", - "@firebase/app-check": "0.5.8", - "@firebase/app-check-compat": "0.2.8", - "@firebase/app-compat": "0.1.26", + "version": "9.8.3", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.8.3.tgz", + "integrity": "sha512-PCThy5cFXnbiUtFPJ9vVdcG7wKibOKNR+iuNXf+54xMGJzYb+rM2P8GUqtr2fhVQkfs42uJ6gGKG4soNGkP64w==", + "requires": { + "@firebase/analytics": "0.7.10", + "@firebase/analytics-compat": "0.1.11", + "@firebase/app": "0.7.26", + "@firebase/app-check": "0.5.9", + "@firebase/app-check-compat": "0.2.9", + "@firebase/app-compat": "0.1.27", "@firebase/app-types": "0.7.0", - "@firebase/auth": "0.20.2", - "@firebase/auth-compat": "0.2.15", - "@firebase/database": "0.13.0", - "@firebase/database-compat": "0.2.0", - "@firebase/firestore": "3.4.9", - "@firebase/firestore-compat": "0.1.18", - "@firebase/functions": "0.8.1", - "@firebase/functions-compat": "0.2.1", - "@firebase/installations": "0.5.9", - "@firebase/messaging": "0.9.13", - "@firebase/messaging-compat": "0.1.13", - "@firebase/performance": "0.5.9", - "@firebase/performance-compat": "0.1.9", + "@firebase/auth": "0.20.3", + "@firebase/auth-compat": "0.2.16", + "@firebase/database": "0.13.1", + "@firebase/database-compat": "0.2.1", + "@firebase/firestore": "3.4.10", + "@firebase/firestore-compat": "0.1.19", + "@firebase/functions": "0.8.2", + "@firebase/functions-compat": "0.2.2", + "@firebase/installations": "0.5.10", + "@firebase/messaging": "0.9.14", + "@firebase/messaging-compat": "0.1.14", + "@firebase/performance": "0.5.10", + "@firebase/performance-compat": "0.1.10", "@firebase/polyfill": "0.3.36", - "@firebase/remote-config": "0.3.8", - "@firebase/remote-config-compat": "0.1.9", - "@firebase/storage": "0.9.6", - "@firebase/storage-compat": "0.1.14", - "@firebase/util": "1.6.0" + "@firebase/remote-config": "0.3.9", + "@firebase/remote-config-compat": "0.1.10", + "@firebase/storage": "0.9.7", + "@firebase/storage-compat": "0.1.15", + "@firebase/util": "1.6.1" } }, "flat": { @@ -69462,7 +69481,7 @@ "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dev": true, "optional": true, "requires": { @@ -70403,7 +70422,7 @@ "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "dev": true, "optional": true, "requires": { @@ -72964,8 +72983,7 @@ "prismjs": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", - "dev": true + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" }, "process": { "version": "0.11.10", @@ -76922,7 +76940,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -77274,7 +77292,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "sane": { "version": "4.1.0", @@ -77472,7 +77490,7 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -77481,13 +77499,13 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { "is-number": "^3.0.0", @@ -77552,9 +77570,9 @@ "dev": true }, "sass": { - "version": "1.52.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.2.tgz", - "integrity": "sha512-mfHB2VSeFS7sZlPv9YohB9GB7yWIgQNTGniQwfQ04EoQN0wsQEv7SwpCwy/x48Af+Z3vDeFXz+iuXM3HK/phZQ==", + "version": "1.52.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz", + "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==", "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -77727,7 +77745,7 @@ "serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", "dev": true, "requires": { "etag": "~1.8.1", @@ -77856,7 +77874,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", @@ -79161,9 +79179,9 @@ "dev": true }, "terser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", - "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", + "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -79292,7 +79310,7 @@ "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, "to-fast-properties": { @@ -80632,7 +80650,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "optional": true, "requires": { diff --git a/airbyte-webapp/package.json b/airbyte-webapp/package.json index a19b9075920d55..998e09ffb359bc 100644 --- a/airbyte-webapp/package.json +++ b/airbyte-webapp/package.json @@ -34,6 +34,7 @@ "framer-motion": "^6.3.11", "launchdarkly-js-client-sdk": "^2.22.1", "lodash": "^4.17.21", + "prismjs": "^1.28.0", "query-string": "^6.13.1", "react": "^17.0.2", "react-dom": "^17.0.2", diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index e2271de0f530c3..93b99c6883c8ba 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -1,11 +1,17 @@ +import { highlight, languages } from "prismjs/components/prism-core"; import React, { useState, useEffect, useCallback } from "react"; import { FormattedMessage } from "react-intl"; +import "prismjs/components/prism-clike"; +import "prismjs/components/prism-javascript"; +import "prismjs/themes/prism.css"; +import Editor from "react-simple-code-editor"; import styled from "styled-components"; -import { H5 } from "components"; +import { H5, LoadingButton } from "components"; import ContentCard from "components/ContentCard"; import { ConnectionStateObject } from "core/request/AirbyteClient"; +import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; import { useGetConnectionState } from "hooks/services/useConnectionHook"; type IProps = { @@ -15,8 +21,8 @@ type IProps = { const StateBlockComponent = styled(ContentCard)` margin-top: 12px; padding: 19px 20px 20px; - display: flex; - align-items: center; + // display: flex; + align-items: top; justify-content: space-between; `; @@ -28,25 +34,55 @@ const Text = styled.div` white-space: pre-line; `; -const CodeBox = styled.pre` - display: block; - padding: 10px 30px; - margin: 0; - overflow: scroll; -`; +const codeStyle = { + fontFamily: '"Fira code", "Fira Mono", monospace', + fontSize: 12, + paddingLeft: "10px", + marginBottom: "5px", +}; const StateBlock: React.FC = ({ connectionId }) => { - const [state, setState] = useState(); + const [stateString, setStateString] = useState( + `// ${()}` + ); + const [loading, setLoading] = useState(false); + const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); const { mutateAsync: getState } = useGetConnectionState(); const loadState = async () => { + setLoading(true); const state = await getState(connectionId); - if (state) setState(state.state); + if (state?.state) { + setStateString(formatState(state.state)); + setLoading(false); + } }; + const saveState = useCallback( + () => async () => { + setLoading(true); + setLoading(false); + }, + [] + ); + + const onSaveButtonClick = useCallback(() => { + openConfirmationModal({ + text: `tables.State.confirmModalText`, + title: `tables.State.confirmModalTitle`, + submitButtonText: "form.save", + onSubmit: async () => { + await saveState(); + closeConfirmationModal(); + }, + submitButtonDataId: "state", + }); + }, [closeConfirmationModal, saveState, openConfirmationModal]); + const loadStateMemoized = useCallback(() => { loadState(); - }, [connectionId]); + // eslint-disable-next-line + }, []); useEffect(() => { loadStateMemoized(); @@ -58,11 +94,19 @@ const StateBlock: React.FC = ({ connectionId }) => {
- . - .
- . + . . - {state ? formatState(state) : } + setStateString(code)} + highlight={(code) => highlight(code, languages.js)} + padding={10} + contentEditable={!loading} + style={codeStyle} + /> + + + ); }; diff --git a/airbyte-webapp/src/components/StateBlock/prismjs.d.ts b/airbyte-webapp/src/components/StateBlock/prismjs.d.ts new file mode 100644 index 00000000000000..26eccf06774eae --- /dev/null +++ b/airbyte-webapp/src/components/StateBlock/prismjs.d.ts @@ -0,0 +1,8 @@ +/** + * using the @types/prismjs does not fix the following warning: + * + * TS7016: Could not find a declaration file for module 'prismjs/components/prism-core'. '/Users/evan/workspace/airbyte/airbyte/airbyte-webapp/node_modules/prismjs/components/prism-core.js' implicitly has an 'any' type. + * Try `npm i --save-dev @types/prismjs` if it exists or add a new declaration (.d.ts) file containing `declare module 'prismjs/components/prism-core';` + */ + +declare module "prismjs/components/prism-core"; diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 5ce80887a4706b..0a6697099b23d9 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -55,6 +55,7 @@ "form.canceling": "Canceling", "form.submit": "Submit", "form.delete": "Delete", + "form.save": "Save", "form.change": "Change", "form.add": "Add", "form.saveChanges": "Save changes", @@ -402,7 +403,10 @@ "tables.State.title": "Connection State", "tables.State.p1": "The connection's current state", "tables.State.p2": "Airbyte does not store historic connection state", + "tables.State.confirmModalTitle": "Update connection State?", + "tables.State.confirmModalText": "Be extremely careful when modifying state - mistakes can lead to unrecoverable syncs", "tables.State.stateLoading": "Loading Connection State", + "tables.State.save": "Save connection state", "admin.destinations": "Destinations", "admin.sources": "Sources", From d9a4fc5d307558ac73641653ad11bf2979b02075 Mon Sep 17 00:00:00 2001 From: evantahler Date: Wed, 1 Jun 2022 17:04:30 -0700 Subject: [PATCH 04/20] setState API --- airbyte-api/src/main/openapi/config.yaml | 33 +++++++++ .../airbyte/server/apis/ConfigurationApi.java | 6 ++ .../server/handlers/SchedulerHandler.java | 13 ++++ .../src/components/StateBlock/StateBlock.tsx | 21 +++--- .../domain/connection/ConnectionService.ts | 13 +++- .../src/core/request/AirbyteClient.ts | 64 +++++++++++------ .../src/hooks/services/useConnectionHook.tsx | 12 +++- .../api/generated-api-html/index.html | 68 +++++++++++++++++++ 8 files changed, 199 insertions(+), 31 deletions(-) diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index 426e93e630544d..e58d6d45ec48cf 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -1402,6 +1402,29 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" + /v1/state/set: + post: + tags: + - connection + summary: Set the current state for a connection. + operationId: setState + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ConnectionUpdateStateBody" + required: true + responses: + "200": + description: Successful operation + content: + application/json: + schema: + $ref: "#/components/schemas/ConnectionState" + "404": + $ref: "#/components/responses/NotFoundResponse" + "422": + $ref: "#/components/responses/InvalidInputResponse" /v1/connections/search: post: tags: @@ -3263,6 +3286,16 @@ components: sourceCatalogId: type: string format: uuid + ConnectionUpdateStateBody: + type: object + required: + - connectionId + - state + properties: + connectionId: + $ref: "#/components/schemas/ConnectionId" + state: + $ref: "#/components/schemas/ConnectionStateObject" ConnectionRead: type: object required: diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java index 0da999eed61c3d..50cef6be941883 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java @@ -16,6 +16,7 @@ import io.airbyte.api.model.generated.ConnectionSearch; import io.airbyte.api.model.generated.ConnectionState; import io.airbyte.api.model.generated.ConnectionUpdate; +import io.airbyte.api.model.generated.ConnectionUpdateStateBody; import io.airbyte.api.model.generated.CustomDestinationDefinitionCreate; import io.airbyte.api.model.generated.CustomDestinationDefinitionUpdate; import io.airbyte.api.model.generated.CustomSourceDefinitionCreate; @@ -727,6 +728,11 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques return execute(() -> schedulerHandler.getState(connectionIdRequestBody)); } + @Override + public ConnectionState setState(final ConnectionUpdateStateBody connectionUpdateStateBody) { + return execute(() -> schedulerHandler.setState(connectionUpdateStateBody)); + } + // SCHEDULER @Override public CheckConnectionRead executeSourceCheckConnection(final SourceCoreConfig sourceConfig) { diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index 16250c869c23f0..2feaf7cefccab6 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -14,6 +14,7 @@ import io.airbyte.api.model.generated.CheckConnectionRead.StatusEnum; import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; +import io.airbyte.api.model.generated.ConnectionUpdateStateBody; import io.airbyte.api.model.generated.DestinationCoreConfig; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionSpecificationRead; @@ -333,6 +334,18 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques return connectionState; } + public ConnectionState setState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { + final JsonNode jsonState = Jsons.jsonNode(connectionUpdateStateBody.getState()); + final State state = new State(); + state.setState(jsonState); + configRepository.updateConnectionState(connectionUpdateStateBody.getConnectionId(), state); + final Optional newState = configRepository.getConnectionState(connectionUpdateStateBody.getConnectionId()); + final ConnectionState connectionState = new ConnectionState().connectionId(connectionUpdateStateBody.getConnectionId()); + newState.ifPresent(s -> connectionState.state(s.getState())); + return connectionState; + } + + // todo (cgardens) - this method needs a test. public JobInfoRead cancelJob(final JobIdRequestBody jobIdRequestBody) throws IOException { return submitCancellationToWorker(jobIdRequestBody.getId()); } diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 93b99c6883c8ba..301254b25d2492 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -10,9 +10,9 @@ import styled from "styled-components"; import { H5, LoadingButton } from "components"; import ContentCard from "components/ContentCard"; -import { ConnectionStateObject } from "core/request/AirbyteClient"; +import { ConnectionState, ConnectionStateObject } from "core/request/AirbyteClient"; import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; -import { useGetConnectionState } from "hooks/services/useConnectionHook"; +import { useGetConnectionState, useSetConnectionState } from "hooks/services/useConnectionHook"; type IProps = { connectionId: string; @@ -48,6 +48,7 @@ const StateBlock: React.FC = ({ connectionId }) => { const [loading, setLoading] = useState(false); const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); const { mutateAsync: getState } = useGetConnectionState(); + const { mutateAsync: setState } = useSetConnectionState(); const loadState = async () => { setLoading(true); @@ -58,13 +59,15 @@ const StateBlock: React.FC = ({ connectionId }) => { } }; - const saveState = useCallback( - () => async () => { - setLoading(true); + const saveState = async () => { + setLoading(true); + const stateObject = JSON.parse(stateString) as ConnectionState; + const newState = await setState({ connectionId, state: stateObject }); + if (newState?.state) { + setStateString(formatState(newState.state)); setLoading(false); - }, - [] - ); + } + }; const onSaveButtonClick = useCallback(() => { openConfirmationModal({ @@ -101,7 +104,7 @@ const StateBlock: React.FC = ({ connectionId }) => { onValueChange={(code) => setStateString(code)} highlight={(code) => highlight(code, languages.js)} padding={10} - contentEditable={!loading} + disabled={loading} style={codeStyle} /> diff --git a/airbyte-webapp/src/core/domain/connection/ConnectionService.ts b/airbyte-webapp/src/core/domain/connection/ConnectionService.ts index a4616be27e5697..9cf559e5875d7a 100644 --- a/airbyte-webapp/src/core/domain/connection/ConnectionService.ts +++ b/airbyte-webapp/src/core/domain/connection/ConnectionService.ts @@ -1,4 +1,11 @@ -import { deleteConnection, resetConnection, syncConnection, getState } from "../../request/AirbyteClient"; +import { + deleteConnection, + resetConnection, + syncConnection, + getState, + setState, + ConnectionState, +} from "../../request/AirbyteClient"; import { AirbyteRequestService } from "../../request/AirbyteRequestService"; export class ConnectionService extends AirbyteRequestService { @@ -17,4 +24,8 @@ export class ConnectionService extends AirbyteRequestService { public getState(connectionId: string) { return getState({ connectionId }, this.requestOptions); } + + public setState(connectionId: string, state: ConnectionState) { + return setState({ connectionId, state }, this.requestOptions); + } } diff --git a/airbyte-webapp/src/core/request/AirbyteClient.ts b/airbyte-webapp/src/core/request/AirbyteClient.ts index b066780f316fc6..883bdc63c6d63e 100644 --- a/airbyte-webapp/src/core/request/AirbyteClient.ts +++ b/airbyte-webapp/src/core/request/AirbyteClient.ts @@ -587,14 +587,6 @@ export const JobConfigType = { reset_connection: "reset_connection", } as const; -export interface JobListRequestBody { - configTypes: JobConfigType[]; - configId: string; - pagination?: Pagination; -} - -export type JobId = number; - export interface JobDebugRead { id: JobId; configType: JobConfigType; @@ -605,6 +597,14 @@ export interface JobDebugRead { destinationDefinition: DestinationDefinitionRead; } +export interface JobListRequestBody { + configTypes: JobConfigType[]; + configId: string; + pagination?: Pagination; +} + +export type JobId = number; + export interface JobRead { id: JobId; configType: JobConfigType; @@ -753,20 +753,27 @@ export interface OperationReadList { operations: OperationRead[]; } -export interface OperationCreate { +export interface WebBackendOperationCreateOrUpdate { + operationId?: OperationId; workspaceId: WorkspaceId; name: string; operatorConfiguration: OperatorConfiguration; } -export type OperationId = string; - export interface OperationUpdate { operationId: OperationId; name: string; operatorConfiguration: OperatorConfiguration; } +export interface OperationCreate { + workspaceId: WorkspaceId; + name: string; + operatorConfiguration: OperatorConfiguration; +} + +export type OperationId = string; + export interface OperationIdRequestBody { operationId: OperationId; } @@ -880,7 +887,7 @@ export interface DbMigrationRequestBody { export type ConnectionId = string; -export interface ConnectionSearch { +export interface WebBackendConnectionSearch { connectionId?: ConnectionId; name?: string; namespaceDefinition?: NamespaceDefinitionType; @@ -896,6 +903,11 @@ export interface ConnectionSearch { destination?: DestinationSearch; } +export interface ConnectionUpdateStateBody { + connectionId: ConnectionId; + state: ConnectionState; +} + export interface ConnectionUpdate { connectionId: ConnectionId; namespaceDefinition?: NamespaceDefinitionType; @@ -979,7 +991,7 @@ export interface DestinationCoreConfig { export type DestinationId = string; -export interface WebBackendConnectionSearch { +export interface ConnectionSearch { connectionId?: ConnectionId; name?: string; namespaceDefinition?: NamespaceDefinitionType; @@ -1370,13 +1382,6 @@ export type CustomerId = string; export type WorkspaceId = string; -export interface WebBackendOperationCreateOrUpdate { - operationId?: OperationId; - workspaceId: WorkspaceId; - name: string; - operatorConfiguration: OperatorConfiguration; -} - export interface SourceSearch { sourceDefinitionId?: SourceDefinitionId; sourceId?: SourceId; @@ -2452,6 +2457,24 @@ export const getState = ( ); }; +/** + * @summary Set the current state for a connection. + */ +export const setState = ( + connectionUpdateStateBody: ConnectionUpdateStateBody, + options?: SecondParameter +) => { + return apiOverride( + { + url: `/v1/state/set`, + method: "post", + headers: { "Content-Type": "application/json" }, + data: connectionUpdateStateBody, + }, + options + ); +}; + /** * @summary Search connections */ @@ -3209,6 +3232,7 @@ export type ListAllConnectionsForWorkspaceResult = NonNullable< >; export type GetConnectionResult = NonNullable>>; export type GetStateResult = NonNullable>>; +export type SetStateResult = NonNullable>>; export type SearchConnectionsResult = NonNullable>>; export type DeleteConnectionResult = NonNullable>>; export type SyncConnectionResult = NonNullable>>; diff --git a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx index e1f69a5029d227..baf138e4bbd3b8 100644 --- a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx +++ b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx @@ -10,6 +10,7 @@ import { useInitService } from "services/useInitService"; import { useConfig } from "../../config"; import { ConnectionSchedule, + ConnectionState, DestinationRead, NamespaceDefinitionType, OperationCreate, @@ -221,12 +222,21 @@ const useGetConnectionState = () => { return useMutation((connectionId: string) => service.getState(connectionId)); }; +const useSetConnectionState = () => { + const service = useConnectionService(); + + return useMutation(({ connectionId, state }: { connectionId: string; state: ConnectionState }) => + service.setState(connectionId, state) + ); +}; + export { useConnectionList, useGetConnection, - useGetConnectionState, useUpdateConnection, useCreateConnection, useDeleteConnection, invalidateConnectionsList, + useGetConnectionState, + useSetConnectionState, }; diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index 25fcbf39088398..a98ed13dd7b659 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -229,6 +229,7 @@

Connection

  • post /v1/connections/list
  • post /v1/connections/reset
  • post /v1/connections/search
  • +
  • post /v1/state/set
  • post /v1/connections/sync
  • post /v1/connections/update
  • @@ -1350,6 +1351,64 @@

    422

    InvalidInputExceptionInfo
    +
    +
    + Up +
    post /v1/state/set
    +
    Set the current state for a connection. (setState)
    +
    + + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • application/json
    • +
    + +

    Request body

    +
    +
    ConnectionUpdateStateBody ConnectionUpdateStateBody (required)
    + +
    Body Parameter
    + +
    + + + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "connectionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
    +}
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Successful operation + ConnectionState +

    404

    + Object with given id was not found. + NotFoundKnownExceptionInfo +

    422

    + Input failed validation + InvalidInputExceptionInfo +
    +
    +
    +

    ConnectionUpdateStateBody - Up

    +
    +
    +
    connectionId
    UUID format: uuid
    +
    state
    +
    +

    CustomDestinationDefinitionCreate - Up

    From e45985f0d703bef6cde1363703a649a57c5bb617 Mon Sep 17 00:00:00 2001 From: evantahler Date: Wed, 1 Jun 2022 17:46:16 -0700 Subject: [PATCH 05/20] Input validation --- .../src/components/StateBlock/StateBlock.tsx | 67 ++++++++++++++++--- airbyte-webapp/src/locales/en.json | 3 +- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 301254b25d2492..6677b92085bff9 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -34,18 +34,31 @@ const Text = styled.div` white-space: pre-line; `; +const ErrorText = styled.div` + margin-left: 20px; + font-size: 11px; + line-height: 13px; + color: ${({ theme }) => theme.redColor}; + white-space: pre-line; +`; + const codeStyle = { fontFamily: '"Fira code", "Fira Mono", monospace', fontSize: 12, - paddingLeft: "10px", + marginTop: "5px", + marginLeft: "10px", marginBottom: "5px", }; +type Validation = { + valid: boolean; + message?: string; +}; + const StateBlock: React.FC = ({ connectionId }) => { - const [stateString, setStateString] = useState( - `// ${()}` - ); + const [stateString, setStateString] = useState(`// ...`); const [loading, setLoading] = useState(false); + const [validation, setValidation] = useState({ valid: true }); const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); const { mutateAsync: getState } = useGetConnectionState(); const { mutateAsync: setState } = useSetConnectionState(); @@ -70,6 +83,10 @@ const StateBlock: React.FC = ({ connectionId }) => { }; const onSaveButtonClick = useCallback(() => { + const validationResponse = validateState(stateString); + setValidation(validationResponse); + if (!validationResponse.valid) return; + openConfirmationModal({ text: `tables.State.confirmModalText`, title: `tables.State.confirmModalTitle`, @@ -101,19 +118,51 @@ const StateBlock: React.FC = ({ connectionId }) => { setStateString(code)} + onValueChange={(code) => { + if (!validation.valid) setValidation({ valid: true }); + setStateString(code); + }} highlight={(code) => highlight(code, languages.js)} padding={10} disabled={loading} style={codeStyle} /> - - - + {validation.valid === false && {validation.message}} +
    + + + +
    ); }; -const formatState = (state: ConnectionStateObject) => JSON.stringify(state, null, 2); +const formatState = (state: ConnectionStateObject) => JSON.stringify(state, null, 4); + +/** + * There isn't much in the way of validation we can do other than: + * 1. (TODO) ensuring that the original properties are still present + * 2. (TODO) ensuring that there are no additional properties + * 3. Checking that we have valid JSON + */ +const validateState: (state: string) => Validation = (state) => { + let valid = true; + let message: string | undefined; + + try { + JSON.parse(state); + } catch (e) { + valid = false; + message = "Invalid json"; + } + + return { valid, message: `Error: ${message}` }; +}; export default StateBlock; diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 0a6697099b23d9..bef2d7042ab46b 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -404,8 +404,7 @@ "tables.State.p1": "The connection's current state", "tables.State.p2": "Airbyte does not store historic connection state", "tables.State.confirmModalTitle": "Update connection State?", - "tables.State.confirmModalText": "Be extremely careful when modifying state - mistakes can lead to unrecoverable syncs", - "tables.State.stateLoading": "Loading Connection State", + "tables.State.confirmModalText": "Be extremely careful when modifying state - mistakes can lead to unrecoverable syncs!", "tables.State.save": "Save connection state", "admin.destinations": "Destinations", From 1939669c0837bdb935f69536e741291fdef5e290 Mon Sep 17 00:00:00 2001 From: evantahler Date: Wed, 1 Jun 2022 17:49:59 -0700 Subject: [PATCH 06/20] remove JSON step --- .../main/java/io/airbyte/server/handlers/SchedulerHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index 2feaf7cefccab6..e686345f504df8 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -335,9 +335,8 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques } public ConnectionState setState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { - final JsonNode jsonState = Jsons.jsonNode(connectionUpdateStateBody.getState()); final State state = new State(); - state.setState(jsonState); + state.setState(connectionUpdateStateBody.getState()); configRepository.updateConnectionState(connectionUpdateStateBody.getConnectionId(), state); final Optional newState = configRepository.getConnectionState(connectionUpdateStateBody.getConnectionId()); final ConnectionState connectionState = new ConnectionState().connectionId(connectionUpdateStateBody.getConnectionId()); From ab66ec0c97eb02424c32ea967cd5c2002e4c4e0f Mon Sep 17 00:00:00 2001 From: evantahler Date: Thu, 2 Jun 2022 16:45:17 -0700 Subject: [PATCH 07/20] rename apiMethod to `updateState` --- airbyte-api/src/main/openapi/config.yaml | 2 +- .../airbyte/server/apis/ConfigurationApi.java | 4 +- .../server/handlers/SchedulerHandler.java | 2 +- .../src/components/StateBlock/StateBlock.tsx | 6 +- .../domain/connection/ConnectionService.ts | 6 +- .../src/core/request/AirbyteClient.ts | 6 +- .../src/hooks/services/useConnectionHook.tsx | 6 +- .../api/generated-api-html/index.html | 118 +++++++++--------- 8 files changed, 75 insertions(+), 75 deletions(-) diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index e58d6d45ec48cf..75436d3ad2a21a 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -1407,7 +1407,7 @@ paths: tags: - connection summary: Set the current state for a connection. - operationId: setState + operationId: updateState requestBody: content: application/json: diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java index 50cef6be941883..04615fe850609b 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java @@ -729,8 +729,8 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques } @Override - public ConnectionState setState(final ConnectionUpdateStateBody connectionUpdateStateBody) { - return execute(() -> schedulerHandler.setState(connectionUpdateStateBody)); + public ConnectionState updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) { + return execute(() -> schedulerHandler.updateState(connectionUpdateStateBody)); } // SCHEDULER diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index e686345f504df8..84f4e2e264964b 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -334,7 +334,7 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques return connectionState; } - public ConnectionState setState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { + public ConnectionState updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { final State state = new State(); state.setState(connectionUpdateStateBody.getState()); configRepository.updateConnectionState(connectionUpdateStateBody.getConnectionId(), state); diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 6677b92085bff9..0438b1ba2784a7 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -12,7 +12,7 @@ import ContentCard from "components/ContentCard"; import { ConnectionState, ConnectionStateObject } from "core/request/AirbyteClient"; import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; -import { useGetConnectionState, useSetConnectionState } from "hooks/services/useConnectionHook"; +import { useGetConnectionState, useUpdateConnectionState } from "hooks/services/useConnectionHook"; type IProps = { connectionId: string; @@ -61,7 +61,7 @@ const StateBlock: React.FC = ({ connectionId }) => { const [validation, setValidation] = useState({ valid: true }); const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); const { mutateAsync: getState } = useGetConnectionState(); - const { mutateAsync: setState } = useSetConnectionState(); + const { mutateAsync: updateState } = useUpdateConnectionState(); const loadState = async () => { setLoading(true); @@ -75,7 +75,7 @@ const StateBlock: React.FC = ({ connectionId }) => { const saveState = async () => { setLoading(true); const stateObject = JSON.parse(stateString) as ConnectionState; - const newState = await setState({ connectionId, state: stateObject }); + const newState = await updateState({ connectionId, state: stateObject }); if (newState?.state) { setStateString(formatState(newState.state)); setLoading(false); diff --git a/airbyte-webapp/src/core/domain/connection/ConnectionService.ts b/airbyte-webapp/src/core/domain/connection/ConnectionService.ts index 9cf559e5875d7a..7bda6d0375874f 100644 --- a/airbyte-webapp/src/core/domain/connection/ConnectionService.ts +++ b/airbyte-webapp/src/core/domain/connection/ConnectionService.ts @@ -3,7 +3,7 @@ import { resetConnection, syncConnection, getState, - setState, + updateState, ConnectionState, } from "../../request/AirbyteClient"; import { AirbyteRequestService } from "../../request/AirbyteRequestService"; @@ -25,7 +25,7 @@ export class ConnectionService extends AirbyteRequestService { return getState({ connectionId }, this.requestOptions); } - public setState(connectionId: string, state: ConnectionState) { - return setState({ connectionId, state }, this.requestOptions); + public updateState(connectionId: string, state: ConnectionState) { + return updateState({ connectionId, state }, this.requestOptions); } } diff --git a/airbyte-webapp/src/core/request/AirbyteClient.ts b/airbyte-webapp/src/core/request/AirbyteClient.ts index 883bdc63c6d63e..b6878abcc330cd 100644 --- a/airbyte-webapp/src/core/request/AirbyteClient.ts +++ b/airbyte-webapp/src/core/request/AirbyteClient.ts @@ -905,7 +905,7 @@ export interface WebBackendConnectionSearch { export interface ConnectionUpdateStateBody { connectionId: ConnectionId; - state: ConnectionState; + state: ConnectionStateObject; } export interface ConnectionUpdate { @@ -2460,7 +2460,7 @@ export const getState = ( /** * @summary Set the current state for a connection. */ -export const setState = ( +export const updateState = ( connectionUpdateStateBody: ConnectionUpdateStateBody, options?: SecondParameter ) => { @@ -3232,7 +3232,7 @@ export type ListAllConnectionsForWorkspaceResult = NonNullable< >; export type GetConnectionResult = NonNullable>>; export type GetStateResult = NonNullable>>; -export type SetStateResult = NonNullable>>; +export type UpdateStateResult = NonNullable>>; export type SearchConnectionsResult = NonNullable>>; export type DeleteConnectionResult = NonNullable>>; export type SyncConnectionResult = NonNullable>>; diff --git a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx index baf138e4bbd3b8..9b65fb4735ee79 100644 --- a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx +++ b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx @@ -222,11 +222,11 @@ const useGetConnectionState = () => { return useMutation((connectionId: string) => service.getState(connectionId)); }; -const useSetConnectionState = () => { +const useUpdateConnectionState = () => { const service = useConnectionService(); return useMutation(({ connectionId, state }: { connectionId: string; state: ConnectionState }) => - service.setState(connectionId, state) + service.updateState(connectionId, state) ); }; @@ -238,5 +238,5 @@ export { useDeleteConnection, invalidateConnectionsList, useGetConnectionState, - useSetConnectionState, + useUpdateConnectionState, }; diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index a98ed13dd7b659..5a612ab88ffc06 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -229,9 +229,9 @@

    Connection

  • post /v1/connections/list
  • post /v1/connections/reset
  • post /v1/connections/search
  • -
  • post /v1/state/set
  • post /v1/connections/sync
  • post /v1/connections/update
  • +
  • post /v1/state/set
  • DbMigration


    -
    -
    - Up -
    post /v1/state/set
    -
    Set the current state for a connection. (setState)
    -
    - - -

    Consumes

    - This API call consumes the following media types via the Content-Type request header: -
      -
    • application/json
    • -
    - -

    Request body

    -
    -
    ConnectionUpdateStateBody ConnectionUpdateStateBody (required)
    - -
    Body Parameter
    - -
    - - - - -

    Return type

    - - - - -

    Example data

    -
    Content-Type: application/json
    -
    {
    -  "connectionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
    -}
    - -

    Produces

    - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
      -
    • application/json
    • -
    - -

    Responses

    -

    200

    - Successful operation - ConnectionState -

    404

    - Object with given id was not found. - NotFoundKnownExceptionInfo -

    422

    - Input failed validation - InvalidInputExceptionInfo -
    -
    Up @@ -1680,6 +1622,64 @@

    422

    InvalidInputExceptionInfo

    +
    +
    + Up +
    post /v1/state/set
    +
    Set the current state for a connection. (updateState)
    +
    + + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • application/json
    • +
    + +

    Request body

    +
    +
    ConnectionUpdateStateBody ConnectionUpdateStateBody (required)
    + +
    Body Parameter
    + +
    + + + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "connectionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
    +}
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Successful operation + ConnectionState +

    404

    + Object with given id was not found. + NotFoundKnownExceptionInfo +

    422

    + Input failed validation + InvalidInputExceptionInfo +
    +

    DbMigration

    From 78e66dd7c6d29b4d4a9e4d3ae33406707fa47622 Mon Sep 17 00:00:00 2001 From: evantahler Date: Thu, 2 Jun 2022 17:17:16 -0700 Subject: [PATCH 08/20] test and adjust route --- airbyte-api/src/main/openapi/config.yaml | 2 +- .../server/handlers/SchedulerHandler.java | 29 ++++++++++--------- .../server/handlers/SchedulerHandlerTest.java | 13 +++++++++ .../src/core/request/AirbyteClient.ts | 2 +- .../api/generated-api-html/index.html | 4 +-- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index 75436d3ad2a21a..52a3b6cb9b67db 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -1402,7 +1402,7 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" - /v1/state/set: + /v1/state/update: post: tags: - connection diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index 84f4e2e264964b..a20607cd7899b4 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -323,25 +323,16 @@ public JobInfoRead resetConnection(final ConnectionIdRequestBody connectionIdReq } public ConnectionState getState(final ConnectionIdRequestBody connectionIdRequestBody) throws IOException { - final Optional currentState = configRepository.getConnectionState(connectionIdRequestBody.getConnectionId()); - LOGGER.info("currentState server: {}", currentState); - - final ConnectionState connectionState = new ConnectionState() - .connectionId(connectionIdRequestBody.getConnectionId()); - - currentState.ifPresent(state -> connectionState.state(state.getState())); - - return connectionState; + final UUID connectionId = connectionIdRequestBody.getConnectionId(); + return getStateFromConnectionUUID(connectionId); } public ConnectionState updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { + final UUID connectionId = connectionUpdateStateBody.getConnectionId(); final State state = new State(); state.setState(connectionUpdateStateBody.getState()); - configRepository.updateConnectionState(connectionUpdateStateBody.getConnectionId(), state); - final Optional newState = configRepository.getConnectionState(connectionUpdateStateBody.getConnectionId()); - final ConnectionState connectionState = new ConnectionState().connectionId(connectionUpdateStateBody.getConnectionId()); - newState.ifPresent(s -> connectionState.state(s.getState())); - return connectionState; + configRepository.updateConnectionState(connectionId, state); + return getStateFromConnectionUUID(connectionId); } // todo (cgardens) - this method needs a test. @@ -412,4 +403,14 @@ private JobInfoRead readJobFromResult(final ManualOperationResult manualOperatio return jobConverter.getJobInfoRead(job); } + private ConnectionState getStateFromConnectionUUID(final UUID connectionId) throws IOException { + final Optional currentState = configRepository.getConnectionState(connectionId); + LOGGER.info("currentState server: {}", currentState); + + final ConnectionState connectionState = new ConnectionState().connectionId(connectionId); + + currentState.ifPresent(state -> connectionState.state(state.getState())); + return connectionState; + } + } diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java index 4e2180b7965bee..0ceadec1df791a 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java @@ -19,10 +19,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap; import io.airbyte.api.model.generated.CheckConnectionRead; import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; +import io.airbyte.api.model.generated.ConnectionUpdateStateBody; import io.airbyte.api.model.generated.DestinationCoreConfig; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionSpecificationRead; @@ -574,6 +576,17 @@ void testGetCurrentStateEmpty() throws IOException { assertEquals(new ConnectionState().connectionId(connectionId), connectionState); } + @Test + void testUpdateState() throws IOException { + final UUID connectionId = UUID.randomUUID(); + final JsonNode json = Jsons.jsonNode(ImmutableMap.of("checkpoint", 1)); + final State state = new State().withState(json); + when(configRepository.getConnectionState(connectionId)).thenReturn(Optional.of(state)); + + final ConnectionState connectionState = schedulerHandler.updateState(new ConnectionUpdateStateBody().connectionId(connectionId).state(json)); + assertEquals(new ConnectionState().connectionId(connectionId).state(state.getState()), connectionState); + } + @Test void testEnumConversion() { assertTrue(Enums.isCompatible(StandardCheckConnectionOutput.Status.class, CheckConnectionRead.StatusEnum.class)); diff --git a/airbyte-webapp/src/core/request/AirbyteClient.ts b/airbyte-webapp/src/core/request/AirbyteClient.ts index b6878abcc330cd..b7e2011e10b764 100644 --- a/airbyte-webapp/src/core/request/AirbyteClient.ts +++ b/airbyte-webapp/src/core/request/AirbyteClient.ts @@ -2466,7 +2466,7 @@ export const updateState = ( ) => { return apiOverride( { - url: `/v1/state/set`, + url: `/v1/state/update`, method: "post", headers: { "Content-Type": "application/json" }, data: connectionUpdateStateBody, diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index 5a612ab88ffc06..bb83c0f2533db7 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -231,7 +231,7 @@

    Connection

  • post /v1/connections/search
  • post /v1/connections/sync
  • post /v1/connections/update
  • -
  • post /v1/state/set
  • +
  • post /v1/state/update
  • DbMigration

      @@ -1625,7 +1625,7 @@

      422

      Up -
      post /v1/state/set
      +
      post /v1/state/update
      Set the current state for a connection. (updateState)
      From 405bcf58b511c997f4365f29260ce73a1f6ef6a9 Mon Sep 17 00:00:00 2001 From: evantahler Date: Thu, 2 Jun 2022 18:04:01 -0700 Subject: [PATCH 09/20] skip if sync is running --- .../server/handlers/SchedulerHandler.java | 21 ++++++++++++++++--- .../src/components/StateBlock/StateBlock.tsx | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index a20607cd7899b4..0e6204b235e566 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -67,8 +67,12 @@ import io.airbyte.workers.temporal.TemporalClient.ManualOperationResult; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -329,9 +333,20 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques public ConnectionState updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { final UUID connectionId = connectionUpdateStateBody.getConnectionId(); - final State state = new State(); - state.setState(connectionUpdateStateBody.getState()); - configRepository.updateConnectionState(connectionId, state); + final Set configTypes = new HashSet(); + configTypes.add(ConfigType.SYNC); + final List runningJobs = jobPersistence.listJobs(configTypes, connectionId.toString(), 2, 0) + .stream().filter(j -> !j.isJobInTerminalState()) + .collect(Collectors.toList()); + System.out.println(runningJobs); + + // TODO: Ideally we would throw or return a message to the user here that the update was ignored because a sync was running + if (runningJobs.size() == 0) { + final State state = new State(); + state.setState(connectionUpdateStateBody.getState()); + configRepository.updateConnectionState(connectionId, state); + } + return getStateFromConnectionUUID(connectionId); } diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 0438b1ba2784a7..3ba2ae4fc508f4 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -97,6 +97,7 @@ const StateBlock: React.FC = ({ connectionId }) => { }, submitButtonDataId: "state", }); + // eslint-disable-next-line }, [closeConfirmationModal, saveState, openConfirmationModal]); const loadStateMemoized = useCallback(() => { From f17201b80cfa21798ed4deb67d98c0e5f6d65d77 Mon Sep 17 00:00:00 2001 From: evantahler Date: Fri, 3 Jun 2022 14:14:23 -0700 Subject: [PATCH 10/20] prevent state update when sync is running --- airbyte-api/src/main/openapi/config.yaml | 17 +- .../airbyte/server/apis/ConfigurationApi.java | 3 +- .../server/handlers/SchedulerHandler.java | 17 +- .../server/handlers/SchedulerHandlerTest.java | 9 +- .../src/components/StateBlock/StateBlock.tsx | 13 +- .../src/core/request/AirbyteClient.ts | 221 +++++++++--------- .../api/generated-api-html/index.html | 19 +- 7 files changed, 177 insertions(+), 122 deletions(-) diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index 52a3b6cb9b67db..6d3bac8383e7c3 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -1420,7 +1420,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/ConnectionState" + $ref: "#/components/schemas/ConnectionUpdateStateResponse" "404": $ref: "#/components/responses/NotFoundResponse" "422": @@ -4020,6 +4020,21 @@ components: $ref: "#/components/schemas/ConnectionId" state: $ref: "#/components/schemas/ConnectionStateObject" + ConnectionUpdateStateResponse: + type: object + required: + - connectionId + - successful + - state + properties: + connectionId: + $ref: "#/components/schemas/ConnectionId" + state: + $ref: "#/components/schemas/ConnectionStateObject" + successful: + type: boolean + errorMessage: + type: string ConnectionStateObject: type: object ActorDefinitionResourceRequirements: diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java index 04615fe850609b..b2228e13c259d1 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java @@ -17,6 +17,7 @@ import io.airbyte.api.model.generated.ConnectionState; import io.airbyte.api.model.generated.ConnectionUpdate; import io.airbyte.api.model.generated.ConnectionUpdateStateBody; +import io.airbyte.api.model.generated.ConnectionUpdateStateResponse; import io.airbyte.api.model.generated.CustomDestinationDefinitionCreate; import io.airbyte.api.model.generated.CustomDestinationDefinitionUpdate; import io.airbyte.api.model.generated.CustomSourceDefinitionCreate; @@ -729,7 +730,7 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques } @Override - public ConnectionState updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) { + public ConnectionUpdateStateResponse updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) { return execute(() -> schedulerHandler.updateState(connectionUpdateStateBody)); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index 0e6204b235e566..1c2ca11fd1df9f 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -15,6 +15,7 @@ import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; import io.airbyte.api.model.generated.ConnectionUpdateStateBody; +import io.airbyte.api.model.generated.ConnectionUpdateStateResponse; import io.airbyte.api.model.generated.DestinationCoreConfig; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionSpecificationRead; @@ -331,23 +332,31 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques return getStateFromConnectionUUID(connectionId); } - public ConnectionState updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { + public ConnectionUpdateStateResponse updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { + String errorMessage = null; + Boolean successful = false; final UUID connectionId = connectionUpdateStateBody.getConnectionId(); final Set configTypes = new HashSet(); configTypes.add(ConfigType.SYNC); final List runningJobs = jobPersistence.listJobs(configTypes, connectionId.toString(), 2, 0) .stream().filter(j -> !j.isJobInTerminalState()) .collect(Collectors.toList()); - System.out.println(runningJobs); - // TODO: Ideally we would throw or return a message to the user here that the update was ignored because a sync was running if (runningJobs.size() == 0) { final State state = new State(); state.setState(connectionUpdateStateBody.getState()); configRepository.updateConnectionState(connectionId, state); + successful = true; + } else { + errorMessage = "Sync is running"; } - return getStateFromConnectionUUID(connectionId); + final ConnectionUpdateStateResponse response = new ConnectionUpdateStateResponse(); + response.setState(getStateFromConnectionUUID(connectionId).getState()); + response.setConnectionId(connectionId); + response.setErrorMessage(errorMessage); + response.setSuccessful(successful); + return response; } // todo (cgardens) - this method needs a test. diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java index 0ceadec1df791a..e23748abc3ea94 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java @@ -25,6 +25,7 @@ import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; import io.airbyte.api.model.generated.ConnectionUpdateStateBody; +import io.airbyte.api.model.generated.ConnectionUpdateStateResponse; import io.airbyte.api.model.generated.DestinationCoreConfig; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionSpecificationRead; @@ -583,8 +584,12 @@ void testUpdateState() throws IOException { final State state = new State().withState(json); when(configRepository.getConnectionState(connectionId)).thenReturn(Optional.of(state)); - final ConnectionState connectionState = schedulerHandler.updateState(new ConnectionUpdateStateBody().connectionId(connectionId).state(json)); - assertEquals(new ConnectionState().connectionId(connectionId).state(state.getState()), connectionState); + final ConnectionUpdateStateResponse connectionStateResponse = + schedulerHandler.updateState(new ConnectionUpdateStateBody().connectionId(connectionId).state(json)); + assertEquals(connectionStateResponse.getState(), state.getState()); + assertEquals(connectionStateResponse.getConnectionId(), connectionId); + assertEquals(connectionStateResponse.getSuccessful(), true); + assertEquals(connectionStateResponse.getErrorMessage(), null); } @Test diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 3ba2ae4fc508f4..88101fd7432d28 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -75,11 +75,16 @@ const StateBlock: React.FC = ({ connectionId }) => { const saveState = async () => { setLoading(true); const stateObject = JSON.parse(stateString) as ConnectionState; - const newState = await updateState({ connectionId, state: stateObject }); - if (newState?.state) { - setStateString(formatState(newState.state)); - setLoading(false); + const response = await updateState({ connectionId, state: stateObject }); + if (!response.successful) { + setValidation({ valid: false, message: response.errorMessage }); + } + + if (response?.state) { + setStateString(formatState(response.state)); } + + setLoading(false); }; const onSaveButtonClick = useCallback(() => { diff --git a/airbyte-webapp/src/core/request/AirbyteClient.ts b/airbyte-webapp/src/core/request/AirbyteClient.ts index b7e2011e10b764..a94fa3afba8b4d 100644 --- a/airbyte-webapp/src/core/request/AirbyteClient.ts +++ b/airbyte-webapp/src/core/request/AirbyteClient.ts @@ -182,16 +182,6 @@ export type CompleteDestinationOAuthRequestQueryParams = { [key: string]: any }; */ export type CompleteSourceOauthRequestQueryParams = { [key: string]: any }; -export interface CompleteSourceOauthRequest { - sourceDefinitionId: SourceDefinitionId; - workspaceId: WorkspaceId; - /** When completing OAuth flow to gain an access token, some API sometimes requires to verify that the app re-send the redirectUrl that was used when consent was given. */ - redirectUrl?: string; - /** The query parameters present in the redirect URL after a user granted consent e.g auth code */ - queryParams?: CompleteSourceOauthRequestQueryParams; - oAuthInputConfiguration?: OAuthInputConfiguration; -} - export interface OAuthConsentRead { consentUrl: string; } @@ -328,6 +318,16 @@ export interface CompleteDestinationOAuthRequest { oAuthInputConfiguration?: OAuthInputConfiguration; } +export interface CompleteSourceOauthRequest { + sourceDefinitionId: SourceDefinitionId; + workspaceId: WorkspaceId; + /** When completing OAuth flow to gain an access token, some API sometimes requires to verify that the app re-send the redirectUrl that was used when consent was given. */ + redirectUrl?: string; + /** The query parameters present in the redirect URL after a user granted consent e.g auth code */ + queryParams?: CompleteSourceOauthRequestQueryParams; + oAuthInputConfiguration?: OAuthInputConfiguration; +} + export type DbMigrationState = typeof DbMigrationState[keyof typeof DbMigrationState]; // eslint-disable-next-line @typescript-eslint/no-redeclare @@ -417,6 +417,13 @@ export interface ConnectionStateObject { [key: string]: any; } +export interface ConnectionUpdateStateResponse { + connectionId: ConnectionId; + state: ConnectionStateObject; + successful: boolean; + errorMessage?: string; +} + export interface ConnectionState { connectionId: ConnectionId; state?: ConnectionStateObject; @@ -587,6 +594,14 @@ export const JobConfigType = { reset_connection: "reset_connection", } as const; +export interface JobListRequestBody { + configTypes: JobConfigType[]; + configId: string; + pagination?: Pagination; +} + +export type JobId = number; + export interface JobDebugRead { id: JobId; configType: JobConfigType; @@ -597,14 +612,6 @@ export interface JobDebugRead { destinationDefinition: DestinationDefinitionRead; } -export interface JobListRequestBody { - configTypes: JobConfigType[]; - configId: string; - pagination?: Pagination; -} - -export type JobId = number; - export interface JobRead { id: JobId; configType: JobConfigType; @@ -753,27 +760,27 @@ export interface OperationReadList { operations: OperationRead[]; } -export interface WebBackendOperationCreateOrUpdate { - operationId?: OperationId; +export interface OperationCreate { workspaceId: WorkspaceId; name: string; operatorConfiguration: OperatorConfiguration; } -export interface OperationUpdate { - operationId: OperationId; +export type OperationId = string; + +export interface WebBackendOperationCreateOrUpdate { + operationId?: OperationId; + workspaceId: WorkspaceId; name: string; operatorConfiguration: OperatorConfiguration; } -export interface OperationCreate { - workspaceId: WorkspaceId; +export interface OperationUpdate { + operationId: OperationId; name: string; operatorConfiguration: OperatorConfiguration; } -export type OperationId = string; - export interface OperationIdRequestBody { operationId: OperationId; } @@ -825,23 +832,9 @@ export interface ConnectionReadList { connections: ConnectionRead[]; } -export interface WebBackendConnectionUpdate { - /** Name that will be set to the connection */ - name?: string; +export interface ConnectionUpdateStateBody { connectionId: ConnectionId; - namespaceDefinition?: NamespaceDefinitionType; - /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ - namespaceFormat?: string; - /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ - prefix?: string; - operationIds?: OperationId[]; - syncCatalog: AirbyteCatalog; - schedule?: ConnectionSchedule; - status: ConnectionStatus; - resourceRequirements?: ResourceRequirements; - withRefreshedCatalog?: boolean; - operations?: WebBackendOperationCreateOrUpdate[]; - sourceCatalogId?: string; + state: ConnectionStateObject; } export interface WebBackendConnectionCreate { @@ -887,6 +880,15 @@ export interface DbMigrationRequestBody { export type ConnectionId = string; +export interface SourceSearch { + sourceDefinitionId?: SourceDefinitionId; + sourceId?: SourceId; + workspaceId?: WorkspaceId; + connectionConfiguration?: SourceConfiguration; + name?: string; + sourceName?: string; +} + export interface WebBackendConnectionSearch { connectionId?: ConnectionId; name?: string; @@ -903,9 +905,57 @@ export interface WebBackendConnectionSearch { destination?: DestinationSearch; } -export interface ConnectionUpdateStateBody { +export interface ConnectionSearch { + connectionId?: ConnectionId; + name?: string; + namespaceDefinition?: NamespaceDefinitionType; + /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ + namespaceFormat?: string; + /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ + prefix?: string; + sourceId?: SourceId; + destinationId?: DestinationId; + schedule?: ConnectionSchedule; + status?: ConnectionStatus; + source?: SourceSearch; + destination?: DestinationSearch; +} + +export interface ConnectionRead { connectionId: ConnectionId; - state: ConnectionStateObject; + name: string; + namespaceDefinition?: NamespaceDefinitionType; + /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ + namespaceFormat?: string; + /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ + prefix?: string; + sourceId: SourceId; + destinationId: DestinationId; + operationIds?: OperationId[]; + syncCatalog: AirbyteCatalog; + schedule?: ConnectionSchedule; + status: ConnectionStatus; + resourceRequirements?: ResourceRequirements; + sourceCatalogId?: string | null; +} + +export interface WebBackendConnectionUpdate { + /** Name that will be set to the connection */ + name?: string; + connectionId: ConnectionId; + namespaceDefinition?: NamespaceDefinitionType; + /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ + namespaceFormat?: string; + /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ + prefix?: string; + operationIds?: OperationId[]; + syncCatalog: AirbyteCatalog; + schedule?: ConnectionSchedule; + status: ConnectionStatus; + resourceRequirements?: ResourceRequirements; + withRefreshedCatalog?: boolean; + operations?: WebBackendOperationCreateOrUpdate[]; + sourceCatalogId?: string; } export interface ConnectionUpdate { @@ -991,40 +1041,6 @@ export interface DestinationCoreConfig { export type DestinationId = string; -export interface ConnectionSearch { - connectionId?: ConnectionId; - name?: string; - namespaceDefinition?: NamespaceDefinitionType; - /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ - namespaceFormat?: string; - /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ - prefix?: string; - sourceId?: SourceId; - destinationId?: DestinationId; - schedule?: ConnectionSchedule; - status?: ConnectionStatus; - source?: SourceSearch; - destination?: DestinationSearch; -} - -export interface ConnectionRead { - connectionId: ConnectionId; - name: string; - namespaceDefinition?: NamespaceDefinitionType; - /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ - namespaceFormat?: string; - /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ - prefix?: string; - sourceId: SourceId; - destinationId: DestinationId; - operationIds?: OperationId[]; - syncCatalog: AirbyteCatalog; - schedule?: ConnectionSchedule; - status: ConnectionStatus; - resourceRequirements?: ResourceRequirements; - sourceCatalogId?: string | null; -} - export interface DestinationIdRequestBody { destinationId: DestinationId; } @@ -1046,30 +1062,11 @@ export interface DestinationDefinitionSpecificationRead { supportsNormalization?: boolean; } -export interface PrivateDestinationDefinitionRead { - destinationDefinition: DestinationDefinitionRead; - granted: boolean; -} - -export interface PrivateDestinationDefinitionReadList { - destinationDefinitions: PrivateDestinationDefinitionRead[]; -} - export interface DestinationDefinitionIdWithWorkspaceId { destinationDefinitionId: DestinationDefinitionId; workspaceId: WorkspaceId; } -export interface CustomDestinationDefinitionUpdate { - workspaceId: WorkspaceId; - destinationDefinition: DestinationDefinitionUpdate; -} - -export interface CustomDestinationDefinitionCreate { - workspaceId: WorkspaceId; - destinationDefinition: DestinationDefinitionCreate; -} - export interface DestinationDefinitionRead { destinationDefinitionId: DestinationDefinitionId; name: string; @@ -1083,6 +1080,15 @@ export interface DestinationDefinitionRead { resourceRequirements?: ActorDefinitionResourceRequirements; } +export interface PrivateDestinationDefinitionRead { + destinationDefinition: DestinationDefinitionRead; + granted: boolean; +} + +export interface PrivateDestinationDefinitionReadList { + destinationDefinitions: PrivateDestinationDefinitionRead[]; +} + export interface DestinationDefinitionReadList { destinationDefinitions: DestinationDefinitionRead[]; } @@ -1093,6 +1099,11 @@ export interface DestinationDefinitionUpdate { resourceRequirements?: ActorDefinitionResourceRequirements; } +export interface CustomDestinationDefinitionUpdate { + workspaceId: WorkspaceId; + destinationDefinition: DestinationDefinitionUpdate; +} + export interface DestinationDefinitionCreate { name: string; dockerRepository: string; @@ -1102,6 +1113,11 @@ export interface DestinationDefinitionCreate { resourceRequirements?: ActorDefinitionResourceRequirements; } +export interface CustomDestinationDefinitionCreate { + workspaceId: WorkspaceId; + destinationDefinition: DestinationDefinitionCreate; +} + export interface DestinationDefinitionIdRequestBody { destinationDefinitionId: DestinationDefinitionId; } @@ -1382,15 +1398,6 @@ export type CustomerId = string; export type WorkspaceId = string; -export interface SourceSearch { - sourceDefinitionId?: SourceDefinitionId; - sourceId?: SourceId; - workspaceId?: WorkspaceId; - connectionConfiguration?: SourceConfiguration; - name?: string; - sourceName?: string; -} - // eslint-disable-next-line type SecondParameter any> = T extends (config: any, args: infer P) => any ? P : never; @@ -2464,7 +2471,7 @@ export const updateState = ( connectionUpdateStateBody: ConnectionUpdateStateBody, options?: SecondParameter ) => { - return apiOverride( + return apiOverride( { url: `/v1/state/update`, method: "post", diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index bb83c0f2533db7..2a796112d04a62 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -1649,7 +1649,7 @@

      Request body

      Return type

      @@ -1658,7 +1658,9 @@

      Return type

      Example data

      Content-Type: application/json
      {
      -  "connectionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
      +  "errorMessage" : "errorMessage",
      +  "connectionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91",
      +  "successful" : true
       }

      Produces

      @@ -1671,7 +1673,7 @@

      Produces

      Responses

      200

      Successful operation - ConnectionState + ConnectionUpdateStateResponse

      404

      Object with given id was not found. NotFoundKnownExceptionInfo @@ -9859,6 +9861,7 @@

      Table of Contents

    • ConnectionStatus -
    • ConnectionUpdate -
    • ConnectionUpdateStateBody -
    • +
    • ConnectionUpdateStateResponse -
    • CustomDestinationDefinitionCreate -
    • CustomDestinationDefinitionUpdate -
    • CustomSourceDefinitionCreate -
    • @@ -10283,6 +10286,16 @@

      ConnectionUpdateStateBody -
      state

    +
    +

    ConnectionUpdateStateResponse - Up

    +
    +
    +
    connectionId
    UUID format: uuid
    +
    state
    +
    successful
    +
    errorMessage (optional)
    +
    +

    CustomDestinationDefinitionCreate - Up

    From b23f55338c855330f6194510052da8f8656c65e5 Mon Sep 17 00:00:00 2001 From: evantahler Date: Fri, 3 Jun 2022 15:39:21 -0700 Subject: [PATCH 11/20] code editor component --- .../src/components/CodeEditor/CodeEditor.tsx | 110 ++++++++++++++++++ .../src/components/CodeEditor/index.tsx | 1 + .../src/components/StateBlock/StateBlock.tsx | 109 ++++------------- airbyte-webapp/src/locales/en.json | 12 +- 4 files changed, 140 insertions(+), 92 deletions(-) create mode 100644 airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx create mode 100644 airbyte-webapp/src/components/CodeEditor/index.tsx diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx new file mode 100644 index 00000000000000..5ef23580294623 --- /dev/null +++ b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx @@ -0,0 +1,110 @@ +import { highlight, languages } from "prismjs/components/prism-core"; +import React, { useState, ReactElement } from "react"; +import Editor from "react-simple-code-editor"; +import styled from "styled-components"; +import "prismjs/components/prism-clike"; +import "prismjs/components/prism-javascript"; +import "prismjs/themes/prism.css"; + +import { LoadingButton } from "components"; +import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; + +const ErrorText = styled.div` + margin-left: 20px; + font-size: 11px; + line-height: 13px; + color: ${({ theme }) => theme.redColor}; + white-space: pre-line; +`; + +const codeStyle = { + fontFamily: '"Fira code", "Fira Mono", monospace', + fontSize: 12, + marginTop: "5px", + marginLeft: "10px", + marginBottom: "5px", +}; + +interface AirbyteCodeEditorProps { + code: string; + setCode: (newCode: string) => void; + loading?: boolean; + saveButtonCTA?: ReactElement | string; + onSave?: (newCode: string) => Promise; + validate?: (newCode: string) => ValidatorFeedback; + useModal?: boolean; + modalTextKey?: string; + modalTitleKey?: string; +} + +export interface ValidatorFeedback { + valid: boolean; + errorMessage?: string; +} + +const CodeEditor: React.FC = ({ + code, + loading, + setCode, + onSave, + validate, + saveButtonCTA, + useModal, + modalTextKey, + modalTitleKey, +}) => { + const [validation, setValidation] = useState({ valid: true }); + const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); + + const onValueChange = (newCode: string) => { + if (!validation.valid) setValidation({ valid: true }); + setCode(newCode); + }; + + const onClick = async () => { + let valid = true; + if (validate) { + const validationResponse = validate(code); + setValidation(validationResponse); + valid = validationResponse.valid; + } + if (onSave && valid) { + if (useModal) { + openConfirmationModal({ + text: modalTextKey ?? "", + title: modalTitleKey ?? "", + submitButtonText: "form.save", + onSubmit: async () => { + const updateResponse = await onSave(code); + if (updateResponse) setValidation(updateResponse); + closeConfirmationModal(); + }, + }); + } else { + const updateResponse = await onSave(code); + if (updateResponse) setValidation(updateResponse); + } + } + }; + + return ( + <> + highlight(code, languages.js)} + padding={10} + disabled={loading} + style={codeStyle} + /> + {validation.valid === false && {validation.errorMessage || "Invalid"}} +
    + + {saveButtonCTA || "Save"} + +
    + + ); +}; + +export default CodeEditor; diff --git a/airbyte-webapp/src/components/CodeEditor/index.tsx b/airbyte-webapp/src/components/CodeEditor/index.tsx new file mode 100644 index 00000000000000..6bb8194a87dc78 --- /dev/null +++ b/airbyte-webapp/src/components/CodeEditor/index.tsx @@ -0,0 +1 @@ +export * from "./CodeEditor"; diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 88101fd7432d28..5cd991dc55ecac 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -1,22 +1,18 @@ -import { highlight, languages } from "prismjs/components/prism-core"; import React, { useState, useEffect, useCallback } from "react"; import { FormattedMessage } from "react-intl"; -import "prismjs/components/prism-clike"; -import "prismjs/components/prism-javascript"; -import "prismjs/themes/prism.css"; -import Editor from "react-simple-code-editor"; import styled from "styled-components"; -import { H5, LoadingButton } from "components"; +import { H5 } from "components"; +import CodeEditor, { ValidatorFeedback } from "components/CodeEditor/CodeEditor"; import ContentCard from "components/ContentCard"; import { ConnectionState, ConnectionStateObject } from "core/request/AirbyteClient"; -import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; + import { useGetConnectionState, useUpdateConnectionState } from "hooks/services/useConnectionHook"; -type IProps = { +interface StateBlockProps { connectionId: string; -}; +} const StateBlockComponent = styled(ContentCard)` margin-top: 12px; @@ -34,32 +30,9 @@ const Text = styled.div` white-space: pre-line; `; -const ErrorText = styled.div` - margin-left: 20px; - font-size: 11px; - line-height: 13px; - color: ${({ theme }) => theme.redColor}; - white-space: pre-line; -`; - -const codeStyle = { - fontFamily: '"Fira code", "Fira Mono", monospace', - fontSize: 12, - marginTop: "5px", - marginLeft: "10px", - marginBottom: "5px", -}; - -type Validation = { - valid: boolean; - message?: string; -}; - -const StateBlock: React.FC = ({ connectionId }) => { +const StateBlock: React.FC = ({ connectionId }) => { const [stateString, setStateString] = useState(`// ...`); const [loading, setLoading] = useState(false); - const [validation, setValidation] = useState({ valid: true }); - const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); const { mutateAsync: getState } = useGetConnectionState(); const { mutateAsync: updateState } = useUpdateConnectionState(); @@ -72,39 +45,15 @@ const StateBlock: React.FC = ({ connectionId }) => { } }; - const saveState = async () => { + const saveState: () => Promise = async () => { setLoading(true); const stateObject = JSON.parse(stateString) as ConnectionState; const response = await updateState({ connectionId, state: stateObject }); - if (!response.successful) { - setValidation({ valid: false, message: response.errorMessage }); - } - - if (response?.state) { - setStateString(formatState(response.state)); - } - setLoading(false); + if (response.state) setStateString(formatState(response.state)); + return { valid: response.successful, errorMessage: response.errorMessage }; }; - const onSaveButtonClick = useCallback(() => { - const validationResponse = validateState(stateString); - setValidation(validationResponse); - if (!validationResponse.valid) return; - - openConfirmationModal({ - text: `tables.State.confirmModalText`, - title: `tables.State.confirmModalTitle`, - submitButtonText: "form.save", - onSubmit: async () => { - await saveState(); - closeConfirmationModal(); - }, - submitButtonDataId: "state", - }); - // eslint-disable-next-line - }, [closeConfirmationModal, saveState, openConfirmationModal]); - const loadStateMemoized = useCallback(() => { loadState(); // eslint-disable-next-line @@ -118,33 +67,21 @@ const StateBlock: React.FC = ({ connectionId }) => {
    - +
    - . . + . .
    - { - if (!validation.valid) setValidation({ valid: true }); - setStateString(code); - }} - highlight={(code) => highlight(code, languages.js)} - padding={10} - disabled={loading} - style={codeStyle} + } + useModal + modalTitleKey="tables.connectionState.confirmModalTitle" + modalTextKey="tables.connectionState.confirmModalText" /> - {validation.valid === false && {validation.message}} -
    - - - -
    ); }; @@ -157,7 +94,7 @@ const formatState = (state: ConnectionStateObject) => JSON.stringify(state, null * 2. (TODO) ensuring that there are no additional properties * 3. Checking that we have valid JSON */ -const validateState: (state: string) => Validation = (state) => { +const validateState: (state: string) => ValidatorFeedback = (state) => { let valid = true; let message: string | undefined; @@ -168,7 +105,7 @@ const validateState: (state: string) => Validation = (state) => { message = "Invalid json"; } - return { valid, message: `Error: ${message}` }; + return { valid, errorMessage: `Error: ${message}` }; }; export default StateBlock; diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index bef2d7042ab46b..eff4d64c86303b 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -400,12 +400,12 @@ "tables.sourceDeleteModalText": "This can not be un-done without a full re-sync. Note that:\n - All connections with this source will be deleted, including their past logs and configurations.\n - No existing data in the destination will be altered", "tables.destinationDeleteModalText": "This can not be un-done. Note that:\n - All connections with this destination will be deleted, including their past logs and configurations.\n - No existing data in the destination will be altered.", "tables.connectionDeleteModalText": "This can not be un-done without a full re-sync. Note that:\n - All past logs and configurations will be deleted\n - Updates of new data will stop\n - No existing data in the destination will be altered", - "tables.State.title": "Connection State", - "tables.State.p1": "The connection's current state", - "tables.State.p2": "Airbyte does not store historic connection state", - "tables.State.confirmModalTitle": "Update connection State?", - "tables.State.confirmModalText": "Be extremely careful when modifying state - mistakes can lead to unrecoverable syncs!", - "tables.State.save": "Save connection state", + "tables.connectionState.title": "Connection State", + "tables.connectionState.p1": "The connection's current state", + "tables.connectionState.p2": "Airbyte does not store historic connection state", + "tables.connectionState.confirmModalTitle": "Update connection State?", + "tables.connectionState.confirmModalText": "Be extremely careful when modifying state - mistakes can lead to unrecoverable syncs!", + "tables.connectionState.save": "Save connection state", "admin.destinations": "Destinations", "admin.sources": "Sources", From b4dcc373aef0bbcb7ef4fbb40eaa8b5717de3ecc Mon Sep 17 00:00:00 2001 From: evantahler Date: Fri, 3 Jun 2022 15:52:05 -0700 Subject: [PATCH 12/20] errors fixed --- airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx | 3 ++- airbyte-webapp/src/components/StateBlock/StateBlock.tsx | 1 - airbyte-webapp/src/locales/en.json | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx index 5ef23580294623..9a708f3f4b73c7 100644 --- a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx +++ b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx @@ -7,6 +7,7 @@ import "prismjs/components/prism-javascript"; import "prismjs/themes/prism.css"; import { LoadingButton } from "components"; + import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; const ErrorText = styled.div` @@ -73,7 +74,7 @@ const CodeEditor: React.FC = ({ openConfirmationModal({ text: modalTextKey ?? "", title: modalTitleKey ?? "", - submitButtonText: "form.save", + submitButtonText: "form.saveChange", onSubmit: async () => { const updateResponse = await onSave(code); if (updateResponse) setValidation(updateResponse); diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 5cd991dc55ecac..297a8618f54f3c 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -7,7 +7,6 @@ import CodeEditor, { ValidatorFeedback } from "components/CodeEditor/CodeEditor" import ContentCard from "components/ContentCard"; import { ConnectionState, ConnectionStateObject } from "core/request/AirbyteClient"; - import { useGetConnectionState, useUpdateConnectionState } from "hooks/services/useConnectionHook"; interface StateBlockProps { diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index eff4d64c86303b..6f6de2d2e7f46d 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -55,7 +55,6 @@ "form.canceling": "Canceling", "form.submit": "Submit", "form.delete": "Delete", - "form.save": "Save", "form.change": "Change", "form.add": "Add", "form.saveChanges": "Save changes", From db1ca4fdaa3d6e0b5e810afbf6e1620fd4f28bc0 Mon Sep 17 00:00:00 2001 From: evantahler Date: Fri, 3 Jun 2022 16:34:59 -0700 Subject: [PATCH 13/20] scss style --- .../CodeEditor/CodeEditor.module.scss | 9 ++++++ .../src/components/CodeEditor/CodeEditor.tsx | 12 ++------ .../{StateBlock => CodeEditor}/prismjs.d.ts | 0 .../StateBlock/StateBlock.module.scss | 17 +++++++++++ .../src/components/StateBlock/StateBlock.tsx | 30 +++++-------------- 5 files changed, 36 insertions(+), 32 deletions(-) create mode 100644 airbyte-webapp/src/components/CodeEditor/CodeEditor.module.scss rename airbyte-webapp/src/components/{StateBlock => CodeEditor}/prismjs.d.ts (100%) create mode 100644 airbyte-webapp/src/components/StateBlock/StateBlock.module.scss diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.module.scss b/airbyte-webapp/src/components/CodeEditor/CodeEditor.module.scss new file mode 100644 index 00000000000000..1631b8cfbce169 --- /dev/null +++ b/airbyte-webapp/src/components/CodeEditor/CodeEditor.module.scss @@ -0,0 +1,9 @@ +@use "../../scss/colors"; + +.errorText { + margin-left: 20px; + font-size: 11px; + line-height: 13px; + color: colors.$redColor; + white-space: pre-line; +} diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx index 9a708f3f4b73c7..19612a50ac23ef 100644 --- a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx +++ b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx @@ -1,7 +1,6 @@ import { highlight, languages } from "prismjs/components/prism-core"; import React, { useState, ReactElement } from "react"; import Editor from "react-simple-code-editor"; -import styled from "styled-components"; import "prismjs/components/prism-clike"; import "prismjs/components/prism-javascript"; import "prismjs/themes/prism.css"; @@ -10,14 +9,9 @@ import { LoadingButton } from "components"; import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; -const ErrorText = styled.div` - margin-left: 20px; - font-size: 11px; - line-height: 13px; - color: ${({ theme }) => theme.redColor}; - white-space: pre-line; -`; +import styles from "./CodeEditor.module.scss"; +// note: these styles are in JSON for the editor to use const codeStyle = { fontFamily: '"Fira code", "Fira Mono", monospace', fontSize: 12, @@ -98,7 +92,7 @@ const CodeEditor: React.FC = ({ disabled={loading} style={codeStyle} /> - {validation.valid === false && {validation.errorMessage || "Invalid"}} + {validation.valid === false &&
    {validation.errorMessage || "Invalid"}
    }
    {saveButtonCTA || "Save"} diff --git a/airbyte-webapp/src/components/StateBlock/prismjs.d.ts b/airbyte-webapp/src/components/CodeEditor/prismjs.d.ts similarity index 100% rename from airbyte-webapp/src/components/StateBlock/prismjs.d.ts rename to airbyte-webapp/src/components/CodeEditor/prismjs.d.ts diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.module.scss b/airbyte-webapp/src/components/StateBlock/StateBlock.module.scss new file mode 100644 index 00000000000000..3128edbe266ffa --- /dev/null +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.module.scss @@ -0,0 +1,17 @@ +@use "../../scss/colors"; + +.stateBlock { + margin-top: 12px; + padding: 19px 20px 20px; + // display: flex; + align-items: top; + justify-content: space-between; +} + +.descriptionText { + margin-left: 20px; + font-size: 11px; + line-height: 13px; + color: colors.$greyColor40; + white-space: pre-line; +} diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 297a8618f54f3c..c480b4d64d5328 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -1,34 +1,18 @@ import React, { useState, useEffect, useCallback } from "react"; import { FormattedMessage } from "react-intl"; -import styled from "styled-components"; -import { H5 } from "components"; +import { H5, Card } from "components"; import CodeEditor, { ValidatorFeedback } from "components/CodeEditor/CodeEditor"; -import ContentCard from "components/ContentCard"; import { ConnectionState, ConnectionStateObject } from "core/request/AirbyteClient"; import { useGetConnectionState, useUpdateConnectionState } from "hooks/services/useConnectionHook"; +import styles from "./StateBlock.module.scss"; + interface StateBlockProps { connectionId: string; } -const StateBlockComponent = styled(ContentCard)` - margin-top: 12px; - padding: 19px 20px 20px; - // display: flex; - align-items: top; - justify-content: space-between; -`; - -const Text = styled.div` - margin-left: 20px; - font-size: 11px; - line-height: 13px; - color: ${({ theme }) => theme.greyColor40}; - white-space: pre-line; -`; - const StateBlock: React.FC = ({ connectionId }) => { const [stateString, setStateString] = useState(`// ...`); const [loading, setLoading] = useState(false); @@ -63,13 +47,13 @@ const StateBlock: React.FC = ({ connectionId }) => { }, [loadStateMemoized]); return ( - - + +
    . . - +
    = ({ connectionId }) => { modalTitleKey="tables.connectionState.confirmModalTitle" modalTextKey="tables.connectionState.confirmModalText" /> -
    + ); }; From 171e031feb6960be89fdedea1f69379aa6344a27 Mon Sep 17 00:00:00 2001 From: evantahler Date: Fri, 3 Jun 2022 17:17:36 -0700 Subject: [PATCH 14/20] make linter happy --- .../src/components/CodeEditor/CodeEditor.tsx | 12 +++++++++--- .../src/components/StateBlock/StateBlock.tsx | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx index 19612a50ac23ef..74c2e482eba776 100644 --- a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx +++ b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx @@ -52,7 +52,9 @@ const CodeEditor: React.FC = ({ const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); const onValueChange = (newCode: string) => { - if (!validation.valid) setValidation({ valid: true }); + if (!validation.valid) { + setValidation({ valid: true }); + } setCode(newCode); }; @@ -71,13 +73,17 @@ const CodeEditor: React.FC = ({ submitButtonText: "form.saveChange", onSubmit: async () => { const updateResponse = await onSave(code); - if (updateResponse) setValidation(updateResponse); + if (updateResponse) { + setValidation(updateResponse); + } closeConfirmationModal(); }, }); } else { const updateResponse = await onSave(code); - if (updateResponse) setValidation(updateResponse); + if (updateResponse) { + setValidation(updateResponse); + } } } }; diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index c480b4d64d5328..1db530a5cd3b43 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -33,7 +33,9 @@ const StateBlock: React.FC = ({ connectionId }) => { const stateObject = JSON.parse(stateString) as ConnectionState; const response = await updateState({ connectionId, state: stateObject }); setLoading(false); - if (response.state) setStateString(formatState(response.state)); + if (response.state) { + setStateString(formatState(response.state)); + } return { valid: response.successful, errorMessage: response.errorMessage }; }; From c407de4a3c7311d3acc0df672ee331ea6982e465 Mon Sep 17 00:00:00 2001 From: evantahler Date: Mon, 6 Jun 2022 20:40:09 -0700 Subject: [PATCH 15/20] Back to monaco editor --- airbyte-webapp/package-lock.json | 70 ++++++++++++++++++- airbyte-webapp/package.json | 2 +- .../src/components/CodeEditor/CodeEditor.tsx | 44 ++++++------ .../src/components/CodeEditor/prismjs.d.ts | 8 --- .../src/components/StateBlock/StateBlock.tsx | 6 +- airbyte-webapp/src/locales/en.json | 1 - 6 files changed, 96 insertions(+), 35 deletions(-) delete mode 100644 airbyte-webapp/src/components/CodeEditor/prismjs.d.ts diff --git a/airbyte-webapp/package-lock.json b/airbyte-webapp/package-lock.json index 3010267a8eceb8..eb75a9a5ca995c 100644 --- a/airbyte-webapp/package-lock.json +++ b/airbyte-webapp/package-lock.json @@ -14,6 +14,7 @@ "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", "@fullstory/browser": "^1.5.1", + "@monaco-editor/react": "^4.4.5", "@sentry/react": "^6.19.6", "@sentry/tracing": "^6.19.6", "classnames": "^2.3.1", @@ -24,7 +25,6 @@ "framer-motion": "^6.3.11", "launchdarkly-js-client-sdk": "^2.22.1", "lodash": "^4.17.21", - "prismjs": "^1.28.0", "query-string": "^6.13.1", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -5330,6 +5330,31 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@monaco-editor/loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.2.tgz", + "integrity": "sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g==", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.4.5.tgz", + "integrity": "sha512-IImtzU7sRc66OOaQVCG+5PFHkSWnnhrUWGBuH6zNmH2h0YgmAhcjHZQc/6MY9JWEbUtVF1WPBMJ9u1XuFbRrVA==", + "dependencies": { + "@monaco-editor/loader": "^1.3.2", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -32409,6 +32434,12 @@ "node": ">=10.0.0" } }, + "node_modules/monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==", + "peer": true + }, "node_modules/move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -34748,6 +34779,7 @@ "version": "1.28.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "dev": true, "engines": { "node": ">=6" } @@ -42288,6 +42320,11 @@ "stacktrace-gps": "^3.0.4" } }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, "node_modules/state-toggle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", @@ -50378,6 +50415,23 @@ "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", "dev": true }, + "@monaco-editor/loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.2.tgz", + "integrity": "sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g==", + "requires": { + "state-local": "^1.0.6" + } + }, + "@monaco-editor/react": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.4.5.tgz", + "integrity": "sha512-IImtzU7sRc66OOaQVCG+5PFHkSWnnhrUWGBuH6zNmH2h0YgmAhcjHZQc/6MY9JWEbUtVF1WPBMJ9u1XuFbRrVA==", + "requires": { + "@monaco-editor/loader": "^1.3.2", + "prop-types": "^15.7.2" + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -71156,6 +71210,12 @@ "integrity": "sha512-hA0fIHy/74p5DE0rdmrpU0sV1U+gnWTcgShWequGRLy0L1eT+zY0ozFukawpLaxMwIA+orRcqFRElYwT+5p81A==", "dev": true }, + "monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==", + "peer": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -72983,7 +73043,8 @@ "prismjs": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "dev": true }, "process": { "version": "0.11.10", @@ -78445,6 +78506,11 @@ "stacktrace-gps": "^3.0.4" } }, + "state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, "state-toggle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", diff --git a/airbyte-webapp/package.json b/airbyte-webapp/package.json index 998e09ffb359bc..1d0784ac763d0d 100644 --- a/airbyte-webapp/package.json +++ b/airbyte-webapp/package.json @@ -24,6 +24,7 @@ "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", "@fullstory/browser": "^1.5.1", + "@monaco-editor/react": "^4.4.5", "@sentry/react": "^6.19.6", "@sentry/tracing": "^6.19.6", "classnames": "^2.3.1", @@ -34,7 +35,6 @@ "framer-motion": "^6.3.11", "launchdarkly-js-client-sdk": "^2.22.1", "lodash": "^4.17.21", - "prismjs": "^1.28.0", "query-string": "^6.13.1", "react": "^17.0.2", "react-dom": "^17.0.2", diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx index 74c2e482eba776..e08ef4fefd68e9 100644 --- a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx +++ b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx @@ -1,9 +1,5 @@ -import { highlight, languages } from "prismjs/components/prism-core"; +import Editor from "@monaco-editor/react"; import React, { useState, ReactElement } from "react"; -import Editor from "react-simple-code-editor"; -import "prismjs/components/prism-clike"; -import "prismjs/components/prism-javascript"; -import "prismjs/themes/prism.css"; import { LoadingButton } from "components"; @@ -11,17 +7,10 @@ import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; import styles from "./CodeEditor.module.scss"; -// note: these styles are in JSON for the editor to use -const codeStyle = { - fontFamily: '"Fira code", "Fira Mono", monospace', - fontSize: 12, - marginTop: "5px", - marginLeft: "10px", - marginBottom: "5px", -}; - interface AirbyteCodeEditorProps { + height?: string; code: string; + language?: string; setCode: (newCode: string) => void; loading?: boolean; saveButtonCTA?: ReactElement | string; @@ -40,6 +29,8 @@ export interface ValidatorFeedback { const CodeEditor: React.FC = ({ code, loading, + height, + language, setCode, onSave, validate, @@ -51,7 +42,11 @@ const CodeEditor: React.FC = ({ const [validation, setValidation] = useState({ valid: true }); const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); - const onValueChange = (newCode: string) => { + const onValueChange = (newCode: string | undefined) => { + if (!newCode) { + return; + } + if (!validation.valid) { setValidation({ valid: true }); } @@ -70,7 +65,7 @@ const CodeEditor: React.FC = ({ openConfirmationModal({ text: modalTextKey ?? "", title: modalTitleKey ?? "", - submitButtonText: "form.saveChange", + submitButtonText: "form.saveChanges", onSubmit: async () => { const updateResponse = await onSave(code); if (updateResponse) { @@ -90,16 +85,21 @@ const CodeEditor: React.FC = ({ return ( <> +
    highlight(code, languages.js)} - padding={10} - disabled={loading} - style={codeStyle} + onChange={onValueChange} + options={{ + matchBrackets: "always", + minimap: { + enabled: false, + }, + }} /> {validation.valid === false &&
    {validation.errorMessage || "Invalid"}
    } -
    +
    {saveButtonCTA || "Save"} diff --git a/airbyte-webapp/src/components/CodeEditor/prismjs.d.ts b/airbyte-webapp/src/components/CodeEditor/prismjs.d.ts deleted file mode 100644 index 26eccf06774eae..00000000000000 --- a/airbyte-webapp/src/components/CodeEditor/prismjs.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * using the @types/prismjs does not fix the following warning: - * - * TS7016: Could not find a declaration file for module 'prismjs/components/prism-core'. '/Users/evan/workspace/airbyte/airbyte/airbyte-webapp/node_modules/prismjs/components/prism-core.js' implicitly has an 'any' type. - * Try `npm i --save-dev @types/prismjs` if it exists or add a new declaration (.d.ts) file containing `declare module 'prismjs/components/prism-core';` - */ - -declare module "prismjs/components/prism-core"; diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 1db530a5cd3b43..22265b835263c3 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -54,7 +54,11 @@ const StateBlock: React.FC = ({ connectionId }) => {
    - . . + .
    + + + + .
    Date: Fri, 10 Jun 2022 11:38:19 -0700 Subject: [PATCH 16/20] Remove ability to edit state --- airbyte-api/src/main/openapi/config.yaml | 48 ---- .../airbyte/server/apis/ConfigurationApi.java | 7 - .../server/handlers/SchedulerHandler.java | 51 +--- .../server/handlers/SchedulerHandlerTest.java | 18 -- .../src/components/CodeEditor/CodeEditor.tsx | 69 +++--- .../src/components/StateBlock/StateBlock.tsx | 50 +--- .../domain/connection/ConnectionService.ts | 13 +- .../src/core/request/AirbyteClient.ts | 221 ++++++++---------- .../src/hooks/services/useConnectionHook.tsx | 10 - airbyte-webapp/src/locales/en.json | 3 - .../api/generated-api-html/index.html | 81 ------- 11 files changed, 146 insertions(+), 425 deletions(-) diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index 6d3bac8383e7c3..426e93e630544d 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -1402,29 +1402,6 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" - /v1/state/update: - post: - tags: - - connection - summary: Set the current state for a connection. - operationId: updateState - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ConnectionUpdateStateBody" - required: true - responses: - "200": - description: Successful operation - content: - application/json: - schema: - $ref: "#/components/schemas/ConnectionUpdateStateResponse" - "404": - $ref: "#/components/responses/NotFoundResponse" - "422": - $ref: "#/components/responses/InvalidInputResponse" /v1/connections/search: post: tags: @@ -3286,16 +3263,6 @@ components: sourceCatalogId: type: string format: uuid - ConnectionUpdateStateBody: - type: object - required: - - connectionId - - state - properties: - connectionId: - $ref: "#/components/schemas/ConnectionId" - state: - $ref: "#/components/schemas/ConnectionStateObject" ConnectionRead: type: object required: @@ -4020,21 +3987,6 @@ components: $ref: "#/components/schemas/ConnectionId" state: $ref: "#/components/schemas/ConnectionStateObject" - ConnectionUpdateStateResponse: - type: object - required: - - connectionId - - successful - - state - properties: - connectionId: - $ref: "#/components/schemas/ConnectionId" - state: - $ref: "#/components/schemas/ConnectionStateObject" - successful: - type: boolean - errorMessage: - type: string ConnectionStateObject: type: object ActorDefinitionResourceRequirements: diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java index b2228e13c259d1..0da999eed61c3d 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java @@ -16,8 +16,6 @@ import io.airbyte.api.model.generated.ConnectionSearch; import io.airbyte.api.model.generated.ConnectionState; import io.airbyte.api.model.generated.ConnectionUpdate; -import io.airbyte.api.model.generated.ConnectionUpdateStateBody; -import io.airbyte.api.model.generated.ConnectionUpdateStateResponse; import io.airbyte.api.model.generated.CustomDestinationDefinitionCreate; import io.airbyte.api.model.generated.CustomDestinationDefinitionUpdate; import io.airbyte.api.model.generated.CustomSourceDefinitionCreate; @@ -729,11 +727,6 @@ public ConnectionState getState(final ConnectionIdRequestBody connectionIdReques return execute(() -> schedulerHandler.getState(connectionIdRequestBody)); } - @Override - public ConnectionUpdateStateResponse updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) { - return execute(() -> schedulerHandler.updateState(connectionUpdateStateBody)); - } - // SCHEDULER @Override public CheckConnectionRead executeSourceCheckConnection(final SourceCoreConfig sourceConfig) { diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index 1c2ca11fd1df9f..16250c869c23f0 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -14,8 +14,6 @@ import io.airbyte.api.model.generated.CheckConnectionRead.StatusEnum; import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; -import io.airbyte.api.model.generated.ConnectionUpdateStateBody; -import io.airbyte.api.model.generated.ConnectionUpdateStateResponse; import io.airbyte.api.model.generated.DestinationCoreConfig; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionSpecificationRead; @@ -68,12 +66,8 @@ import io.airbyte.workers.temporal.TemporalClient.ManualOperationResult; import java.io.IOException; import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -328,38 +322,17 @@ public JobInfoRead resetConnection(final ConnectionIdRequestBody connectionIdReq } public ConnectionState getState(final ConnectionIdRequestBody connectionIdRequestBody) throws IOException { - final UUID connectionId = connectionIdRequestBody.getConnectionId(); - return getStateFromConnectionUUID(connectionId); - } + final Optional currentState = configRepository.getConnectionState(connectionIdRequestBody.getConnectionId()); + LOGGER.info("currentState server: {}", currentState); - public ConnectionUpdateStateResponse updateState(final ConnectionUpdateStateBody connectionUpdateStateBody) throws IOException { - String errorMessage = null; - Boolean successful = false; - final UUID connectionId = connectionUpdateStateBody.getConnectionId(); - final Set configTypes = new HashSet(); - configTypes.add(ConfigType.SYNC); - final List runningJobs = jobPersistence.listJobs(configTypes, connectionId.toString(), 2, 0) - .stream().filter(j -> !j.isJobInTerminalState()) - .collect(Collectors.toList()); - - if (runningJobs.size() == 0) { - final State state = new State(); - state.setState(connectionUpdateStateBody.getState()); - configRepository.updateConnectionState(connectionId, state); - successful = true; - } else { - errorMessage = "Sync is running"; - } + final ConnectionState connectionState = new ConnectionState() + .connectionId(connectionIdRequestBody.getConnectionId()); - final ConnectionUpdateStateResponse response = new ConnectionUpdateStateResponse(); - response.setState(getStateFromConnectionUUID(connectionId).getState()); - response.setConnectionId(connectionId); - response.setErrorMessage(errorMessage); - response.setSuccessful(successful); - return response; + currentState.ifPresent(state -> connectionState.state(state.getState())); + + return connectionState; } - // todo (cgardens) - this method needs a test. public JobInfoRead cancelJob(final JobIdRequestBody jobIdRequestBody) throws IOException { return submitCancellationToWorker(jobIdRequestBody.getId()); } @@ -427,14 +400,4 @@ private JobInfoRead readJobFromResult(final ManualOperationResult manualOperatio return jobConverter.getJobInfoRead(job); } - private ConnectionState getStateFromConnectionUUID(final UUID connectionId) throws IOException { - final Optional currentState = configRepository.getConnectionState(connectionId); - LOGGER.info("currentState server: {}", currentState); - - final ConnectionState connectionState = new ConnectionState().connectionId(connectionId); - - currentState.ifPresent(state -> connectionState.state(state.getState())); - return connectionState; - } - } diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java index e23748abc3ea94..4e2180b7965bee 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java @@ -19,13 +19,10 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap; import io.airbyte.api.model.generated.CheckConnectionRead; import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; -import io.airbyte.api.model.generated.ConnectionUpdateStateBody; -import io.airbyte.api.model.generated.ConnectionUpdateStateResponse; import io.airbyte.api.model.generated.DestinationCoreConfig; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionSpecificationRead; @@ -577,21 +574,6 @@ void testGetCurrentStateEmpty() throws IOException { assertEquals(new ConnectionState().connectionId(connectionId), connectionState); } - @Test - void testUpdateState() throws IOException { - final UUID connectionId = UUID.randomUUID(); - final JsonNode json = Jsons.jsonNode(ImmutableMap.of("checkpoint", 1)); - final State state = new State().withState(json); - when(configRepository.getConnectionState(connectionId)).thenReturn(Optional.of(state)); - - final ConnectionUpdateStateResponse connectionStateResponse = - schedulerHandler.updateState(new ConnectionUpdateStateBody().connectionId(connectionId).state(json)); - assertEquals(connectionStateResponse.getState(), state.getState()); - assertEquals(connectionStateResponse.getConnectionId(), connectionId); - assertEquals(connectionStateResponse.getSuccessful(), true); - assertEquals(connectionStateResponse.getErrorMessage(), null); - } - @Test void testEnumConversion() { assertTrue(Enums.isCompatible(StandardCheckConnectionOutput.Status.class, CheckConnectionRead.StatusEnum.class)); diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx index e08ef4fefd68e9..9dcde6e297ae36 100644 --- a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx +++ b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx @@ -53,35 +53,38 @@ const CodeEditor: React.FC = ({ setCode(newCode); }; - const onClick = async () => { - let valid = true; - if (validate) { - const validationResponse = validate(code); - setValidation(validationResponse); - valid = validationResponse.valid; - } - if (onSave && valid) { - if (useModal) { - openConfirmationModal({ - text: modalTextKey ?? "", - title: modalTitleKey ?? "", - submitButtonText: "form.saveChanges", - onSubmit: async () => { - const updateResponse = await onSave(code); - if (updateResponse) { - setValidation(updateResponse); + const onClick = + onSave || validate + ? async () => { + let valid = true; + if (validate) { + const validationResponse = validate(code); + setValidation(validationResponse); + valid = validationResponse.valid; + } + if (onSave && valid) { + if (useModal) { + openConfirmationModal({ + text: modalTextKey ?? "", + title: modalTitleKey ?? "", + submitButtonText: "form.saveChanges", + onSubmit: async () => { + const updateResponse = await onSave(code); + if (updateResponse) { + setValidation(updateResponse); + } + closeConfirmationModal(); + }, + }); + } else { + const updateResponse = await onSave(code); + if (updateResponse) { + setValidation(updateResponse); + } } - closeConfirmationModal(); - }, - }); - } else { - const updateResponse = await onSave(code); - if (updateResponse) { - setValidation(updateResponse); + } } - } - } - }; + : undefined; return ( <> @@ -99,11 +102,13 @@ const CodeEditor: React.FC = ({ }} /> {validation.valid === false &&
    {validation.errorMessage || "Invalid"}
    } -
    - - {saveButtonCTA || "Save"} - -
    + {onClick && ( +
    + + {saveButtonCTA || "Save"} + +
    + )} ); }; diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx index 22265b835263c3..6a273be677523e 100644 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx @@ -2,10 +2,10 @@ import React, { useState, useEffect, useCallback } from "react"; import { FormattedMessage } from "react-intl"; import { H5, Card } from "components"; -import CodeEditor, { ValidatorFeedback } from "components/CodeEditor/CodeEditor"; +import CodeEditor from "components/CodeEditor/CodeEditor"; -import { ConnectionState, ConnectionStateObject } from "core/request/AirbyteClient"; -import { useGetConnectionState, useUpdateConnectionState } from "hooks/services/useConnectionHook"; +import { ConnectionStateObject } from "core/request/AirbyteClient"; +import { useGetConnectionState } from "hooks/services/useConnectionHook"; import styles from "./StateBlock.module.scss"; @@ -14,10 +14,9 @@ interface StateBlockProps { } const StateBlock: React.FC = ({ connectionId }) => { - const [stateString, setStateString] = useState(`// ...`); + const [stateString, setStateString] = useState(); const [loading, setLoading] = useState(false); const { mutateAsync: getState } = useGetConnectionState(); - const { mutateAsync: updateState } = useUpdateConnectionState(); const loadState = async () => { setLoading(true); @@ -28,17 +27,6 @@ const StateBlock: React.FC = ({ connectionId }) => { } }; - const saveState: () => Promise = async () => { - setLoading(true); - const stateObject = JSON.parse(stateString) as ConnectionState; - const response = await updateState({ connectionId, state: stateObject }); - setLoading(false); - if (response.state) { - setStateString(formatState(response.state)); - } - return { valid: response.successful, errorMessage: response.errorMessage }; - }; - const loadStateMemoized = useCallback(() => { loadState(); // eslint-disable-next-line @@ -55,18 +43,12 @@ const StateBlock: React.FC = ({ connectionId }) => { .
    - - - - .
    } useModal modalTitleKey="tables.connectionState.confirmModalTitle" modalTextKey="tables.connectionState.confirmModalText" @@ -77,24 +59,4 @@ const StateBlock: React.FC = ({ connectionId }) => { const formatState = (state: ConnectionStateObject) => JSON.stringify(state, null, 4); -/** - * There isn't much in the way of validation we can do other than: - * 1. (TODO) ensuring that the original properties are still present - * 2. (TODO) ensuring that there are no additional properties - * 3. Checking that we have valid JSON - */ -const validateState: (state: string) => ValidatorFeedback = (state) => { - let valid = true; - let message: string | undefined; - - try { - JSON.parse(state); - } catch (e) { - valid = false; - message = "Invalid json"; - } - - return { valid, errorMessage: `Error: ${message}` }; -}; - export default StateBlock; diff --git a/airbyte-webapp/src/core/domain/connection/ConnectionService.ts b/airbyte-webapp/src/core/domain/connection/ConnectionService.ts index 7bda6d0375874f..a4616be27e5697 100644 --- a/airbyte-webapp/src/core/domain/connection/ConnectionService.ts +++ b/airbyte-webapp/src/core/domain/connection/ConnectionService.ts @@ -1,11 +1,4 @@ -import { - deleteConnection, - resetConnection, - syncConnection, - getState, - updateState, - ConnectionState, -} from "../../request/AirbyteClient"; +import { deleteConnection, resetConnection, syncConnection, getState } from "../../request/AirbyteClient"; import { AirbyteRequestService } from "../../request/AirbyteRequestService"; export class ConnectionService extends AirbyteRequestService { @@ -24,8 +17,4 @@ export class ConnectionService extends AirbyteRequestService { public getState(connectionId: string) { return getState({ connectionId }, this.requestOptions); } - - public updateState(connectionId: string, state: ConnectionState) { - return updateState({ connectionId, state }, this.requestOptions); - } } diff --git a/airbyte-webapp/src/core/request/AirbyteClient.ts b/airbyte-webapp/src/core/request/AirbyteClient.ts index a94fa3afba8b4d..b066780f316fc6 100644 --- a/airbyte-webapp/src/core/request/AirbyteClient.ts +++ b/airbyte-webapp/src/core/request/AirbyteClient.ts @@ -182,6 +182,16 @@ export type CompleteDestinationOAuthRequestQueryParams = { [key: string]: any }; */ export type CompleteSourceOauthRequestQueryParams = { [key: string]: any }; +export interface CompleteSourceOauthRequest { + sourceDefinitionId: SourceDefinitionId; + workspaceId: WorkspaceId; + /** When completing OAuth flow to gain an access token, some API sometimes requires to verify that the app re-send the redirectUrl that was used when consent was given. */ + redirectUrl?: string; + /** The query parameters present in the redirect URL after a user granted consent e.g auth code */ + queryParams?: CompleteSourceOauthRequestQueryParams; + oAuthInputConfiguration?: OAuthInputConfiguration; +} + export interface OAuthConsentRead { consentUrl: string; } @@ -318,16 +328,6 @@ export interface CompleteDestinationOAuthRequest { oAuthInputConfiguration?: OAuthInputConfiguration; } -export interface CompleteSourceOauthRequest { - sourceDefinitionId: SourceDefinitionId; - workspaceId: WorkspaceId; - /** When completing OAuth flow to gain an access token, some API sometimes requires to verify that the app re-send the redirectUrl that was used when consent was given. */ - redirectUrl?: string; - /** The query parameters present in the redirect URL after a user granted consent e.g auth code */ - queryParams?: CompleteSourceOauthRequestQueryParams; - oAuthInputConfiguration?: OAuthInputConfiguration; -} - export type DbMigrationState = typeof DbMigrationState[keyof typeof DbMigrationState]; // eslint-disable-next-line @typescript-eslint/no-redeclare @@ -417,13 +417,6 @@ export interface ConnectionStateObject { [key: string]: any; } -export interface ConnectionUpdateStateResponse { - connectionId: ConnectionId; - state: ConnectionStateObject; - successful: boolean; - errorMessage?: string; -} - export interface ConnectionState { connectionId: ConnectionId; state?: ConnectionStateObject; @@ -768,13 +761,6 @@ export interface OperationCreate { export type OperationId = string; -export interface WebBackendOperationCreateOrUpdate { - operationId?: OperationId; - workspaceId: WorkspaceId; - name: string; - operatorConfiguration: OperatorConfiguration; -} - export interface OperationUpdate { operationId: OperationId; name: string; @@ -832,9 +818,23 @@ export interface ConnectionReadList { connections: ConnectionRead[]; } -export interface ConnectionUpdateStateBody { +export interface WebBackendConnectionUpdate { + /** Name that will be set to the connection */ + name?: string; connectionId: ConnectionId; - state: ConnectionStateObject; + namespaceDefinition?: NamespaceDefinitionType; + /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ + namespaceFormat?: string; + /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ + prefix?: string; + operationIds?: OperationId[]; + syncCatalog: AirbyteCatalog; + schedule?: ConnectionSchedule; + status: ConnectionStatus; + resourceRequirements?: ResourceRequirements; + withRefreshedCatalog?: boolean; + operations?: WebBackendOperationCreateOrUpdate[]; + sourceCatalogId?: string; } export interface WebBackendConnectionCreate { @@ -880,31 +880,6 @@ export interface DbMigrationRequestBody { export type ConnectionId = string; -export interface SourceSearch { - sourceDefinitionId?: SourceDefinitionId; - sourceId?: SourceId; - workspaceId?: WorkspaceId; - connectionConfiguration?: SourceConfiguration; - name?: string; - sourceName?: string; -} - -export interface WebBackendConnectionSearch { - connectionId?: ConnectionId; - name?: string; - namespaceDefinition?: NamespaceDefinitionType; - /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ - namespaceFormat?: string; - /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ - prefix?: string; - sourceId?: SourceId; - destinationId?: DestinationId; - schedule?: ConnectionSchedule; - status?: ConnectionStatus; - source?: SourceSearch; - destination?: DestinationSearch; -} - export interface ConnectionSearch { connectionId?: ConnectionId; name?: string; @@ -921,43 +896,6 @@ export interface ConnectionSearch { destination?: DestinationSearch; } -export interface ConnectionRead { - connectionId: ConnectionId; - name: string; - namespaceDefinition?: NamespaceDefinitionType; - /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ - namespaceFormat?: string; - /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ - prefix?: string; - sourceId: SourceId; - destinationId: DestinationId; - operationIds?: OperationId[]; - syncCatalog: AirbyteCatalog; - schedule?: ConnectionSchedule; - status: ConnectionStatus; - resourceRequirements?: ResourceRequirements; - sourceCatalogId?: string | null; -} - -export interface WebBackendConnectionUpdate { - /** Name that will be set to the connection */ - name?: string; - connectionId: ConnectionId; - namespaceDefinition?: NamespaceDefinitionType; - /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ - namespaceFormat?: string; - /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ - prefix?: string; - operationIds?: OperationId[]; - syncCatalog: AirbyteCatalog; - schedule?: ConnectionSchedule; - status: ConnectionStatus; - resourceRequirements?: ResourceRequirements; - withRefreshedCatalog?: boolean; - operations?: WebBackendOperationCreateOrUpdate[]; - sourceCatalogId?: string; -} - export interface ConnectionUpdate { connectionId: ConnectionId; namespaceDefinition?: NamespaceDefinitionType; @@ -1041,6 +979,40 @@ export interface DestinationCoreConfig { export type DestinationId = string; +export interface WebBackendConnectionSearch { + connectionId?: ConnectionId; + name?: string; + namespaceDefinition?: NamespaceDefinitionType; + /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ + namespaceFormat?: string; + /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ + prefix?: string; + sourceId?: SourceId; + destinationId?: DestinationId; + schedule?: ConnectionSchedule; + status?: ConnectionStatus; + source?: SourceSearch; + destination?: DestinationSearch; +} + +export interface ConnectionRead { + connectionId: ConnectionId; + name: string; + namespaceDefinition?: NamespaceDefinitionType; + /** Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. */ + namespaceFormat?: string; + /** Prefix that will be prepended to the name of each stream when it is written to the destination. */ + prefix?: string; + sourceId: SourceId; + destinationId: DestinationId; + operationIds?: OperationId[]; + syncCatalog: AirbyteCatalog; + schedule?: ConnectionSchedule; + status: ConnectionStatus; + resourceRequirements?: ResourceRequirements; + sourceCatalogId?: string | null; +} + export interface DestinationIdRequestBody { destinationId: DestinationId; } @@ -1062,11 +1034,30 @@ export interface DestinationDefinitionSpecificationRead { supportsNormalization?: boolean; } +export interface PrivateDestinationDefinitionRead { + destinationDefinition: DestinationDefinitionRead; + granted: boolean; +} + +export interface PrivateDestinationDefinitionReadList { + destinationDefinitions: PrivateDestinationDefinitionRead[]; +} + export interface DestinationDefinitionIdWithWorkspaceId { destinationDefinitionId: DestinationDefinitionId; workspaceId: WorkspaceId; } +export interface CustomDestinationDefinitionUpdate { + workspaceId: WorkspaceId; + destinationDefinition: DestinationDefinitionUpdate; +} + +export interface CustomDestinationDefinitionCreate { + workspaceId: WorkspaceId; + destinationDefinition: DestinationDefinitionCreate; +} + export interface DestinationDefinitionRead { destinationDefinitionId: DestinationDefinitionId; name: string; @@ -1080,15 +1071,6 @@ export interface DestinationDefinitionRead { resourceRequirements?: ActorDefinitionResourceRequirements; } -export interface PrivateDestinationDefinitionRead { - destinationDefinition: DestinationDefinitionRead; - granted: boolean; -} - -export interface PrivateDestinationDefinitionReadList { - destinationDefinitions: PrivateDestinationDefinitionRead[]; -} - export interface DestinationDefinitionReadList { destinationDefinitions: DestinationDefinitionRead[]; } @@ -1099,11 +1081,6 @@ export interface DestinationDefinitionUpdate { resourceRequirements?: ActorDefinitionResourceRequirements; } -export interface CustomDestinationDefinitionUpdate { - workspaceId: WorkspaceId; - destinationDefinition: DestinationDefinitionUpdate; -} - export interface DestinationDefinitionCreate { name: string; dockerRepository: string; @@ -1113,11 +1090,6 @@ export interface DestinationDefinitionCreate { resourceRequirements?: ActorDefinitionResourceRequirements; } -export interface CustomDestinationDefinitionCreate { - workspaceId: WorkspaceId; - destinationDefinition: DestinationDefinitionCreate; -} - export interface DestinationDefinitionIdRequestBody { destinationDefinitionId: DestinationDefinitionId; } @@ -1398,6 +1370,22 @@ export type CustomerId = string; export type WorkspaceId = string; +export interface WebBackendOperationCreateOrUpdate { + operationId?: OperationId; + workspaceId: WorkspaceId; + name: string; + operatorConfiguration: OperatorConfiguration; +} + +export interface SourceSearch { + sourceDefinitionId?: SourceDefinitionId; + sourceId?: SourceId; + workspaceId?: WorkspaceId; + connectionConfiguration?: SourceConfiguration; + name?: string; + sourceName?: string; +} + // eslint-disable-next-line type SecondParameter any> = T extends (config: any, args: infer P) => any ? P : never; @@ -2464,24 +2452,6 @@ export const getState = ( ); }; -/** - * @summary Set the current state for a connection. - */ -export const updateState = ( - connectionUpdateStateBody: ConnectionUpdateStateBody, - options?: SecondParameter -) => { - return apiOverride( - { - url: `/v1/state/update`, - method: "post", - headers: { "Content-Type": "application/json" }, - data: connectionUpdateStateBody, - }, - options - ); -}; - /** * @summary Search connections */ @@ -3239,7 +3209,6 @@ export type ListAllConnectionsForWorkspaceResult = NonNullable< >; export type GetConnectionResult = NonNullable>>; export type GetStateResult = NonNullable>>; -export type UpdateStateResult = NonNullable>>; export type SearchConnectionsResult = NonNullable>>; export type DeleteConnectionResult = NonNullable>>; export type SyncConnectionResult = NonNullable>>; diff --git a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx index 9b65fb4735ee79..1d83707c42a5c6 100644 --- a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx +++ b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx @@ -10,7 +10,6 @@ import { useInitService } from "services/useInitService"; import { useConfig } from "../../config"; import { ConnectionSchedule, - ConnectionState, DestinationRead, NamespaceDefinitionType, OperationCreate, @@ -222,14 +221,6 @@ const useGetConnectionState = () => { return useMutation((connectionId: string) => service.getState(connectionId)); }; -const useUpdateConnectionState = () => { - const service = useConnectionService(); - - return useMutation(({ connectionId, state }: { connectionId: string; state: ConnectionState }) => - service.updateState(connectionId, state) - ); -}; - export { useConnectionList, useGetConnection, @@ -238,5 +229,4 @@ export { useDeleteConnection, invalidateConnectionsList, useGetConnectionState, - useUpdateConnectionState, }; diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 921262353c99b8..469b5b737b7ee4 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -401,9 +401,6 @@ "tables.connectionDeleteModalText": "This can not be un-done without a full re-sync. Note that:\n - All past logs and configurations will be deleted\n - Updates of new data will stop\n - No existing data in the destination will be altered", "tables.connectionState.title": "Connection State", "tables.connectionState.p1": "The connection's current state", - "tables.connectionState.confirmModalTitle": "Update connection State?", - "tables.connectionState.confirmModalText": "Be extremely careful when modifying state - mistakes can lead to unrecoverable syncs!", - "tables.connectionState.save": "Save connection state", "admin.destinations": "Destinations", "admin.sources": "Sources", diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index 2a796112d04a62..25fcbf39088398 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -231,7 +231,6 @@

    Connection

  • post /v1/connections/search
  • post /v1/connections/sync
  • post /v1/connections/update
  • -
  • post /v1/state/update
  • DbMigration


    -
    -
    - Up -
    post /v1/state/update
    -
    Set the current state for a connection. (updateState)
    -
    - - -

    Consumes

    - This API call consumes the following media types via the Content-Type request header: -
      -
    • application/json
    • -
    - -

    Request body

    -
    -
    ConnectionUpdateStateBody ConnectionUpdateStateBody (required)
    - -
    Body Parameter
    - -
    - - - - -

    Return type

    - - - - -

    Example data

    -
    Content-Type: application/json
    -
    {
    -  "errorMessage" : "errorMessage",
    -  "connectionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91",
    -  "successful" : true
    -}
    - -

    Produces

    - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
      -
    • application/json
    • -
    - -

    Responses

    -

    200

    - Successful operation - ConnectionUpdateStateResponse -

    404

    - Object with given id was not found. - NotFoundKnownExceptionInfo -

    422

    - Input failed validation - InvalidInputExceptionInfo -
    -

    DbMigration

    -
    -

    ConnectionUpdateStateBody - Up

    -
    -
    -
    connectionId
    UUID format: uuid
    -
    state
    -
    -
    -
    -

    ConnectionUpdateStateResponse - Up

    -
    -
    -
    connectionId
    UUID format: uuid
    -
    state
    -
    successful
    -
    errorMessage (optional)
    -
    -

    CustomDestinationDefinitionCreate - Up

    From f39a821bddf8479a1019f4095d477d0a30259a10 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Mon, 13 Jun 2022 11:50:13 +0200 Subject: [PATCH 17/20] Adjust FE code --- airbyte-webapp/nginx/default.conf.template | 2 +- .../CodeEditor/CodeEditor.module.scss | 9 -- .../src/components/CodeEditor/CodeEditor.tsx | 122 +++--------------- .../StateBlock/StateBlock.module.scss | 17 --- .../src/components/StateBlock/StateBlock.tsx | 62 --------- .../src/components/StateBlock/index.tsx | 3 - airbyte-webapp/src/components/index.tsx | 1 + .../src/hooks/services/useConnectionHook.tsx | 5 +- airbyte-webapp/src/locales/en.json | 2 +- .../components/SettingsView.tsx | 3 +- .../components/StateBlock.module.scss | 5 + .../components/StateBlock.tsx | 32 +++++ airbyte-webapp/src/setupProxy.js | 2 +- 13 files changed, 62 insertions(+), 203 deletions(-) delete mode 100644 airbyte-webapp/src/components/CodeEditor/CodeEditor.module.scss delete mode 100644 airbyte-webapp/src/components/StateBlock/StateBlock.module.scss delete mode 100644 airbyte-webapp/src/components/StateBlock/StateBlock.tsx delete mode 100644 airbyte-webapp/src/components/StateBlock/index.tsx create mode 100644 airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.module.scss create mode 100644 airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx diff --git a/airbyte-webapp/nginx/default.conf.template b/airbyte-webapp/nginx/default.conf.template index c6f0d22d32f60a..f14f47d41ce742 100644 --- a/airbyte-webapp/nginx/default.conf.template +++ b/airbyte-webapp/nginx/default.conf.template @@ -10,7 +10,7 @@ server { #charset koi8-r; #access_log /var/log/nginx/host.access.log main; - add_header Content-Security-Policy "script-src * 'unsafe-inline';"; + add_header Content-Security-Policy "script-src * 'unsafe-inline'; worker-src self blob:;"; location / { root /usr/share/nginx/html; diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.module.scss b/airbyte-webapp/src/components/CodeEditor/CodeEditor.module.scss deleted file mode 100644 index 1631b8cfbce169..00000000000000 --- a/airbyte-webapp/src/components/CodeEditor/CodeEditor.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -@use "../../scss/colors"; - -.errorText { - margin-left: 20px; - font-size: 11px; - line-height: 13px; - color: colors.$redColor; - white-space: pre-line; -} diff --git a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx index 9dcde6e297ae36..e2db40a53eaeb4 100644 --- a/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx +++ b/airbyte-webapp/src/components/CodeEditor/CodeEditor.tsx @@ -1,116 +1,26 @@ import Editor from "@monaco-editor/react"; -import React, { useState, ReactElement } from "react"; +import React from "react"; -import { LoadingButton } from "components"; - -import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; - -import styles from "./CodeEditor.module.scss"; - -interface AirbyteCodeEditorProps { +interface CodeEditorProps { height?: string; code: string; language?: string; - setCode: (newCode: string) => void; - loading?: boolean; - saveButtonCTA?: ReactElement | string; - onSave?: (newCode: string) => Promise; - validate?: (newCode: string) => ValidatorFeedback; - useModal?: boolean; - modalTextKey?: string; - modalTitleKey?: string; -} - -export interface ValidatorFeedback { - valid: boolean; - errorMessage?: string; } -const CodeEditor: React.FC = ({ - code, - loading, - height, - language, - setCode, - onSave, - validate, - saveButtonCTA, - useModal, - modalTextKey, - modalTitleKey, -}) => { - const [validation, setValidation] = useState({ valid: true }); - const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); - - const onValueChange = (newCode: string | undefined) => { - if (!newCode) { - return; - } - - if (!validation.valid) { - setValidation({ valid: true }); - } - setCode(newCode); - }; - - const onClick = - onSave || validate - ? async () => { - let valid = true; - if (validate) { - const validationResponse = validate(code); - setValidation(validationResponse); - valid = validationResponse.valid; - } - if (onSave && valid) { - if (useModal) { - openConfirmationModal({ - text: modalTextKey ?? "", - title: modalTitleKey ?? "", - submitButtonText: "form.saveChanges", - onSubmit: async () => { - const updateResponse = await onSave(code); - if (updateResponse) { - setValidation(updateResponse); - } - closeConfirmationModal(); - }, - }); - } else { - const updateResponse = await onSave(code); - if (updateResponse) { - setValidation(updateResponse); - } - } - } - } - : undefined; - +export const CodeEditor: React.FC = ({ code, height, language }) => { return ( - <> -
    - - {validation.valid === false &&
    {validation.errorMessage || "Invalid"}
    } - {onClick && ( -
    - - {saveButtonCTA || "Save"} - -
    - )} - + ); }; - -export default CodeEditor; diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.module.scss b/airbyte-webapp/src/components/StateBlock/StateBlock.module.scss deleted file mode 100644 index 3128edbe266ffa..00000000000000 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.module.scss +++ /dev/null @@ -1,17 +0,0 @@ -@use "../../scss/colors"; - -.stateBlock { - margin-top: 12px; - padding: 19px 20px 20px; - // display: flex; - align-items: top; - justify-content: space-between; -} - -.descriptionText { - margin-left: 20px; - font-size: 11px; - line-height: 13px; - color: colors.$greyColor40; - white-space: pre-line; -} diff --git a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx b/airbyte-webapp/src/components/StateBlock/StateBlock.tsx deleted file mode 100644 index 6a273be677523e..00000000000000 --- a/airbyte-webapp/src/components/StateBlock/StateBlock.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import React, { useState, useEffect, useCallback } from "react"; -import { FormattedMessage } from "react-intl"; - -import { H5, Card } from "components"; -import CodeEditor from "components/CodeEditor/CodeEditor"; - -import { ConnectionStateObject } from "core/request/AirbyteClient"; -import { useGetConnectionState } from "hooks/services/useConnectionHook"; - -import styles from "./StateBlock.module.scss"; - -interface StateBlockProps { - connectionId: string; -} - -const StateBlock: React.FC = ({ connectionId }) => { - const [stateString, setStateString] = useState(); - const [loading, setLoading] = useState(false); - const { mutateAsync: getState } = useGetConnectionState(); - - const loadState = async () => { - setLoading(true); - const state = await getState(connectionId); - if (state?.state) { - setStateString(formatState(state.state)); - setLoading(false); - } - }; - - const loadStateMemoized = useCallback(() => { - loadState(); - // eslint-disable-next-line - }, []); - - useEffect(() => { - loadStateMemoized(); - }, [loadStateMemoized]); - - return ( - -
    -
    - -
    - .
    -
    - -
    - ); -}; - -const formatState = (state: ConnectionStateObject) => JSON.stringify(state, null, 4); - -export default StateBlock; diff --git a/airbyte-webapp/src/components/StateBlock/index.tsx b/airbyte-webapp/src/components/StateBlock/index.tsx deleted file mode 100644 index 85f0e9c2c80b79..00000000000000 --- a/airbyte-webapp/src/components/StateBlock/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import StateBlock from "./StateBlock"; - -export default StateBlock; diff --git a/airbyte-webapp/src/components/index.tsx b/airbyte-webapp/src/components/index.tsx index da7fc19d658acb..660c5a3e0a95f2 100644 --- a/airbyte-webapp/src/components/index.tsx +++ b/airbyte-webapp/src/components/index.tsx @@ -2,6 +2,7 @@ export * from "./base"; export * from "./ArrayOfObjectsEditor"; export * from "./ContentCard"; +export * from "./CodeEditor"; export * from "./DefaultLogoCatalog"; export * from "./ImageBlock"; export * from "./Label"; diff --git a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx index 1d83707c42a5c6..eb59d0e1f0f531 100644 --- a/airbyte-webapp/src/hooks/services/useConnectionHook.tsx +++ b/airbyte-webapp/src/hooks/services/useConnectionHook.tsx @@ -28,6 +28,7 @@ export const connectionsKeys = { lists: () => [...connectionsKeys.all, "list"] as const, list: (filters: string) => [...connectionsKeys.lists(), { filters }] as const, detail: (connectionId: string) => [...connectionsKeys.all, "details", connectionId] as const, + getState: (connectionId: string) => [...connectionsKeys.all, "getState", connectionId] as const, }; export interface ValuesProps { @@ -215,10 +216,10 @@ const invalidateConnectionsList = async (queryClient: QueryClient) => { await queryClient.invalidateQueries(connectionsKeys.lists()); }; -const useGetConnectionState = () => { +const useGetConnectionState = (connectionId: string) => { const service = useConnectionService(); - return useMutation((connectionId: string) => service.getState(connectionId)); + return useSuspenseQuery(connectionsKeys.getState(connectionId), () => service.getState(connectionId)); }; export { diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 469b5b737b7ee4..7944c4ce2c5c62 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -400,7 +400,7 @@ "tables.destinationDeleteModalText": "This can not be un-done. Note that:\n - All connections with this destination will be deleted, including their past logs and configurations.\n - No existing data in the destination will be altered.", "tables.connectionDeleteModalText": "This can not be un-done without a full re-sync. Note that:\n - All past logs and configurations will be deleted\n - Updates of new data will stop\n - No existing data in the destination will be altered", "tables.connectionState.title": "Connection State", - "tables.connectionState.p1": "The connection's current state", + "tables.connectionState.noConnectionState": "This connection doesn't have a state (yet).", "admin.destinations": "Destinations", "admin.sources": "Sources", diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/SettingsView.tsx b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/SettingsView.tsx index a96707ef51551c..f4afc29cca3a21 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/SettingsView.tsx +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/SettingsView.tsx @@ -2,10 +2,11 @@ import React from "react"; import styled from "styled-components"; import DeleteBlock from "components/DeleteBlock"; -import StateBlock from "components/StateBlock"; import { useDeleteConnection } from "hooks/services/useConnectionHook"; +import { StateBlock } from "./StateBlock"; + interface IProps { connectionId: string; } diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.module.scss b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.module.scss new file mode 100644 index 00000000000000..a825551e736889 --- /dev/null +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.module.scss @@ -0,0 +1,5 @@ +@use "../../../../../scss/colors"; + +.stateBlock { + padding: 20px; +} diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx new file mode 100644 index 00000000000000..c1a5f426a037b9 --- /dev/null +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx @@ -0,0 +1,32 @@ +import React, { useMemo } from "react"; +import { FormattedMessage, useIntl } from "react-intl"; + +import { H5, Card, CodeEditor } from "components"; + +import { useGetConnectionState } from "hooks/services/useConnectionHook"; + +import styles from "./StateBlock.module.scss"; + +interface StateBlockProps { + connectionId: string; +} + +export const StateBlock: React.FC = ({ connectionId }) => { + const { formatMessage } = useIntl(); + const state = useGetConnectionState(connectionId); + + const stateString = useMemo(() => { + return state?.state + ? JSON.stringify(state.state, null, 2) + : formatMessage({ id: "tables.connectionState.noConnectionState" }); + }, [formatMessage, state.state]); + + return ( + +
    + +
    + +
    + ); +}; diff --git a/airbyte-webapp/src/setupProxy.js b/airbyte-webapp/src/setupProxy.js index 05f7280fac4023..2497b69547473d 100644 --- a/airbyte-webapp/src/setupProxy.js +++ b/airbyte-webapp/src/setupProxy.js @@ -10,7 +10,7 @@ module.exports = (app) => { // Set the CSP header in development to detect potential breakages. // This should always match the header in airbyte-webapp/nginx/default.conf.template app.use((req, resp, next) => { - resp.header("Content-Security-Policy", "script-src * 'unsafe-inline';"); + resp.header("Content-Security-Policy", "script-src * 'unsafe-inline'; worker-src self blob:;"); next(); }); // Serve the doc markdowns and assets that are also bundled into the docker image From bb946ae80ab70f1d6825c2bdd6f6f14d81b2a4fb Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Mon, 13 Jun 2022 13:13:41 +0200 Subject: [PATCH 18/20] Fix CSS problem --- airbyte-webapp/src/components/base/Card/Card.tsx | 3 ++- .../ConnectionItemPage/components/StateBlock.module.scss | 5 ----- .../pages/ConnectionItemPage/components/StateBlock.tsx | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.module.scss diff --git a/airbyte-webapp/src/components/base/Card/Card.tsx b/airbyte-webapp/src/components/base/Card/Card.tsx index 783563ad89bb85..b393fe39b08e0b 100644 --- a/airbyte-webapp/src/components/base/Card/Card.tsx +++ b/airbyte-webapp/src/components/base/Card/Card.tsx @@ -1,9 +1,10 @@ import styled from "styled-components"; -export const Card = styled.div<{ full?: boolean }>` +export const Card = styled.div<{ full?: boolean; $withPadding?: boolean }>` width: ${({ full }) => (full ? "100%" : "auto")}; background: ${({ theme }) => theme.whiteColor}; border-radius: 10px; box-shadow: 0 2px 4px ${({ theme }) => theme.cardShadowColor}; + padding: ${({ $withPadding }) => ($withPadding ? "20px" : undefined)}; //border: 1px solid ${({ theme }) => theme.greyColor20}; `; diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.module.scss b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.module.scss deleted file mode 100644 index a825551e736889..00000000000000 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.module.scss +++ /dev/null @@ -1,5 +0,0 @@ -@use "../../../../../scss/colors"; - -.stateBlock { - padding: 20px; -} diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx index c1a5f426a037b9..ca41ec42378d11 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx @@ -5,8 +5,6 @@ import { H5, Card, CodeEditor } from "components"; import { useGetConnectionState } from "hooks/services/useConnectionHook"; -import styles from "./StateBlock.module.scss"; - interface StateBlockProps { connectionId: string; } @@ -22,7 +20,7 @@ export const StateBlock: React.FC = ({ connectionId }) => { }, [formatMessage, state.state]); return ( - +
    From 3f75e9ec69bbd9b01f7bfe96beab187a3c7f807c Mon Sep 17 00:00:00 2001 From: Evan Tahler Date: Wed, 15 Jun 2022 11:46:39 -0700 Subject: [PATCH 19/20] Update airbyte-webapp/src/locales/en.json Co-authored-by: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> --- airbyte-webapp/src/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 7944c4ce2c5c62..15470e7f538191 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -400,7 +400,7 @@ "tables.destinationDeleteModalText": "This can not be un-done. Note that:\n - All connections with this destination will be deleted, including their past logs and configurations.\n - No existing data in the destination will be altered.", "tables.connectionDeleteModalText": "This can not be un-done without a full re-sync. Note that:\n - All past logs and configurations will be deleted\n - Updates of new data will stop\n - No existing data in the destination will be altered", "tables.connectionState.title": "Connection State", - "tables.connectionState.noConnectionState": "This connection doesn't have a state (yet).", + "tables.connectionState.noConnectionState": "This connection doesn‘t have a state (yet).", "admin.destinations": "Destinations", "admin.sources": "Sources", From 609ad34dde5f97c40d9fed9fc5324feec3f2526f Mon Sep 17 00:00:00 2001 From: evantahler Date: Fri, 17 Jun 2022 10:28:13 -0700 Subject: [PATCH 20/20] just use PRE to render state for now --- .../pages/ConnectionItemPage/components/StateBlock.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx index ca41ec42378d11..4560c0329b9678 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/components/StateBlock.tsx @@ -1,7 +1,7 @@ import React, { useMemo } from "react"; import { FormattedMessage, useIntl } from "react-intl"; -import { H5, Card, CodeEditor } from "components"; +import { H5, Card } from "components"; import { useGetConnectionState } from "hooks/services/useConnectionHook"; @@ -24,7 +24,7 @@ export const StateBlock: React.FC = ({ connectionId }) => {
    - +
    {stateString}
    ); };