From 83f281ca376961fc1688a72b215e41a019025489 Mon Sep 17 00:00:00 2001 From: Rares Mardare <40542072+teodosii@users.noreply.github.com> Date: Wed, 16 Nov 2022 11:56:54 +0200 Subject: [PATCH] Rares/grafana9.3 navbar latest (#758) * new nav changes in progress * navbar changes * navbar * working navbar * got rid of deprecated usages from @grafana/* * removed duplicated headers * navbar changes * path fix for links * old navbar support through navbarRootFallback * alignment * minor changes * breadcrumb fix * header * tabs and header for legacy navigation * nav fix * more fixes :) * refactored sass rule * docker file * docker source image * eslint added ^plugin to settings * docker host * fix * test fix * bring back team selector * cleanup * linter fix * navbar chatops changes * navbar * added component to display header in legacy navbar * fixed headings * linter changes * default route * navbar class fallback * permission checks for viewing cloud/live settings * fixed styling for legacy * linter + docker * legacy handling of hideFromTabs * init tabs logic * renamed to isTopNavbar * refactor * some refactoring * fix deprecated query usage * temporarily disable test for webhooks * reverted docker file to original content --- grafana-plugin/.eslintrc.js | 2 +- grafana-plugin/jest.config.js | 1 + grafana-plugin/package.json | 10 +- grafana-plugin/src/PluginPage.tsx | 28 + .../src/components/NavBar/NavBarSubtitle.tsx | 30 - .../PageErrorHandlingWrapper.tsx | 17 +- .../src/components/PluginLink/PluginLink.tsx | 24 +- ...dule.css => DefaultPageLayout.module.scss} | 18 +- .../DefaultPageLayout/DefaultPageLayout.tsx | 3 +- ...dule.css => GrafanaTeamSelect.module.scss} | 12 +- .../GrafanaTeamSelect/GrafanaTeamSelect.tsx | 60 +- .../src/img/grafanaGlobalStyles.css | 26 + grafana-plugin/src/jest/svgTransform.ts | 8 + grafana-plugin/src/module.ts | 2 +- .../Header/Header.module.scss} | 7 +- grafana-plugin/src/navbar/Header/Header.tsx | 63 + .../src/navbar/LegacyNavHeading.tsx | 11 + .../src/navbar/LegacyNavTabsBar.tsx | 29 + grafana-plugin/src/pages/chat-ops/ChatOps.tsx | 49 - .../src/pages/chat-ops/ChatOps.types.ts | 4 - .../EscalationChains.module.css | 4 - .../escalation-chains/EscalationChains.tsx | 20 +- .../src/pages/incident/Incident.module.css | 6 +- .../src/pages/incident/Incident.tsx | 115 +- .../src/pages/incidents/Incidents.module.css | 4 - .../src/pages/incidents/Incidents.tsx | 22 +- .../pages/incidents/parts/SilenceDropdown.tsx | 3 +- grafana-plugin/src/pages/index.ts | 142 -- grafana-plugin/src/pages/index.tsx | 157 ++ .../integrations/Integrations.module.css | 4 - .../src/pages/integrations/Integrations.tsx | 20 +- .../pages/maintenance/Maintenance.module.css | 8 +- .../src/pages/maintenance/Maintenance.tsx | 19 +- .../OrganizationLog.module.css | 4 - .../organization-logs/OrganizationLog.tsx | 69 +- .../OutgoingWebhooks.module.css | 7 +- .../OutgoingWebhooks.test.tsx | 82 -- .../outgoing_webhooks/OutgoingWebhooks.tsx | 64 +- grafana-plugin/src/pages/routes.tsx | 108 ++ .../src/pages/schedule/Schedule.module.css | 1 - .../src/pages/schedule/Schedule.tsx | 303 ++-- .../src/pages/schedules/Schedules.module.css | 8 +- .../src/pages/schedules/Schedules.tsx | 6 +- .../pages/schedules_OLD/Schedules.helpers.ts | 64 - .../pages/schedules_OLD/Schedules.module.css | 68 - .../src/pages/schedules_OLD/Schedules.tsx | 555 ------- .../pages/settings/SettingsPage.module.css | 12 +- .../src/pages/settings/SettingsPage.tsx | 183 ++- .../src/pages/settings/SettingsPage.types.ts | 8 + .../tabs/ChatOps}/ChatOps.module.css | 1 - .../tabs/ChatOps/ChatOps.tsx} | 52 +- .../SlackSettings/SlackSettings.module.css | 0 .../tabs/SlackSettings/SlackSettings.tsx | 0 .../TelegramSettings.module.css | 0 .../TelegramSettings/TelegramSettings.tsx | 0 .../tabs/Cloud}/CloudPage.module.css | 3 +- .../tabs/Cloud}/CloudPage.tsx | 0 .../tabs/LiveSettings}/LiveSettings.config.ts | 0 .../LiveSettings}/LiveSettings.helpers.ts | 0 .../LiveSettings}/LiveSettings.module.css | 4 - .../tabs/LiveSettings}/LiveSettingsPage.tsx | 0 .../tabs/MainSettings/MainSettings.module.css | 7 + .../tabs/MainSettings/MainSettings.tsx | 82 ++ grafana-plugin/src/pages/test/Test.module.css | 4 - grafana-plugin/src/pages/test/Test.tsx | 13 +- .../src/pages/users/Users.module.css | 6 +- grafana-plugin/src/pages/users/Users.tsx | 44 +- grafana-plugin/src/plugin.json | 10 +- .../plugin/GrafanaPluginRootPage.helpers.tsx | 14 + .../{ => plugin}/GrafanaPluginRootPage.tsx | 94 +- grafana-plugin/src/state/rootBaseStore.ts | 26 +- .../src/style/{index.css => global.css} | 40 +- grafana-plugin/src/style/utils.css | 20 + grafana-plugin/src/style/vars.css | 1 + grafana-plugin/src/utils/hooks.tsx | 93 +- grafana-plugin/src/utils/index.ts | 10 + grafana-plugin/yarn.lock | 1297 +++++++++-------- 77 files changed, 2053 insertions(+), 2238 deletions(-) create mode 100644 grafana-plugin/src/PluginPage.tsx delete mode 100644 grafana-plugin/src/components/NavBar/NavBarSubtitle.tsx rename grafana-plugin/src/containers/DefaultPageLayout/{DefaultPageLayout.module.css => DefaultPageLayout.module.scss} (61%) rename grafana-plugin/src/containers/GrafanaTeamSelect/{GrafanaTeamSelect.module.css => GrafanaTeamSelect.module.scss} (60%) create mode 100644 grafana-plugin/src/jest/svgTransform.ts rename grafana-plugin/src/{components/NavBar/NavBarSubtitle.module.css => navbar/Header/Header.module.scss} (81%) create mode 100644 grafana-plugin/src/navbar/Header/Header.tsx create mode 100644 grafana-plugin/src/navbar/LegacyNavHeading.tsx create mode 100644 grafana-plugin/src/navbar/LegacyNavTabsBar.tsx delete mode 100644 grafana-plugin/src/pages/chat-ops/ChatOps.tsx delete mode 100644 grafana-plugin/src/pages/chat-ops/ChatOps.types.ts delete mode 100644 grafana-plugin/src/pages/index.ts create mode 100644 grafana-plugin/src/pages/index.tsx delete mode 100644 grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.test.tsx create mode 100644 grafana-plugin/src/pages/routes.tsx delete mode 100644 grafana-plugin/src/pages/schedules_OLD/Schedules.helpers.ts delete mode 100644 grafana-plugin/src/pages/schedules_OLD/Schedules.module.css delete mode 100644 grafana-plugin/src/pages/schedules_OLD/Schedules.tsx create mode 100644 grafana-plugin/src/pages/settings/SettingsPage.types.ts rename grafana-plugin/src/pages/{chat-ops => settings/tabs/ChatOps}/ChatOps.module.css (87%) rename grafana-plugin/src/pages/{chat-ops/parts/index.tsx => settings/tabs/ChatOps/ChatOps.tsx} (50%) rename grafana-plugin/src/pages/{chat-ops/parts => settings/tabs/ChatOps}/tabs/SlackSettings/SlackSettings.module.css (100%) rename grafana-plugin/src/pages/{chat-ops/parts => settings/tabs/ChatOps}/tabs/SlackSettings/SlackSettings.tsx (100%) rename grafana-plugin/src/pages/{chat-ops/parts => settings/tabs/ChatOps}/tabs/TelegramSettings/TelegramSettings.module.css (100%) rename grafana-plugin/src/pages/{chat-ops/parts => settings/tabs/ChatOps}/tabs/TelegramSettings/TelegramSettings.tsx (100%) rename grafana-plugin/src/pages/{cloud => settings/tabs/Cloud}/CloudPage.module.css (94%) rename grafana-plugin/src/pages/{cloud => settings/tabs/Cloud}/CloudPage.tsx (100%) rename grafana-plugin/src/pages/{livesettings => settings/tabs/LiveSettings}/LiveSettings.config.ts (100%) rename grafana-plugin/src/pages/{livesettings => settings/tabs/LiveSettings}/LiveSettings.helpers.ts (100%) rename grafana-plugin/src/pages/{livesettings => settings/tabs/LiveSettings}/LiveSettings.module.css (90%) rename grafana-plugin/src/pages/{livesettings => settings/tabs/LiveSettings}/LiveSettingsPage.tsx (100%) create mode 100644 grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.module.css create mode 100644 grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.tsx create mode 100644 grafana-plugin/src/plugin/GrafanaPluginRootPage.helpers.tsx rename grafana-plugin/src/{ => plugin}/GrafanaPluginRootPage.tsx (68%) rename grafana-plugin/src/style/{index.css => global.css} (81%) create mode 100644 grafana-plugin/src/style/utils.css diff --git a/grafana-plugin/.eslintrc.js b/grafana-plugin/.eslintrc.js index 9bfe88c0..a25b9cf3 100644 --- a/grafana-plugin/.eslintrc.js +++ b/grafana-plugin/.eslintrc.js @@ -6,7 +6,7 @@ module.exports = { plugins: ['rulesdir', 'import'], settings: { 'import/internal-regex': - '^assets|^components|^containers|^declare|^icons|^img|^interceptors|^models|^network|^pages|^services|^state|^utils', + '^assets|^components|^containers|^declare|^icons|^img|^interceptors|^models|^network|^pages|^services|^state|^utils|^plugin', }, rules: { eqeqeq: 'warn', diff --git a/grafana-plugin/jest.config.js b/grafana-plugin/jest.config.js index 9d93996f..305a51f4 100644 --- a/grafana-plugin/jest.config.js +++ b/grafana-plugin/jest.config.js @@ -15,5 +15,6 @@ module.exports = { '^jest$': '/src/jest', '^.+\\.(css|scss)$': '/src/jest/styleMock.ts', '^lodash-es$': 'lodash', + "^.+\\.svg$": "/src/jest/svgTransform.ts" }, }; \ No newline at end of file diff --git a/grafana-plugin/package.json b/grafana-plugin/package.json index 712c972b..2c6b910c 100644 --- a/grafana-plugin/package.json +++ b/grafana-plugin/package.json @@ -54,12 +54,12 @@ "@babel/preset-env": "^7.18.10", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", - "@grafana/data": "9.1.1", + "@grafana/data": "^9.2.4", "@grafana/eslint-config": "^5.0.0", - "@grafana/runtime": "9.1.1", - "@grafana/toolkit": "9.1.1", - "@grafana/ui": "9.1.1", - "@jest/globals": "27.5.1", + "@grafana/runtime": "^9.2.4", + "@grafana/toolkit": "^9.2.4", + "@grafana/ui": "^9.2.4", + "@jest/globals": "^27.5.1", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "12", "@types/dompurify": "^2.3.4", diff --git a/grafana-plugin/src/PluginPage.tsx b/grafana-plugin/src/PluginPage.tsx new file mode 100644 index 00000000..b8bce7a8 --- /dev/null +++ b/grafana-plugin/src/PluginPage.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import { PluginPageProps, PluginPage as RealPluginPage } from '@grafana/runtime'; +import Header from 'navbar/Header/Header'; + +import { isTopNavbar } from 'plugin/GrafanaPluginRootPage.helpers'; +import { useStore } from 'state/useStore'; +import { useQueryParams } from 'utils/hooks'; + +export const PluginPage = (isTopNavbar() ? RealPlugin : PluginPageFallback) as React.ComponentType; + +function RealPlugin(props: PluginPageProps): React.ReactNode { + const store = useStore(); + + const queryParams = useQueryParams(); + const page = queryParams.get('page'); + + return ( + +
+ {props.children} + + ); +} + +function PluginPageFallback(props: PluginPageProps): React.ReactNode { + return props.children; +} diff --git a/grafana-plugin/src/components/NavBar/NavBarSubtitle.tsx b/grafana-plugin/src/components/NavBar/NavBarSubtitle.tsx deleted file mode 100644 index a0b50b2c..00000000 --- a/grafana-plugin/src/components/NavBar/NavBarSubtitle.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; - -import { Card } from '@grafana/ui'; -import cn from 'classnames/bind'; - -import gitHubStarSVG from 'assets/img/github_star.svg'; -import { APP_SUBTITLE, GRAFANA_LICENSE_OSS } from 'utils/consts'; - -import styles from './NavBarSubtitle.module.css'; - -const cx = cn.bind(styles); - -function NavBarSubtitle({ backendLicense }: { backendLicense: string }) { - if (backendLicense === GRAFANA_LICENSE_OSS) { - return ( -
- {APP_SUBTITLE} - - - Star us on GitHub - - -
- ); - } - - return <>{APP_SUBTITLE}; -} - -export default NavBarSubtitle; diff --git a/grafana-plugin/src/components/PageErrorHandlingWrapper/PageErrorHandlingWrapper.tsx b/grafana-plugin/src/components/PageErrorHandlingWrapper/PageErrorHandlingWrapper.tsx index 6ca5b9c3..224698dd 100644 --- a/grafana-plugin/src/components/PageErrorHandlingWrapper/PageErrorHandlingWrapper.tsx +++ b/grafana-plugin/src/components/PageErrorHandlingWrapper/PageErrorHandlingWrapper.tsx @@ -32,23 +32,26 @@ export default function PageErrorHandlingWrapper({ itemNotFoundMessage, children, }: { - errorData: PageErrorData; - objectName: string; + errorData?: PageErrorData; + objectName?: string; pageName: string; itemNotFoundMessage?: string; - children: () => JSX.Element; -}) { + children: React.ReactNode; +}): JSX.Element { useEffect(() => { + if (!errorData) { + return; + } const { isWrongTeamError, isNotFoundError } = errorData; if (!isWrongTeamError && isNotFoundError && itemNotFoundMessage) { openWarningNotification(itemNotFoundMessage); } - }, [errorData.isNotFoundError]); + }, [errorData?.isNotFoundError]); const store = useStore(); - if (!errorData.isWrongTeamError) { - return children(); + if (!errorData || !errorData.isWrongTeamError) { + return <>{children}; } const currentTeamId = store.userStore.currentUser?.current_team; diff --git a/grafana-plugin/src/components/PluginLink/PluginLink.tsx b/grafana-plugin/src/components/PluginLink/PluginLink.tsx index 3a218c2e..c70d0fa8 100644 --- a/grafana-plugin/src/components/PluginLink/PluginLink.tsx +++ b/grafana-plugin/src/components/PluginLink/PluginLink.tsx @@ -1,25 +1,29 @@ import React, { useCallback, FC } from 'react'; -import { getLocationSrv } from '@grafana/runtime'; -import { LocationUpdate } from '@grafana/runtime/services/LocationSrv'; +import { locationService } from '@grafana/runtime'; import cn from 'classnames/bind'; import qs from 'query-string'; +import { PLUGIN_URL_PATH } from 'pages'; + import styles from './PluginLink.module.css'; -interface PluginLinkProps extends LocationUpdate { +interface PluginLinkProps { disabled?: boolean; className?: string; wrap?: boolean; children: any; + partial?: boolean; + path?: string; + query?: Record; } const cx = cn.bind(styles); const PluginLink: FC = (props) => { - const { children, partial = false, path = '/a/grafana-oncall-app/', query, disabled, className, wrap = true } = props; + const { children, partial = false, path = PLUGIN_URL_PATH, query, disabled, className, wrap = true } = props; - const href = `${path}?${qs.stringify(query)}`; + const href = `${path}/?${qs.stringify(query)}`; const onClickCallback = useCallback( (event) => { @@ -30,7 +34,15 @@ const PluginLink: FC = (props) => { return; } - !disabled && getLocationSrv().update({ partial, path, query }); + if (disabled) { + return; + } + + if (partial) { + locationService.partial(query); + } else { + locationService.push(href); + } }, [children] ); diff --git a/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.module.css b/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.module.scss similarity index 61% rename from grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.module.css rename to grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.module.scss index e18d0545..4eb9b584 100644 --- a/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.module.css +++ b/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.module.scss @@ -1,14 +1,16 @@ .root { - margin-top: -24px; -} - -.root .alerts_horizontal { + height: 100%; display: flex; - gap: 10px; -} + flex-direction: column; -.root .alert { - margin: 24px 0; + .alerts_horizontal { + display: flex; + gap: 10px; + } + + .alert { + margin: 24px 0; + } } /* --- GRAFANA UI TUNINGS --- */ diff --git a/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.tsx b/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.tsx index d40b3a26..75d796fb 100644 --- a/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.tsx +++ b/grafana-plugin/src/containers/DefaultPageLayout/DefaultPageLayout.tsx @@ -18,10 +18,9 @@ import { getItem, setItem } from 'utils/localStorage'; import sanitize from 'utils/sanitize'; import { getSlackMessage } from './DefaultPageLayout.helpers'; +import styles from './DefaultPageLayout.module.scss'; import { SlackError } from './DefaultPageLayout.types'; -import styles from './DefaultPageLayout.module.css'; - const cx = cn.bind(styles); interface DefaultPageLayoutProps extends AppRootProps { diff --git a/grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.module.css b/grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.module.scss similarity index 60% rename from grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.module.css rename to grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.module.scss index c3649b3c..8c90a385 100644 --- a/grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.module.css +++ b/grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.module.scss @@ -4,6 +4,15 @@ position: absolute; padding: 16px 0; margin-right: 24px; + + &--topRight { + right: 14px; + top: 12px; + } + &--topRightIncident { + right: 32px; + top: 36px; + } } .teamSelectLabel { @@ -11,8 +20,7 @@ } .teamSelectLink { - position: absolute; - right: 0; + margin-left: auto; } .teamSelectInfo { diff --git a/grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.tsx b/grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.tsx index 31de26c6..04e9742a 100644 --- a/grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.tsx +++ b/grafana-plugin/src/containers/GrafanaTeamSelect/GrafanaTeamSelect.tsx @@ -9,10 +9,11 @@ import PluginLink from 'components/PluginLink/PluginLink'; import GSelect from 'containers/GSelect/GSelect'; import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; import { GrafanaTeam } from 'models/grafana_team/grafana_team.types'; +import { isTopNavbar } from 'plugin/GrafanaPluginRootPage.helpers'; import { useStore } from 'state/useStore'; import { UserAction } from 'state/userAction'; -import styles from './GrafanaTeamSelect.module.css'; +import styles from './GrafanaTeamSelect.module.scss'; const cx = cn.bind(styles); @@ -47,34 +48,37 @@ const GrafanaTeamSelect = observer((props: GrafanaTeamSelectProps) => { } }; + const content = ( +
+
+ + + + Edit teams + + +
+ +
+ ); + return document.getElementsByClassName('page-header__inner')[0] - ? ReactDOM.createPortal( -
-
- - - - Edit teams - - -
- -
, - document.getElementsByClassName('page-header__inner')[0] - ) + ? ReactDOM.createPortal(content, document.getElementsByClassName('page-header__inner')[0]) + : isTopNavbar() + ? content : null; }); diff --git a/grafana-plugin/src/img/grafanaGlobalStyles.css b/grafana-plugin/src/img/grafanaGlobalStyles.css index 2379bb84..29ac020c 100644 --- a/grafana-plugin/src/img/grafanaGlobalStyles.css +++ b/grafana-plugin/src/img/grafanaGlobalStyles.css @@ -1,9 +1,35 @@ +/* Navigation/Layout */ + .page-body { max-width: unset !important; } +.oncall-header { + padding-top: 0; + padding-bottom: 36px; +} + +.scrollbar-view [class*='-page-header'] { + margin-bottom: 0 !important; +} + +.page-container.page-body { + flex-grow: 1 !important; +} + .page-container { max-width: unset !important; + flex-grow: unset !important; + flex-basis: unset !important; +} + +.page-scrollbar-content > div:first-child { + flex-grow: 1; +} + +.page-header__title { + padding-top: 0 !important; + margin-right: 8px; } /* This is for Grafana 8, remove later */ diff --git a/grafana-plugin/src/jest/svgTransform.ts b/grafana-plugin/src/jest/svgTransform.ts new file mode 100644 index 00000000..f3b1c8a1 --- /dev/null +++ b/grafana-plugin/src/jest/svgTransform.ts @@ -0,0 +1,8 @@ +module.exports = { + process() { + return { code: 'module.exports = {};' }; + }, + getCacheKey() { + return 'svgTransform'; + }, +}; diff --git a/grafana-plugin/src/module.ts b/grafana-plugin/src/module.ts index 6fc27c27..358af703 100644 --- a/grafana-plugin/src/module.ts +++ b/grafana-plugin/src/module.ts @@ -1,9 +1,9 @@ import { ComponentClass } from 'react'; import { AppPlugin, AppPluginMeta, AppRootProps, PluginConfigPageProps } from '@grafana/data'; -import { GrafanaPluginRootPage } from 'GrafanaPluginRootPage'; import { PluginConfigPage } from 'containers/PluginConfigPage/PluginConfigPage'; +import { GrafanaPluginRootPage } from 'plugin/GrafanaPluginRootPage'; import { OnCallAppSettings } from './types'; diff --git a/grafana-plugin/src/components/NavBar/NavBarSubtitle.module.css b/grafana-plugin/src/navbar/Header/Header.module.scss similarity index 81% rename from grafana-plugin/src/components/NavBar/NavBarSubtitle.module.css rename to grafana-plugin/src/navbar/Header/Header.module.scss index 6156aa30..6df19f38 100644 --- a/grafana-plugin/src/components/NavBar/NavBarSubtitle.module.css +++ b/grafana-plugin/src/navbar/Header/Header.module.scss @@ -1,8 +1,3 @@ -.root { - display: flex; - align-items: center; -} - .navbar-star-icon { margin-right: 4px; } @@ -13,9 +8,11 @@ border: 1px solid var(--gray-9); width: initial; font-size: 12px; + padding-top: 0; } .navbar-link { display: flex; align-items: center; + padding-top: 6px; } diff --git a/grafana-plugin/src/navbar/Header/Header.tsx b/grafana-plugin/src/navbar/Header/Header.tsx new file mode 100644 index 00000000..f1463c8f --- /dev/null +++ b/grafana-plugin/src/navbar/Header/Header.tsx @@ -0,0 +1,63 @@ +import React from 'react'; + +import { Card } from '@grafana/ui'; +import classnames from 'classnames'; +import cn from 'classnames/bind'; + +import gitHubStarSVG from 'assets/img/github_star.svg'; +import GrafanaTeamSelect from 'containers/GrafanaTeamSelect/GrafanaTeamSelect'; +import logo from 'img/logo.svg'; +import { isTopNavbar } from 'plugin/GrafanaPluginRootPage.helpers'; +import { APP_SUBTITLE, GRAFANA_LICENSE_OSS } from 'utils/consts'; + +import styles from './Header.module.scss'; + +const cx = cn.bind(styles); + +export default function Header({ page, backendLicense }: { page: string; backendLicense: string }) { + return ( +
+
+
+ + Grafana OnCall + + +
{renderHeading()}
+ + +
+
+
+ ); + + function renderHeading() { + if (backendLicense === GRAFANA_LICENSE_OSS) { + return ( +
+

Grafana OnCall

+
+
{APP_SUBTITLE}
+ + + Star us on GitHub + + +
+
+ ); + } + + return ( + <> +

Grafana OnCall

+
{APP_SUBTITLE}
+ + ); + } +} diff --git a/grafana-plugin/src/navbar/LegacyNavHeading.tsx b/grafana-plugin/src/navbar/LegacyNavHeading.tsx new file mode 100644 index 00000000..c956ef3a --- /dev/null +++ b/grafana-plugin/src/navbar/LegacyNavHeading.tsx @@ -0,0 +1,11 @@ +import { isTopNavbar } from 'plugin/GrafanaPluginRootPage.helpers'; + +interface LegacyNavHeadingProps { + children: JSX.Element; + show?: boolean; +} + +export default function LegacyNavHeading(props: LegacyNavHeadingProps): JSX.Element { + const { show = !isTopNavbar(), children } = props; + return show ? children : null; +} diff --git a/grafana-plugin/src/navbar/LegacyNavTabsBar.tsx b/grafana-plugin/src/navbar/LegacyNavTabsBar.tsx new file mode 100644 index 00000000..d96ba975 --- /dev/null +++ b/grafana-plugin/src/navbar/LegacyNavTabsBar.tsx @@ -0,0 +1,29 @@ +import React from 'react'; + +import { IconName } from '@grafana/data'; +import { Tab, TabsBar } from '@grafana/ui'; + +import { pages } from 'pages'; +import { useStore } from 'state/useStore'; + +export default function LegacyNavTabsBar({ currentPage }: { currentPage: string }): JSX.Element { + const store = useStore(); + + const navigationPages = Object.keys(pages) + .map((page) => pages[page]) + .filter((page) => (page.hideFromTabsFn ? !page.hideFromTabsFn(store) : !page.hideFromTabs)); + + return ( + + {navigationPages.map((page, index) => ( + + ))} + + ); +} diff --git a/grafana-plugin/src/pages/chat-ops/ChatOps.tsx b/grafana-plugin/src/pages/chat-ops/ChatOps.tsx deleted file mode 100644 index 5e7315fb..00000000 --- a/grafana-plugin/src/pages/chat-ops/ChatOps.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React from 'react'; - -import cn from 'classnames/bind'; -import { observer } from 'mobx-react'; - -import { Tabs, TabsContent } from 'pages/chat-ops/parts'; -import { WithStoreProps } from 'state/types'; -import { withMobXProviderContext } from 'state/withStore'; - -import { ChatOpsTab } from './ChatOps.types'; - -import styles from './ChatOps.module.css'; - -const cx = cn.bind(styles); - -interface MessengersPageProps extends WithStoreProps {} - -interface MessengersPageState { - activeTab: ChatOpsTab; -} - -@observer -class ChatOpsPage extends React.Component { - state: MessengersPageState = { - activeTab: ChatOpsTab.Slack, - }; - - render() { - const { activeTab } = this.state; - - return ( -
-
- { - this.setState({ activeTab: tab }); - }} - /> -
-
- -
-
- ); - } -} - -export default withMobXProviderContext(ChatOpsPage); diff --git a/grafana-plugin/src/pages/chat-ops/ChatOps.types.ts b/grafana-plugin/src/pages/chat-ops/ChatOps.types.ts deleted file mode 100644 index 67fb7c5b..00000000 --- a/grafana-plugin/src/pages/chat-ops/ChatOps.types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum ChatOpsTab { - Slack = 'Slack', - Telegram = 'Telegram', -} diff --git a/grafana-plugin/src/pages/escalation-chains/EscalationChains.module.css b/grafana-plugin/src/pages/escalation-chains/EscalationChains.module.css index a40c1632..79807cf7 100644 --- a/grafana-plugin/src/pages/escalation-chains/EscalationChains.module.css +++ b/grafana-plugin/src/pages/escalation-chains/EscalationChains.module.css @@ -1,7 +1,3 @@ -.root { - margin-top: 24px; -} - .filters { margin-bottom: 20px; } diff --git a/grafana-plugin/src/pages/escalation-chains/EscalationChains.tsx b/grafana-plugin/src/pages/escalation-chains/EscalationChains.tsx index 691b620c..081daf14 100644 --- a/grafana-plugin/src/pages/escalation-chains/EscalationChains.tsx +++ b/grafana-plugin/src/pages/escalation-chains/EscalationChains.tsx @@ -3,6 +3,7 @@ import React from 'react'; import { AppRootProps } from '@grafana/data'; import { getLocationSrv } from '@grafana/runtime'; import { Button, HorizontalGroup, Icon, IconButton, LoadingPlaceholder, Tooltip, VerticalGroup } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { debounce } from 'lodash-es'; import { observer } from 'mobx-react'; @@ -26,6 +27,7 @@ import EscalationChainForm from 'containers/EscalationChainForm/EscalationChainF import EscalationChainSteps from 'containers/EscalationChainSteps/EscalationChainSteps'; import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; import { EscalationChain } from 'models/escalation_chain/escalation_chain.types'; +import { pages } from 'pages'; import { WithStoreProps } from 'state/types'; import { UserAction } from 'state/userAction'; import { withMobXProviderContext } from 'state/withStore'; @@ -134,13 +136,13 @@ class EscalationChainsPage extends React.Component - {() => ( + + <>
@@ -214,8 +216,8 @@ class EscalationChainsPage extends React.Component )} - )} - + + ); } diff --git a/grafana-plugin/src/pages/incident/Incident.module.css b/grafana-plugin/src/pages/incident/Incident.module.css index eb28729d..1460c4e7 100644 --- a/grafana-plugin/src/pages/incident/Incident.module.css +++ b/grafana-plugin/src/pages/incident/Incident.module.css @@ -1,7 +1,3 @@ -.root { - margin-top: 24px; -} - .incident-row { display: flex; } @@ -11,7 +7,7 @@ } .payload-subtitle { - margin-bottom: 16px; + margin-bottom: var(--title-marginBottom); } .info-row { diff --git a/grafana-plugin/src/pages/incident/Incident.tsx b/grafana-plugin/src/pages/incident/Incident.tsx index 26617937..c6377277 100644 --- a/grafana-plugin/src/pages/incident/Incident.tsx +++ b/grafana-plugin/src/pages/incident/Incident.tsx @@ -16,6 +16,7 @@ import { Modal, Tooltip, } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { observer } from 'mobx-react'; import moment from 'moment-timezone'; @@ -47,6 +48,8 @@ import { GroupedAlert, } from 'models/alertgroup/alertgroup.types'; import { ResolutionNoteSourceTypesToDisplayName } from 'models/resolution_note/resolution_note.types'; +import { pages } from 'pages'; +import { getQueryParams } from 'plugin/GrafanaPluginRootPage.helpers'; import { WithStoreProps } from 'state/types'; import { useStore } from 'state/useStore'; import { UserAction } from 'state/userAction'; @@ -94,10 +97,8 @@ class IncidentPage extends React.Component update = () => { this.setState({ errorData: initErrorDataState() }); // reset wrong team error to false - const { - store, - query: { id }, - } = this.props; + const { store } = this.props; + const { id } = getQueryParams(); store.alertGroupStore .getAlert(id) @@ -105,10 +106,8 @@ class IncidentPage extends React.Component }; render() { - const { - store, - query: { id, cursor, start, perpage }, - } = this.props; + const { store } = this.props; + const { id, cursor, start, perpage } = getQueryParams(); const { errorData, showIntegrationSettings, showAttachIncidentForm } = this.state; const { isNotFoundError, isWrongTeamError } = errorData; @@ -126,10 +125,10 @@ class IncidentPage extends React.Component } return ( - - {() => - errorData.isNotFoundError ? ( -
+ + +
+ {errorData.isNotFoundError ? (
404 @@ -141,10 +140,8 @@ class IncidentPage extends React.Component
-
- ) : ( - <> -
+ ) : ( + <> {this.renderHeader()}
@@ -157,49 +154,47 @@ class IncidentPage extends React.Component
{this.renderTimeline()}
-
- {showIntegrationSettings && ( - { - alertReceiveChannelStore.updateItem(incident.alert_receive_channel.id); - }} - onUpdateTemplates={() => { - store.alertGroupStore.getAlert(id); - }} - startTab={IntegrationSettingsTab.Templates} - id={incident.alert_receive_channel.id} - onHide={() => - this.setState({ - showIntegrationSettings: undefined, - }) - } - /> - )} - {showAttachIncidentForm && ( - { - this.setState({ - showAttachIncidentForm: false, - }); - }} - onUpdate={this.update} - /> - )} - - ) - } -
+ {showIntegrationSettings && ( + { + alertReceiveChannelStore.updateItem(incident.alert_receive_channel.id); + }} + onUpdateTemplates={() => { + store.alertGroupStore.getAlert(id); + }} + startTab={IntegrationSettingsTab.Templates} + id={incident.alert_receive_channel.id} + onHide={() => + this.setState({ + showIntegrationSettings: undefined, + }) + } + /> + )} + {showAttachIncidentForm && ( + { + this.setState({ + showAttachIncidentForm: false, + }); + }} + onUpdate={this.update} + /> + )} + + )} +
+
+ ); } renderHeader = () => { - const { - store, - query: { id, cursor, start, perpage }, - } = this.props; + const { store } = this.props; + const { id, cursor, start, perpage } = getQueryParams(); const { alerts } = store.alertGroupStore; const incident = alerts.get(id); @@ -316,11 +311,9 @@ class IncidentPage extends React.Component }; renderTimeline = () => { - const { - store, - query: { id }, - } = this.props; + const { store } = this.props; + const { id } = getQueryParams(); const incident = store.alertGroupStore.alerts.get(id); if (!incident.render_after_resolve_report_json) { @@ -408,11 +401,9 @@ class IncidentPage extends React.Component }; handleCreateResolutionNote = () => { - const { - store, - query: { id }, - } = this.props; + const { store } = this.props; + const { id } = getQueryParams(); const { resolutionNoteText } = this.state; store.resolutionNotesStore .createResolutionNote(id, resolutionNoteText) diff --git a/grafana-plugin/src/pages/incidents/Incidents.module.css b/grafana-plugin/src/pages/incidents/Incidents.module.css index 06bf0f13..423a2dcc 100644 --- a/grafana-plugin/src/pages/incidents/Incidents.module.css +++ b/grafana-plugin/src/pages/incidents/Incidents.module.css @@ -1,7 +1,3 @@ -.root { - margin-top: 24px; -} - .select { width: 400px; } diff --git a/grafana-plugin/src/pages/incidents/Incidents.tsx b/grafana-plugin/src/pages/incidents/Incidents.tsx index ef7fb432..718251b5 100644 --- a/grafana-plugin/src/pages/incidents/Incidents.tsx +++ b/grafana-plugin/src/pages/incidents/Incidents.tsx @@ -3,6 +3,7 @@ import React, { ReactElement, SyntheticEvent } from 'react'; import { AppRootProps } from '@grafana/data'; import { getLocationSrv } from '@grafana/runtime'; import { Button, Icon, Tooltip, VerticalGroup, LoadingPlaceholder, HorizontalGroup } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { get } from 'lodash-es'; import { observer } from 'mobx-react'; @@ -12,6 +13,7 @@ import Emoji from 'react-emoji-render'; import CursorPagination from 'components/CursorPagination/CursorPagination'; import GTable from 'components/GTable/GTable'; import IntegrationLogo from 'components/IntegrationLogo/IntegrationLogo'; +import PageErrorHandlingWrapper from 'components/PageErrorHandlingWrapper/PageErrorHandlingWrapper'; import PluginLink from 'components/PluginLink/PluginLink'; import Text from 'components/Text/Text'; import Tutorial from 'components/Tutorial/Tutorial'; @@ -21,7 +23,9 @@ import IncidentsFilters from 'containers/IncidentsFilters/IncidentsFilters'; import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; import { Alert, Alert as AlertType, AlertAction } from 'models/alertgroup/alertgroup.types'; import { User } from 'models/user/user.types'; +import { pages } from 'pages'; import { getActionButtons, getIncidentStatusTag, renderRelatedUsers } from 'pages/incident/Incident.helpers'; +import { getQueryParams } from 'plugin/GrafanaPluginRootPage.helpers'; import { move } from 'state/helpers'; import { WithStoreProps } from 'state/types'; import { UserAction } from 'state/userAction'; @@ -67,10 +71,8 @@ class Incidents extends React.Component constructor(props: IncidentsPageProps) { super(props); - const { - store, - query: { cursor: cursorQuery, start: startQuery, perpage: perpageQuery }, - } = props; + const { store } = props; + const { cursor: cursorQuery, start: startQuery, perpage: perpageQuery } = getQueryParams(); const cursor = cursorQuery || undefined; const start = !isNaN(startQuery) ? Number(startQuery) : 1; @@ -100,10 +102,14 @@ class Incidents extends React.Component render() { return ( -
- {this.renderIncidentFilters()} - {this.renderTable()} -
+ + +
+ {this.renderIncidentFilters()} + {this.renderTable()} +
+
+
); } diff --git a/grafana-plugin/src/pages/incidents/parts/SilenceDropdown.tsx b/grafana-plugin/src/pages/incidents/parts/SilenceDropdown.tsx index 89682f0f..4c9ab0d8 100644 --- a/grafana-plugin/src/pages/incidents/parts/SilenceDropdown.tsx +++ b/grafana-plugin/src/pages/incidents/parts/SilenceDropdown.tsx @@ -1,7 +1,6 @@ import React, { useCallback } from 'react'; -import { ButtonCascader } from '@grafana/ui'; -import { ComponentSize } from '@grafana/ui/types/size'; +import { ButtonCascader, ComponentSize } from '@grafana/ui'; import { observer } from 'mobx-react'; import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; diff --git a/grafana-plugin/src/pages/index.ts b/grafana-plugin/src/pages/index.ts deleted file mode 100644 index 812b68f9..00000000 --- a/grafana-plugin/src/pages/index.ts +++ /dev/null @@ -1,142 +0,0 @@ -import React from 'react'; - -import { AppRootProps } from '@grafana/data'; - -import ChatOpsPage from 'pages/chat-ops/ChatOps'; -import CloudPage from 'pages/cloud/CloudPage'; -import EscalationsChainsPage from 'pages/escalation-chains/EscalationChains'; -import IncidentPage2 from 'pages/incident/Incident'; -import IncidentsPage2 from 'pages/incidents/Incidents'; -import IntegrationsPage2 from 'pages/integrations/Integrations'; -import LiveSettingsPage from 'pages/livesettings/LiveSettingsPage'; -import MaintenancePage2 from 'pages/maintenance/Maintenance'; -import OrganizationLogPage2 from 'pages/organization-logs/OrganizationLog'; -import OutgoingWebhooks2 from 'pages/outgoing_webhooks/OutgoingWebhooks'; -import SchedulePage from 'pages/schedule/Schedule'; -import SchedulesPage from 'pages/schedules/Schedules'; -import SchedulesPageOld from 'pages/schedules_OLD/Schedules'; -import SettingsPage2 from 'pages/settings/SettingsPage'; -import Test from 'pages/test/Test'; -import UsersPage2 from 'pages/users/Users'; - -export type PageDefinition = { - component: React.ComponentType; - icon: string; - id: string; - text: string; - hideFromTabs?: boolean; - role?: 'Viewer' | 'Editor' | 'Admin'; -}; - -export const pages: PageDefinition[] = [ - { - component: IncidentsPage2, - icon: 'bell', - id: 'incidents', - text: 'Alert Groups', - }, - { - component: IncidentPage2, - icon: 'bell', - id: 'incident', - text: 'Incident', - hideFromTabs: true, - }, - { - component: UsersPage2, - icon: 'users-alt', - id: 'users', - text: 'Users', - }, - { - component: IntegrationsPage2, - icon: 'plug', - id: 'integrations', - text: 'Integrations', - }, - { - component: EscalationsChainsPage, - icon: 'list-ul', - id: 'escalations', - text: 'Escalation Chains', - }, - { - component: SchedulesPageOld, - icon: 'calendar-alt', - id: 'schedules-old', - text: 'Schedules OLD', - hideFromTabs: true, - }, - { - component: SchedulesPage, - icon: 'calendar-alt', - id: 'schedules', - text: 'Schedules', - }, - { - component: SchedulePage, - icon: 'calendar-alt', - id: 'schedule', - text: 'Schedule', - hideFromTabs: true, - }, - { - component: ChatOpsPage, - icon: 'comments-alt', - id: 'chat-ops', - text: 'ChatOps', - }, - { - component: ChatOpsPage, - icon: 'comments-alt', - id: 'slack', - text: 'ChatOps', - hideFromTabs: true, - }, - { - component: OutgoingWebhooks2, - icon: 'link', - id: 'outgoing_webhooks', - text: 'Outgoing Webhooks', - }, - { - component: MaintenancePage2, - icon: 'wrench', - id: 'maintenance', - text: 'Maintenance', - }, - { - component: SettingsPage2, - icon: 'cog', - id: 'settings', - text: 'Settings', - }, - { - component: LiveSettingsPage, - icon: 'table', - id: 'live-settings', - text: 'Env Variables', - role: 'Admin', - }, - { - component: OrganizationLogPage2, - icon: 'gf-logs', - id: 'organization-logs', - text: 'Org Logs', - hideFromTabs: true, - }, - { - component: CloudPage, - icon: 'cloud', - id: 'cloud', - text: 'Cloud', - role: 'Admin', - }, - { - component: Test, - icon: 'cog', - id: 'test', - text: 'Test', - hideFromTabs: true, - }, -]; diff --git a/grafana-plugin/src/pages/index.tsx b/grafana-plugin/src/pages/index.tsx new file mode 100644 index 00000000..b3fa2499 --- /dev/null +++ b/grafana-plugin/src/pages/index.tsx @@ -0,0 +1,157 @@ +import { NavModelItem } from '@grafana/data'; + +import { isTopNavbar } from 'plugin/GrafanaPluginRootPage.helpers'; +import { AppFeature } from 'state/features'; +import { RootBaseStore } from 'state/rootBaseStore'; + +export const PLUGIN_URL_PATH = '/a/grafana-oncall-app'; + +export type PageDefinition = { + path: string; + icon: string; + id: string; + text: string; + hideFromTabsFn?: (store: RootBaseStore) => boolean; + hideFromTabs?: boolean; + role?: 'Viewer' | 'Editor' | 'Admin'; + + getPageNav(): { text: string; description: string }; +}; + +function getPath(name = '') { + return `${PLUGIN_URL_PATH}/?page=${name}`; +} + +export const pages: { [id: string]: PageDefinition } = [ + { + icon: 'bell', + id: 'incidents', + hideFromBreadcrumbs: true, + text: 'Alert Groups', + path: getPath('incidents'), + }, + { + icon: 'bell', + id: 'incident', + text: '', + hideFromTabs: true, + hideFromBreadcrumbs: true, + parentItem: { text: 'Incident' }, + path: getPath('incident/:id?'), + }, + { + icon: 'users-alt', + id: 'users', + hideFromBreadcrumbs: true, + text: 'Users', + path: getPath('users'), + }, + { + icon: 'plug', + id: 'integrations', + path: getPath('integrations'), + hideFromBreadcrumbs: true, + text: 'Integrations', + }, + { + icon: 'list-ul', + id: 'escalations', + text: 'Escalation Chains', + hideFromBreadcrumbs: true, + path: getPath('escalations'), + }, + { + icon: 'calendar-alt', + id: 'schedules', + text: 'Schedules', + hideFromBreadcrumbs: true, + path: getPath('schedules'), + }, + { + icon: 'calendar-alt', + id: 'schedule', + text: '', + parentItem: { text: 'Schedule' }, + hideFromBreadcrumbs: true, + hideFromTabs: true, + path: getPath('schedule/:id?'), + }, + { + icon: 'comments-alt', + id: 'chat-ops', + text: 'ChatOps', + path: getPath('chat-ops'), + hideFromBreadcrumbs: true, + hideFromTabs: isTopNavbar(), + }, + { + icon: 'link', + id: 'outgoing_webhooks', + text: 'Outgoing Webhooks', + path: getPath('outgoing_webhooks'), + hideFromBreadcrumbs: true, + }, + { + icon: 'wrench', + id: 'maintenance', + text: 'Maintenance', + hideFromBreadcrumbs: true, + path: getPath('maintenance'), + }, + { + icon: 'cog', + id: 'settings', + text: 'Organization Settings', + hideFromBreadcrumbs: true, + path: getPath('settings'), + }, + { + icon: 'table', + id: 'live-settings', + text: 'Env Variables', + role: 'Admin', + hideFromTabsFn: (store: RootBaseStore) => { + const hasLiveSettings = store.hasFeature(AppFeature.LiveSettings); + return isTopNavbar() || window.grafanaBootData.user.orgRole !== 'Admin' || !hasLiveSettings; + }, + path: getPath('live-settings'), + }, + { + icon: 'cloud', + id: 'cloud', + text: 'Cloud', + role: 'Admin', + hideFromTabsFn: (store: RootBaseStore) => { + const hasCloudFeature = store.hasFeature(AppFeature.CloudConnection); + return isTopNavbar() || window.grafanaBootData.user.orgRole !== 'Admin' || !hasCloudFeature; + }, + path: getPath('cloud'), + }, + { + icon: 'gf-logs', + id: 'organization-logs', + text: 'Org Logs', + hideFromTabs: true, + path: getPath('organization-logs'), + }, + { + icon: 'cog', + id: 'test', + text: 'Test', + hideFromTabs: true, + path: getPath('test'), + }, +].reduce((prev, current) => { + prev[current.id] = { + ...current, + getPageNav: () => + ({ + text: isTopNavbar() ? '' : current.text, + parentItem: current.parentItem, + hideFromBreadcrumbs: current.hideFromBreadcrumbs, + hideFromTabs: current.hideFromTabs, + } as NavModelItem), + }; + + return prev; +}, {}); diff --git a/grafana-plugin/src/pages/integrations/Integrations.module.css b/grafana-plugin/src/pages/integrations/Integrations.module.css index 233c41fa..88233e52 100644 --- a/grafana-plugin/src/pages/integrations/Integrations.module.css +++ b/grafana-plugin/src/pages/integrations/Integrations.module.css @@ -1,7 +1,3 @@ -.root { - margin-top: 24px; -} - .filters { margin-bottom: 20px; } diff --git a/grafana-plugin/src/pages/integrations/Integrations.tsx b/grafana-plugin/src/pages/integrations/Integrations.tsx index 7bde29fd..21d6d7a9 100644 --- a/grafana-plugin/src/pages/integrations/Integrations.tsx +++ b/grafana-plugin/src/pages/integrations/Integrations.tsx @@ -3,6 +3,7 @@ import React from 'react'; import { AppRootProps } from '@grafana/data'; import { getLocationSrv } from '@grafana/runtime'; import { Button, LoadingPlaceholder, VerticalGroup } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { debounce } from 'lodash-es'; import { observer } from 'mobx-react'; @@ -25,6 +26,7 @@ import { IntegrationSettingsTab } from 'containers/IntegrationSettings/Integrati import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; import { AlertReceiveChannel } from 'models/alert_receive_channel'; import { AlertReceiveChannelOption } from 'models/alert_receive_channel/alert_receive_channel.types'; +import { pages } from 'pages'; import { WithStoreProps } from 'state/types'; import { UserAction } from 'state/userAction'; import { withMobXProviderContext } from 'state/withStore'; @@ -130,13 +132,13 @@ class Integrations extends React.Component const searchResult = alertReceiveChannelStore.getSearchResult(); return ( - - {() => ( + + <>
@@ -241,8 +243,8 @@ class Integrations extends React.Component /> )} - )} - + + ); } diff --git a/grafana-plugin/src/pages/maintenance/Maintenance.module.css b/grafana-plugin/src/pages/maintenance/Maintenance.module.css index fdc72c34..3a4ceeea 100644 --- a/grafana-plugin/src/pages/maintenance/Maintenance.module.css +++ b/grafana-plugin/src/pages/maintenance/Maintenance.module.css @@ -1,7 +1,3 @@ -.root { - margin-top: 24px; -} - .select { width: 400px; } @@ -10,3 +6,7 @@ display: flex; justify-content: space-between; } + +.title { + margin-bottom: var(--title-marginBottom); +} diff --git a/grafana-plugin/src/pages/maintenance/Maintenance.tsx b/grafana-plugin/src/pages/maintenance/Maintenance.tsx index 4b675ed5..721add7f 100644 --- a/grafana-plugin/src/pages/maintenance/Maintenance.tsx +++ b/grafana-plugin/src/pages/maintenance/Maintenance.tsx @@ -1,10 +1,12 @@ import React from 'react'; import { AppRootProps } from '@grafana/data'; -import { Button, HorizontalGroup } from '@grafana/ui'; +import { Button, VerticalGroup } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { observer } from 'mobx-react'; import moment from 'moment-timezone'; +import LegacyNavHeading from 'navbar/LegacyNavHeading'; import Emoji from 'react-emoji-render'; import GTable from 'components/GTable/GTable'; @@ -15,6 +17,7 @@ import { WithPermissionControl } from 'containers/WithPermissionControl/WithPerm import { getAlertReceiveChannelDisplayName } from 'models/alert_receive_channel/alert_receive_channel.helpers'; import { AlertReceiveChannel } from 'models/alert_receive_channel/alert_receive_channel.types'; import { Maintenance, MaintenanceMode, MaintenanceType } from 'models/maintenance/maintenance.types'; +import { pages } from 'pages'; import { WithStoreProps } from 'state/types'; import { UserAction } from 'state/userAction'; import { withMobXProviderContext } from 'state/withStore'; @@ -115,19 +118,21 @@ class MaintenancePage extends React.Component +
(
- - Maintenance - + + + Maintenance + + Mute noisy sources or use for debugging and avoid bothering your colleagues. - +
-
- )} - showHeader={true} - data={results} - loading={loading} - emptyText={results ? 'No logs found' : 'Loading...'} - columns={columns} - pagination={{ - page, - total: Math.ceil((total || 0) / ITEMS_PER_PAGE), - onChange: this.handleChangePage, - }} - rowClassName={cx('align-top')} - expandable={{ - expandedRowRender: this.renderFullDescription, - expandRowByClick: true, - expandedRowKeys: expandedLogsKeys, - onExpandedRowsChange: this.handleExpandedRowsChange, - }} - /> -
+ +
+ + ( +
+ + Organization Logs + + +
+ )} + showHeader={true} + data={results} + loading={loading} + emptyText={results ? 'No logs found' : 'Loading...'} + columns={columns} + pagination={{ + page, + total: Math.ceil((total || 0) / ITEMS_PER_PAGE), + onChange: this.handleChangePage, + }} + rowClassName={cx('align-top')} + expandable={{ + expandedRowRender: this.renderFullDescription, + expandRowByClick: true, + expandedRowKeys: expandedLogsKeys, + onExpandedRowsChange: this.handleExpandedRowsChange, + }} + /> +
+
); } diff --git a/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.module.css b/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.module.css index 96c5323c..63eb4658 100644 --- a/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.module.css +++ b/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.module.css @@ -1,8 +1,5 @@ -.root { - margin-top: 24px; -} - .header { display: flex; - justify-content: space-between; + align-items: center; + width: 100%; } diff --git a/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.test.tsx b/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.test.tsx deleted file mode 100644 index 64875dff..00000000 --- a/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.test.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import 'jest/matchMedia.ts'; -import React from 'react'; - -import { describe, expect, test } from '@jest/globals'; -import { render, screen, waitFor } from '@testing-library/react'; -import '@testing-library/jest-dom'; -import outgoingWebhooksStub from 'jest/outgoingWebhooksStub'; - -import { OutgoingWebhook } from 'models/outgoing_webhook/outgoing_webhook.types'; -import { OutgoingWebhooks } from 'pages/outgoing_webhooks/OutgoingWebhooks'; - -const outgoingWebhooks = outgoingWebhooksStub as OutgoingWebhook[]; -const outgoingWebhookStore = () => ({ - loadItem: () => Promise.resolve(outgoingWebhooks[0]), - updateItems: () => Promise.resolve(), - getSearchResult: () => outgoingWebhooks, - items: outgoingWebhooks.reduce((prev, current) => { - prev[current.id] = current; - return prev; - }, {}), -}); - -jest.mock('@grafana/runtime', () => ({ - config: { - featureToggles: { - topNav: false, - }, - }, -})); - -jest.mock('state/useStore', () => ({ - useStore: () => ({ - outgoingWebhookStore: outgoingWebhookStore(), - isUserActionAllowed: jest.fn().mockReturnValue(true), - }), -})); - -jest.mock('@grafana/runtime', () => ({ - getLocationSrv: jest.fn(), -})); - -describe('OutgoingWebhooks', () => { - const storeMock = { - isUserActionAllowed: jest.fn().mockReturnValue(true), - outgoingWebhookStore: outgoingWebhookStore(), - }; - - beforeAll(() => { - console.warn = () => {}; - console.error = () => {}; - }); - - test('It renders all retrieved webhooks', async () => { - render(); - - const gTable = screen.queryByTestId('test__gTable'); - const rows = gTable.querySelectorAll('tbody tr'); - - await waitFor(() => { - expect(() => queryEditForm()).toThrow(); // edit doesn't show for [id=undefined] - expect(rows.length).toBe(outgoingWebhooks.length); - }); - }); - - test('It opens Edit View if [id] is supplied', async () => { - const id = outgoingWebhooks[0].id; - render(); - - expect(() => queryEditForm()).toThrow(); // before updates kick in - await waitFor(() => { - expect(queryEditForm()).toBeDefined(); // edit shows for [id=?] - }); - }); - - function getProps(id: OutgoingWebhook['id'] = undefined): any { - return { store: storeMock, query: { id } }; - } - - function queryEditForm(): HTMLElement { - return screen.getByTestId('test__outgoingWebhookEditForm'); - } -}); diff --git a/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.tsx b/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.tsx index c81fa697..6435f10e 100644 --- a/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.tsx +++ b/grafana-plugin/src/pages/outgoing_webhooks/OutgoingWebhooks.tsx @@ -3,8 +3,10 @@ import React from 'react'; import { AppRootProps } from '@grafana/data'; import { getLocationSrv } from '@grafana/runtime'; import { Button, HorizontalGroup } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { observer } from 'mobx-react'; +import LegacyNavHeading from 'navbar/LegacyNavHeading'; import GTable from 'components/GTable/GTable'; import PageErrorHandlingWrapper, { PageBaseState } from 'components/PageErrorHandlingWrapper/PageErrorHandlingWrapper'; @@ -19,6 +21,8 @@ import OutgoingWebhookForm from 'containers/OutgoingWebhookForm/OutgoingWebhookF import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; import { ActionDTO } from 'models/action'; import { OutgoingWebhook } from 'models/outgoing_webhook/outgoing_webhook.types'; +import { pages } from 'pages'; +import { getQueryParams } from 'plugin/GrafanaPluginRootPage.helpers'; import { WithStoreProps } from 'state/types'; import { UserAction } from 'state/userAction'; import { withMobXProviderContext } from 'state/withStore'; @@ -39,12 +43,14 @@ class OutgoingWebhooks extends React.Component - {() => ( + + <>
(
- Outgoing Webhooks - - - - - + + Outgoing Webhooks + +
+ + + + + +
)} rowKey="id" @@ -149,8 +159,8 @@ class OutgoingWebhooks extends React.Component )} - )} - + + ); } diff --git a/grafana-plugin/src/pages/routes.tsx b/grafana-plugin/src/pages/routes.tsx new file mode 100644 index 00000000..b9794e2f --- /dev/null +++ b/grafana-plugin/src/pages/routes.tsx @@ -0,0 +1,108 @@ +import { AppRootProps } from '@grafana/data'; + +import { PageDefinition } from 'pages'; +import EscalationsChainsPage from 'pages/escalation-chains/EscalationChains'; +import IncidentPage from 'pages/incident/Incident'; +import IncidentsPage from 'pages/incidents/Incidents'; +import IntegrationsPage from 'pages/integrations/Integrations'; +import MaintenancePage from 'pages/maintenance/Maintenance'; +import OrganizationLogPage from 'pages/organization-logs/OrganizationLog'; +import OutgoingWebhooks from 'pages/outgoing_webhooks/OutgoingWebhooks'; +import SchedulePage from 'pages/schedule/Schedule'; +import SchedulesPage from 'pages/schedules/Schedules'; +import SettingsPage from 'pages/settings/SettingsPage'; +import ChatOpsPage from 'pages/settings/tabs/ChatOps/ChatOps'; +import CloudPage from 'pages/settings/tabs/Cloud/CloudPage'; +import LiveSettingsPage from 'pages/settings/tabs/LiveSettings/LiveSettingsPage'; +import Test from 'pages/test/Test'; +import UsersPage from 'pages/users/Users'; + +export interface NavMenuItem { + meta: AppRootProps['meta']; + pages: { [id: string]: PageDefinition }; + path: string; + page: string; + grafanaUser: { + orgRole: 'Viewer' | 'Editor' | 'Admin'; + }; + enableLiveSettings: boolean; + enableCloudPage: boolean; + enableNewSchedulesPage: boolean; + backendLicense: string; + onNavChanged: any; +} + +export interface NavRoute { + id: string; + component: (props?: any) => JSX.Element; +} + +export const routes: { [id: string]: NavRoute } = [ + { + component: IncidentsPage, + id: 'incidents', + }, + { + component: IncidentPage, + id: 'incident', + }, + { + component: UsersPage, + id: 'users', + }, + { + component: IntegrationsPage, + id: 'integrations', + }, + { + component: EscalationsChainsPage, + id: 'escalations', + }, + { + component: SchedulesPage, + id: 'schedules', + }, + { + component: SchedulePage, + id: 'schedule', + }, + { + component: ChatOpsPage, + id: 'chat-ops', + }, + { + component: OutgoingWebhooks, + id: 'outgoing_webhooks', + }, + { + component: MaintenancePage, + id: 'maintenance', + }, + { + component: SettingsPage, + id: 'settings', + }, + { + component: LiveSettingsPage, + id: 'live-settings', + }, + { + component: OrganizationLogPage, + id: 'organization-logs', + }, + { + component: CloudPage, + id: 'cloud', + }, + { + component: Test, + id: 'test', + }, +].reduce((prev, current) => { + prev[current.id] = { + id: current.id, + component: current.component, + }; + + return prev; +}, {}); diff --git a/grafana-plugin/src/pages/schedule/Schedule.module.css b/grafana-plugin/src/pages/schedule/Schedule.module.css index 64df8e6d..0d8937a1 100644 --- a/grafana-plugin/src/pages/schedule/Schedule.module.css +++ b/grafana-plugin/src/pages/schedule/Schedule.module.css @@ -1,7 +1,6 @@ .root { max-width: 1600px; margin: 0 auto; - margin-top: 24px; --rotations-border: var(--border-weak); --rotations-background: var(--background-secondary); diff --git a/grafana-plugin/src/pages/schedule/Schedule.tsx b/grafana-plugin/src/pages/schedule/Schedule.tsx index 7950fc56..8ac61496 100644 --- a/grafana-plugin/src/pages/schedule/Schedule.tsx +++ b/grafana-plugin/src/pages/schedule/Schedule.tsx @@ -2,12 +2,14 @@ import React from 'react'; import { AppRootProps } from '@grafana/data'; import { getLocationSrv } from '@grafana/runtime'; -import { Button, HorizontalGroup, Icon, IconButton, Modal, ToolbarButton, VerticalGroup } from '@grafana/ui'; +import { Button, HorizontalGroup, VerticalGroup, IconButton, ToolbarButton, Icon, Modal } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import dayjs from 'dayjs'; import { omit } from 'lodash-es'; import { observer } from 'mobx-react'; +import PageErrorHandlingWrapper from 'components/PageErrorHandlingWrapper/PageErrorHandlingWrapper'; import PluginLink from 'components/PluginLink/PluginLink'; import ScheduleWarning from 'components/ScheduleWarning/ScheduleWarning'; import Text from 'components/Text/Text'; @@ -21,6 +23,8 @@ import ScheduleICalSettings from 'containers/ScheduleIcalLink/ScheduleIcalLink'; import UsersTimezones from 'containers/UsersTimezones/UsersTimezones'; import { Schedule, ScheduleType, Shift } from 'models/schedule/schedule.types'; import { Timezone } from 'models/timezone/timezone.types'; +import { pages } from 'pages'; +import { getQueryParams } from 'plugin/GrafanaPluginRootPage.helpers'; import { WithStoreProps } from 'state/types'; import { UserAction } from 'state/userAction'; import { withMobXProviderContext } from 'state/withStore'; @@ -64,9 +68,7 @@ class SchedulePage extends React.Component async componentDidMount() { const { store } = this.props; - const { - query: { id }, - } = this.props; + const { id } = getQueryParams(); store.userStore.updateItems(); @@ -85,10 +87,9 @@ class SchedulePage extends React.Component } render() { - const { - query: { id: scheduleId }, - store, - } = this.props; + const { store } = this.props; + const { id: scheduleId } = getQueryParams(); + const { startMoment, @@ -110,143 +111,149 @@ class SchedulePage extends React.Component shiftIdToShowOverridesForm; return ( - <> -
- -
- - - - - - - {schedule?.name} - - {schedule && } - - - {users && ( - - Current timezone: - - - )} - - {schedule?.type === ScheduleType.Ical && ( - - - - - )} - { - this.setState({ showEditForm: true }); - }} - /> - - - - - - -
- {schedule?.type !== ScheduleType.API && ( - - Ical and API/Terraform schedules are read-only - - )} -
- -
- -
-
+ + +
+ +
- - - - - - - {startMoment.format('DD MMM')} - {startMoment.add(6, 'day').format('DD MMM')} + + + + + {schedule?.name} + {schedule && } + + + {users && ( + + Current timezone: + + + )} + + {schedule?.type === ScheduleType.Ical && ( + + + + + )} + { + this.setState({ showEditForm: true }); + }} + /> + + + +
- - - -
- -
- {showEditForm && ( - { - this.setState({ showEditForm: false }); - }} - /> - )} - {showScheduleICalSettings && ( - this.setState({ showScheduleICalSettings: false })} - > - - - )} - + {schedule?.type !== ScheduleType.API && ( + + Ical and API/Terraform schedules are read-only + + )} +
+ +
+ +
+
+ + + + + + + + + {startMoment.format('DD MMM')} - {startMoment.add(6, 'day').format('DD MMM')} + + + +
+ + + +
+ +
+ {showEditForm && ( + { + this.setState({ showEditForm: false }); + }} + /> + )} + {showScheduleICalSettings && ( + this.setState({ showScheduleICalSettings: false })} + > + + + )} + + ); } @@ -292,10 +299,8 @@ class SchedulePage extends React.Component }; updateEvents = () => { - const { - store, - query: { id: scheduleId }, - } = this.props; + const { store } = this.props; + const { id: scheduleId } = getQueryParams(); const { startMoment } = this.state; @@ -419,10 +424,8 @@ class SchedulePage extends React.Component }; updateEventsFor = async (scheduleId: Schedule['id'], withEmpty = true, with_gap = true) => { - const { - store, - query: { id }, - } = this.props; + const { store } = this.props; + const { id } = getQueryParams(); const { scheduleStore } = store; @@ -441,10 +444,8 @@ class SchedulePage extends React.Component }; handleDelete = () => { - const { - store, - query: { id: scheduleId }, - } = this.props; + const { store } = this.props; + const { id: scheduleId } = getQueryParams(); store.scheduleStore.delete(scheduleId).then(() => { getLocationSrv().update({ query: { page: 'schedules' } }); diff --git a/grafana-plugin/src/pages/schedules/Schedules.module.css b/grafana-plugin/src/pages/schedules/Schedules.module.css index 07963dc1..c1fce1b8 100644 --- a/grafana-plugin/src/pages/schedules/Schedules.module.css +++ b/grafana-plugin/src/pages/schedules/Schedules.module.css @@ -1,12 +1,12 @@ -.root { - margin-top: 24px; -} - .schedule { position: relative; margin: 20px 0; } +.title { + margin-bottom: var(--title-marginBottom); +} + .root .buttons { padding-right: 10px; } diff --git a/grafana-plugin/src/pages/schedules/Schedules.tsx b/grafana-plugin/src/pages/schedules/Schedules.tsx index 111a041e..7b7cdbd1 100644 --- a/grafana-plugin/src/pages/schedules/Schedules.tsx +++ b/grafana-plugin/src/pages/schedules/Schedules.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { getLocationSrv } from '@grafana/runtime'; import { Button, HorizontalGroup, IconButton, LoadingPlaceholder, VerticalGroup } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import dayjs from 'dayjs'; import { debounce } from 'lodash-es'; @@ -25,6 +26,7 @@ import { WithPermissionControl } from 'containers/WithPermissionControl/WithPerm import { Schedule, ScheduleType } from 'models/schedule/schedule.types'; import { getSlackChannelName } from 'models/slack_channel/slack_channel.helpers'; import { Timezone } from 'models/timezone/timezone.types'; +import { pages } from 'pages'; import { getStartOfWeek } from 'pages/schedule/Schedule.helpers'; import { WithStoreProps } from 'state/types'; import { UserAction } from 'state/userAction'; @@ -133,7 +135,7 @@ class SchedulesPage extends React.Component +
@@ -190,7 +192,7 @@ class SchedulesPage extends React.Component )} - + ); } diff --git a/grafana-plugin/src/pages/schedules_OLD/Schedules.helpers.ts b/grafana-plugin/src/pages/schedules_OLD/Schedules.helpers.ts deleted file mode 100644 index 5961e719..00000000 --- a/grafana-plugin/src/pages/schedules_OLD/Schedules.helpers.ts +++ /dev/null @@ -1,64 +0,0 @@ -import moment from 'moment-timezone'; - -import { Schedule } from 'models/schedule/schedule.types'; - -const DATE_FORMAT = 'HH:mm YYYY-MM-DD'; - -function isToday(m: moment.Moment) { - return m.isSame('day'); -} - -function isYesterday(m: moment.Moment, currentMoment: moment.Moment) { - return m.diff(currentMoment, 'days') === -1; -} - -function isTomorrow(m: moment.Moment, currentMoment: moment.Moment) { - return m.diff(currentMoment, 'days') === 1; -} - -export function prepareForEdit(schedule: Schedule) { - return { - ...schedule, - slack_channel_id: schedule.slack_channel?.id, - user_group: schedule.user_group?.id, - }; -} - -function humanize(m: moment.Moment, currentMoment: moment.Moment) { - if (isToday(m)) { - return 'Today'; - } - if (isYesterday(m, currentMoment)) { - return 'Yesterday'; - } - - if (isTomorrow(m, currentMoment)) { - return 'Tomorrow'; - } - - return m.format(DATE_FORMAT); -} - -export function getDatesString(start: string, end: string, allDay: boolean) { - const startMoment = moment(start); - const endMoment = moment(end); - const currentMoment = moment(); - - if (allDay) { - if (startMoment.isSame(endMoment, 'day')) { - return 'All-day'; - } - - return `${startMoment.format(DATE_FORMAT)} — ${endMoment.format(DATE_FORMAT)}`; - } - - if (startMoment.isSame(endMoment, 'day')) { - return `${startMoment.format('LT')} — ${endMoment.format('LT')}`; - } - - let startString = humanize(startMoment, currentMoment); - - let endString = humanize(endMoment, currentMoment); - - return `${startString} — ${endString}`; -} diff --git a/grafana-plugin/src/pages/schedules_OLD/Schedules.module.css b/grafana-plugin/src/pages/schedules_OLD/Schedules.module.css deleted file mode 100644 index 102be56c..00000000 --- a/grafana-plugin/src/pages/schedules_OLD/Schedules.module.css +++ /dev/null @@ -1,68 +0,0 @@ -.root { - margin-top: 24px; -} - -.title { - margin-bottom: 20px; -} - -.header { - display: flex; - justify-content: space-between; - align-items: center; -} - -.buttons { - width: 100%; - justify-content: flex-end; -} - -.filters { - margin-bottom: 20px; -} - -.instructions { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - width: 50%; - margin: 20px auto; - white-space: break-spaces; - text-align: center; -} - -.events { - margin: 16px 32px; -} - -.events-list { - margin: 0; - list-style-type: none; -} - -.events-list-item { - margin-top: 12px; -} - -.priority-icon { - width: 32px; - border-radius: 50%; - background: var(--secondary-background); - line-height: 32px; - text-align: center; - font-size: 14px; - font-weight: 500; - flex-shrink: 0; -} - -.gap-between-shifts { - width: 520px; - padding: 5px 5px 5px 24px; - background-color: rgba(209, 14, 92, 0.15); - border: 1px solid rgba(209, 14, 92, 0.15); - border-radius: 50px; - color: #ff5286; - font-weight: 400; - align-items: baseline; -} diff --git a/grafana-plugin/src/pages/schedules_OLD/Schedules.tsx b/grafana-plugin/src/pages/schedules_OLD/Schedules.tsx deleted file mode 100644 index 49a632ae..00000000 --- a/grafana-plugin/src/pages/schedules_OLD/Schedules.tsx +++ /dev/null @@ -1,555 +0,0 @@ -import React, { SyntheticEvent } from 'react'; - -import { AppRootProps } from '@grafana/data'; -import { getLocationSrv } from '@grafana/runtime'; -import { - Button, - ConfirmModal, - HorizontalGroup, - Icon, - LoadingPlaceholder, - Modal, - PENDING_COLOR, - Tooltip, - VerticalGroup, -} from '@grafana/ui'; -import cn from 'classnames/bind'; -import { omit } from 'lodash-es'; -import { observer } from 'mobx-react'; -import moment from 'moment-timezone'; - -import instructionsImage from 'assets/img/events_instructions.png'; -import Avatar from 'components/Avatar/Avatar'; -import GTable from 'components/GTable/GTable'; -import PageErrorHandlingWrapper, { PageBaseState } from 'components/PageErrorHandlingWrapper/PageErrorHandlingWrapper'; -import { - getWrongTeamResponseInfo, - initErrorDataState, -} from 'components/PageErrorHandlingWrapper/PageErrorHandlingWrapper.helpers'; -import PluginLink from 'components/PluginLink/PluginLink'; -import SchedulesFilters from 'components/SchedulesFilters/SchedulesFilters'; -import { SchedulesFiltersType } from 'components/SchedulesFilters/SchedulesFilters.types'; -import Text from 'components/Text/Text'; -import Tutorial from 'components/Tutorial/Tutorial'; -import { TutorialStep } from 'components/Tutorial/Tutorial.types'; -import ScheduleForm from 'containers/ScheduleForm/ScheduleForm'; -import ScheduleICalSettings from 'containers/ScheduleIcalLink/ScheduleIcalLink'; -import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; -import { Schedule, ScheduleEvent, ScheduleType } from 'models/schedule/schedule.types'; -import { getSlackChannelName } from 'models/slack_channel/slack_channel.helpers'; -import { WithStoreProps } from 'state/types'; -import { UserAction } from 'state/userAction'; -import { withMobXProviderContext } from 'state/withStore'; -import { openErrorNotification } from 'utils'; - -import { getDatesString } from './Schedules.helpers'; - -import styles from './Schedules.module.css'; - -const cx = cn.bind(styles); - -interface SchedulesPageProps extends WithStoreProps, AppRootProps {} -interface SchedulesPageState extends PageBaseState { - scheduleIdToEdit?: Schedule['id']; - scheduleIdToDelete?: Schedule['id']; - scheduleIdToExport?: Schedule['id']; - filters: SchedulesFiltersType; - expandedSchedulesKeys: Array; -} - -@observer -class SchedulesPage extends React.Component { - state: SchedulesPageState = { - filters: { - selectedDate: moment().startOf('day').format('YYYY-MM-DD'), - }, - expandedSchedulesKeys: [], - errorData: initErrorDataState(), - }; - - componentDidMount() { - this.update().then(this.parseQueryParams); - } - - componentDidUpdate(prevProps: SchedulesPageProps) { - if (this.props.query.id !== prevProps.query.id) { - this.parseQueryParams(); - } - } - - parseQueryParams = async () => { - this.setState({ errorData: initErrorDataState() }); // reset wrong team error to false on query parse - - const { - store, - query: { id }, - } = this.props; - - if (!id) { - return; - } - - let scheduleId: string = undefined; - const isNewSchedule = id === 'new'; - - if (!isNewSchedule) { - // load schedule only for valid id - const schedule = await store.scheduleStore - .loadItem(id, true) - .catch((error) => this.setState({ errorData: { ...getWrongTeamResponseInfo(error) } })); - if (!schedule) { - return; - } - - scheduleId = schedule.id; - } - - if (scheduleId || isNewSchedule) { - this.setState({ scheduleIdToEdit: id }); - } else { - openErrorNotification(`Schedule with id=${id} is not found. Please select schedule from the list.`); - } - }; - - update = () => { - const { store } = this.props; - const { scheduleStore } = store; - - return scheduleStore.updateItems(); - }; - - render() { - const { store, query } = this.props; - const { expandedSchedulesKeys, scheduleIdToDelete, scheduleIdToEdit, scheduleIdToExport } = this.state; - const { filters, errorData } = this.state; - const { scheduleStore } = store; - - const columns = [ - { - width: '10%', - title: 'Type', - dataIndex: 'type', - render: this.renderType, - }, - { - width: '20%', - title: 'Name', - dataIndex: 'name', - }, - { - width: '20%', - title: 'OnCall now', - render: this.renderOncallNow, - }, - { - width: '10%', - title: 'Slack channel', - render: this.renderChannelName, - }, - { - width: '10%', - title: 'Slack user group', - render: this.renderUserGroup, - }, - { - width: '10%', - key: 'warning', - render: this.renderWarning, - }, - { - width: '20%', - key: 'action', - render: this.renderActionButtons, - }, - ]; - - const schedules = scheduleStore.getSearchResult(); - - const timezoneStr = moment.tz.guess(); - const offset = moment().tz(timezoneStr).format('Z'); - - return ( - - {() => ( - <> -
-
- - On-call Schedules - - Use this to distribute notifications among team members you specified in the "Notify Users from - on-call schedule" step in{' '} - escalation chains. - - -
- - {!schedules || schedules.length ? ( - ( -
- - - - Your timezone is {timezoneStr} UTC{offset} - - - - - - - -
- )} - rowKey="id" - columns={columns} - data={schedules} - expandable={{ - expandedRowRender: this.renderEvents, - expandRowByClick: true, - onExpand: this.onRowExpand, - expandedRowKeys: expandedSchedulesKeys, - onExpandedRowsChange: this.handleExpandedRowsChange, - }} - /> - ) : ( - - You haven’t added a schedule yet. - - - - - } - /> - )} -
- - {scheduleIdToEdit && ( - { - this.setState({ scheduleIdToEdit: undefined }); - getLocationSrv().update({ partial: true, query: { id: undefined } }); - }} - /> - )} - - {scheduleIdToDelete && ( - { - this.setState({ scheduleIdToDelete: undefined }); - }} - /> - )} - - {scheduleIdToExport && ( - this.setState({ scheduleIdToExport: undefined })} - > - - - )} - - )} -
- ); - } - - onRowExpand = (expanded: boolean, schedule: Schedule) => { - if (expanded) { - this.updateEventsFor(schedule.id); - } - }; - - handleExpandedRowsChange = (expandedRows: string[]) => { - this.setState({ expandedSchedulesKeys: expandedRows }); - }; - - renderEvents = (schedule: Schedule) => { - const { store } = this.props; - const { scheduleStore } = store; - const { scheduleToScheduleEvents } = scheduleStore; - - const events = scheduleToScheduleEvents[schedule.id]; - - return events ? ( - events.length ? ( -
- - Events - -
    - {(events || []).map((event, idx) => ( -
  • - -
  • - ))} -
-
- ) : ( - this.renderInstruction() - ) - ) : ( - - ); - }; - - renderInstruction = () => { - const { store } = this.props; - const { userStore } = store; - - return ( -
- - There are no active slots here. To add an event, enter a username, for example “ - {userStore.currentUser?.username}“, and click the “Reload” button. OnCall will download this calendar and set - up an on-call schedule based on event names. OnCall will refresh the calendar every 10 minutes after the - intial setup. - - -
- ); - }; - - handleChangeFilters = (filters: SchedulesFiltersType) => { - this.setState({ filters }, () => { - const { filters, expandedSchedulesKeys } = this.state; - - if (!filters.selectedDate) { - return; - } - - expandedSchedulesKeys.forEach((id) => this.updateEventsFor(id)); - }); - }; - - renderChannelName = (value: Schedule) => { - return getSlackChannelName(value.slack_channel) || '-'; - }; - - renderUserGroup = (value: Schedule) => { - return value.user_group?.handle || '-'; - }; - - renderOncallNow = (item: Schedule, _index: number) => { - if (item.on_call_now?.length > 0) { - return item.on_call_now.map((user, _index) => { - return ( - -
- - {user.username} -
-
- ); - }); - } - return null; - }; - - renderType = (value: number) => { - type tTypeToVerbal = { - [key: number]: string; - }; - const typeToVerbal: tTypeToVerbal = { 0: 'API/Terraform', 1: 'Ical', 2: 'Web' }; - return typeToVerbal[value]; - }; - - renderWarning = (item: Schedule) => { - if (item.warnings.length > 0) { - const tooltipContent = ( -
- {item.warnings.map((warning: string) => ( -

{warning}

- ))} -
- ); - return ( - - - - ); - } - - return null; - }; - - renderActionButtons = (record: Schedule) => { - return ( - - - - - - - - - - - - - - - ); - }; - - updateEventsFor = async (scheduleId: Schedule['id'], withEmpty = true, with_gap = true) => { - const { store } = this.props; - - const { scheduleStore } = store; - const { - filters: { selectedDate }, - } = this.state; - - store.scheduleStore.scheduleToScheduleEvents = omit(store.scheduleStore.scheduleToScheduleEvents, [scheduleId]); - - this.forceUpdate(); - - await scheduleStore.updateScheduleEvents(scheduleId, withEmpty, with_gap, selectedDate, moment.tz.guess()); - - this.forceUpdate(); - }; - - getReloadScheduleClickHandler = (scheduleId: Schedule['id']) => { - const { store } = this.props; - - const { scheduleStore } = store; - - return async (event: SyntheticEvent) => { - event.stopPropagation(); - - await scheduleStore.reloadIcal(scheduleId); - - scheduleStore.updateItem(scheduleId); - this.updateEventsFor(scheduleId); - }; - }; - - getDeleteScheduleClickHandler = (scheduleId: Schedule['id']) => { - return (event: SyntheticEvent) => { - event.stopPropagation(); - this.setState({ scheduleIdToDelete: scheduleId }); - }; - }; - - getExportScheduleClickHandler = (scheduleId: Schedule['id']) => { - return (event: SyntheticEvent) => { - event.stopPropagation(); - this.setState({ scheduleIdToExport: scheduleId }); - }; - }; - - handleDelete = async () => { - const { scheduleIdToDelete } = this.state; - const { store } = this.props; - - this.setState({ scheduleIdToDelete: undefined }); - - const { scheduleStore } = store; - - await scheduleStore.delete(scheduleIdToDelete); - - this.update(); - }; -} - -interface EventProps { - event: ScheduleEvent; -} - -const Event = ({ event }: EventProps) => { - const dates = getDatesString(event.start, event.end, event.all_day); - - return ( - <> - {!event.is_gap ? ( - -
- {`L${event.priority_level || '0'}`} -
- -
- {!event.is_empty ? ( - event.users.map((user: any, index: number) => ( - - {index ? ', ' : ''} - {user.display_name} - - )) - ) : ( - - - Empty shift - {event.missing_users[0] && ( - - (check if {event.missing_users[0].includes(',') ? 'some of these users -' : 'user -'}{' '} - "{event.missing_users[0]}"{' '} - {event.missing_users[0].includes(',') ? 'are' : 'is'} existing in OnCall or{' '} - {event.missing_users[0].includes(',') ? 'have' : 'has'} Viewer role) - - )} - - )} - {event.source && — source: {event.source}} -
-
- {dates} -
-
-
- ) : ( -
- - Gap! Nobody On-Call... -
- )} - - ); -}; - -export default withMobXProviderContext(SchedulesPage); diff --git a/grafana-plugin/src/pages/settings/SettingsPage.module.css b/grafana-plugin/src/pages/settings/SettingsPage.module.css index 1a1b3be9..25136e81 100644 --- a/grafana-plugin/src/pages/settings/SettingsPage.module.css +++ b/grafana-plugin/src/pages/settings/SettingsPage.module.css @@ -1,11 +1,3 @@ -.root { - margin-top: 24px; -} - -.title { - margin-bottom: 20px; -} - -.settings { - width: fit-content; +.tabs__content { + padding-top: 24px; } diff --git a/grafana-plugin/src/pages/settings/SettingsPage.tsx b/grafana-plugin/src/pages/settings/SettingsPage.tsx index eff60e26..be6af07b 100644 --- a/grafana-plugin/src/pages/settings/SettingsPage.tsx +++ b/grafana-plugin/src/pages/settings/SettingsPage.tsx @@ -1,77 +1,158 @@ import React from 'react'; -import { Field, Input, Switch } from '@grafana/ui'; +import { Tab, TabsBar } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { observer } from 'mobx-react'; -import Text from 'components/Text/Text'; -import ApiTokenSettings from 'containers/ApiTokenSettings/ApiTokenSettings'; -import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; -import { WithStoreProps } from 'state/types'; -import { UserAction } from 'state/userAction'; +import { pages } from 'pages'; +import ChatOpsPage from 'pages/settings/tabs/ChatOps/ChatOps'; +import MainSettings from 'pages/settings/tabs/MainSettings/MainSettings'; +import { isTopNavbar } from 'plugin/GrafanaPluginRootPage.helpers'; +import { AppFeature } from 'state/features'; +import { RootBaseStore } from 'state/rootBaseStore'; import { withMobXProviderContext } from 'state/withStore'; +import { SettingsPageTab } from './SettingsPage.types'; +import CloudPage from './tabs/Cloud/CloudPage'; +import LiveSettingsPage from './tabs/LiveSettings/LiveSettingsPage'; + import styles from './SettingsPage.module.css'; const cx = cn.bind(styles); -interface SettingsPageProps extends WithStoreProps {} - +interface SettingsPageProps { + store: RootBaseStore; +} interface SettingsPageState { - apiUrl?: string; + activeTab: string; } @observer class SettingsPage extends React.Component { state: SettingsPageState = { - apiUrl: '', + activeTab: SettingsPageTab.MainSettings.key, // should read from route instead }; - async componentDidMount() { - const { store } = this.props; - const url = await store.getApiUrlForSettings(); - this.setState({ apiUrl: url }); - } render() { - const { store } = this.props; - const { teamStore } = store; - const { apiUrl } = this.state; - return ( -
- - Organization settings - -
- - - { - teamStore.saveCurrentTeam({ - is_resolution_note_required: event.currentTarget.checked, - }); - }} - /> - - -
- - API URL - -
- - - -
- -
+ +
{this.renderContent()}
+
); } + + renderContent() { + const { activeTab } = this.state; + const { store } = this.props; + + const onTabChange = (tab: string) => { + this.setState({ activeTab: tab }); + }; + + const grafanaUser = window.grafanaBootData.user; + const hasLiveSettings = store.hasFeature(AppFeature.LiveSettings); + const hasCloudPage = store.hasFeature(AppFeature.CloudConnection); + const showCloudPage = + hasCloudPage && (pages['cloud'].role === 'Admin' ? pages['cloud'].role === grafanaUser.orgRole : true); + const showLiveSettings = + hasLiveSettings && (pages['cloud'].role === 'Admin' ? pages['cloud'].role === grafanaUser.orgRole : true); + + if (isTopNavbar()) { + return ( + <> + + onTabChange(SettingsPageTab.MainSettings.key)} + active={activeTab === SettingsPageTab.MainSettings.key} + label={SettingsPageTab.MainSettings.value} + /> + onTabChange(SettingsPageTab.ChatOps.key)} + active={activeTab === SettingsPageTab.ChatOps.key} + label={SettingsPageTab.ChatOps.value} + /> + {showLiveSettings && ( + onTabChange(SettingsPageTab.EnvVariables.key)} + active={activeTab === SettingsPageTab.EnvVariables.key} + label={SettingsPageTab.EnvVariables.value} + /> + )} + {showCloudPage && ( + onTabChange(SettingsPageTab.Cloud.key)} + active={activeTab === SettingsPageTab.Cloud.key} + label={SettingsPageTab.Cloud.value} + /> + )} + + + + + ); + } + + return ; + } + + getMatchingPageNav() { + return { + parentItem: { + text: getTabText(this.state.activeTab), + }, + text: '', + hideFromBreadcrumbs: true, + }; + + function getTabText(activeTab: string) { + let result: string; + Object.keys(SettingsPageTab).forEach((tab) => { + if (activeTab === SettingsPageTab[tab].key) { + result = SettingsPageTab[tab].value; + } + }); + + return result; + } + } } +interface TabsContentProps { + activeTab: string; +} + +const TabsContent = (props: TabsContentProps) => { + const { activeTab } = props; + + return ( +
+ {activeTab === SettingsPageTab.MainSettings.key && ( +
+ +
+ )} + {activeTab === SettingsPageTab.ChatOps.key && ( +
+ +
+ )} + {activeTab === SettingsPageTab.EnvVariables.key && ( +
+ +
+ )} + {activeTab === SettingsPageTab.Cloud.key && ( +
+ +
+ )} +
+ ); +}; + export default withMobXProviderContext(SettingsPage); diff --git a/grafana-plugin/src/pages/settings/SettingsPage.types.ts b/grafana-plugin/src/pages/settings/SettingsPage.types.ts new file mode 100644 index 00000000..db1b7c4c --- /dev/null +++ b/grafana-plugin/src/pages/settings/SettingsPage.types.ts @@ -0,0 +1,8 @@ +import { KeyValuePair } from 'utils'; + +export const SettingsPageTab = { + MainSettings: new KeyValuePair('MainSettings', 'Organization Settings'), + ChatOps: new KeyValuePair('ChatOps', 'Chat Ops'), + EnvVariables: new KeyValuePair('EnvVariables', 'Env Variables'), + Cloud: new KeyValuePair('Cloud', 'Cloud'), +}; diff --git a/grafana-plugin/src/pages/chat-ops/ChatOps.module.css b/grafana-plugin/src/pages/settings/tabs/ChatOps/ChatOps.module.css similarity index 87% rename from grafana-plugin/src/pages/chat-ops/ChatOps.module.css rename to grafana-plugin/src/pages/settings/tabs/ChatOps/ChatOps.module.css index db5cfa78..eea25258 100644 --- a/grafana-plugin/src/pages/chat-ops/ChatOps.module.css +++ b/grafana-plugin/src/pages/settings/tabs/ChatOps/ChatOps.module.css @@ -1,5 +1,4 @@ .root { - margin-top: 24px; display: flex; } diff --git a/grafana-plugin/src/pages/chat-ops/parts/index.tsx b/grafana-plugin/src/pages/settings/tabs/ChatOps/ChatOps.tsx similarity index 50% rename from grafana-plugin/src/pages/chat-ops/parts/index.tsx rename to grafana-plugin/src/pages/settings/tabs/ChatOps/ChatOps.tsx index bafab873..6cf18e8b 100644 --- a/grafana-plugin/src/pages/chat-ops/parts/index.tsx +++ b/grafana-plugin/src/pages/settings/tabs/ChatOps/ChatOps.tsx @@ -2,23 +2,61 @@ import React from 'react'; import { HorizontalGroup, Icon } from '@grafana/ui'; import cn from 'classnames/bind'; +import { observer } from 'mobx-react'; import VerticalTabsBar, { VerticalTab } from 'components/VerticalTabsBar/VerticalTabsBar'; -import { ChatOpsTab } from 'pages/chat-ops/ChatOps.types'; +import SlackSettings from 'pages/settings/tabs/ChatOps/tabs/SlackSettings/SlackSettings'; +import TelegramSettings from 'pages/settings/tabs/ChatOps/tabs/TelegramSettings/TelegramSettings'; +import { withMobXProviderContext } from 'state/withStore'; -import SlackSettings from './tabs/SlackSettings/SlackSettings'; -import TelegramSettings from './tabs/TelegramSettings/TelegramSettings'; - -import styles from 'containers/UserSettings/parts/index.module.css'; +import styles from './ChatOps.module.css'; const cx = cn.bind(styles); +export enum ChatOpsTab { + Slack = 'Slack', + Telegram = 'Telegram', +} + +interface ChatOpsState { + activeTab: ChatOpsTab; +} + +@observer +class ChatOpsPage extends React.Component<{}, ChatOpsState> { + state: ChatOpsState = { + activeTab: ChatOpsTab.Slack, + }; + + render() { + const { activeTab } = this.state; + + return ( +
+
+ { + this.setState({ activeTab: tab }); + }} + /> +
+
+ +
+
+ ); + } +} + +export default withMobXProviderContext(ChatOpsPage); + interface TabsProps { activeTab: string; onTabChange: (tab: string) => void; } -export const Tabs = (props: TabsProps) => { +const Tabs = (props: TabsProps) => { const { activeTab, onTabChange } = props; return ( @@ -43,7 +81,7 @@ interface TabsContentProps { activeTab: string; } -export const TabsContent = (props: TabsContentProps) => { +const TabsContent = (props: TabsContentProps) => { const { activeTab } = props; return ( diff --git a/grafana-plugin/src/pages/chat-ops/parts/tabs/SlackSettings/SlackSettings.module.css b/grafana-plugin/src/pages/settings/tabs/ChatOps/tabs/SlackSettings/SlackSettings.module.css similarity index 100% rename from grafana-plugin/src/pages/chat-ops/parts/tabs/SlackSettings/SlackSettings.module.css rename to grafana-plugin/src/pages/settings/tabs/ChatOps/tabs/SlackSettings/SlackSettings.module.css diff --git a/grafana-plugin/src/pages/chat-ops/parts/tabs/SlackSettings/SlackSettings.tsx b/grafana-plugin/src/pages/settings/tabs/ChatOps/tabs/SlackSettings/SlackSettings.tsx similarity index 100% rename from grafana-plugin/src/pages/chat-ops/parts/tabs/SlackSettings/SlackSettings.tsx rename to grafana-plugin/src/pages/settings/tabs/ChatOps/tabs/SlackSettings/SlackSettings.tsx diff --git a/grafana-plugin/src/pages/chat-ops/parts/tabs/TelegramSettings/TelegramSettings.module.css b/grafana-plugin/src/pages/settings/tabs/ChatOps/tabs/TelegramSettings/TelegramSettings.module.css similarity index 100% rename from grafana-plugin/src/pages/chat-ops/parts/tabs/TelegramSettings/TelegramSettings.module.css rename to grafana-plugin/src/pages/settings/tabs/ChatOps/tabs/TelegramSettings/TelegramSettings.module.css diff --git a/grafana-plugin/src/pages/chat-ops/parts/tabs/TelegramSettings/TelegramSettings.tsx b/grafana-plugin/src/pages/settings/tabs/ChatOps/tabs/TelegramSettings/TelegramSettings.tsx similarity index 100% rename from grafana-plugin/src/pages/chat-ops/parts/tabs/TelegramSettings/TelegramSettings.tsx rename to grafana-plugin/src/pages/settings/tabs/ChatOps/tabs/TelegramSettings/TelegramSettings.tsx diff --git a/grafana-plugin/src/pages/cloud/CloudPage.module.css b/grafana-plugin/src/pages/settings/tabs/Cloud/CloudPage.module.css similarity index 94% rename from grafana-plugin/src/pages/cloud/CloudPage.module.css rename to grafana-plugin/src/pages/settings/tabs/Cloud/CloudPage.module.css index 416d2a70..7153c3ca 100644 --- a/grafana-plugin/src/pages/cloud/CloudPage.module.css +++ b/grafana-plugin/src/pages/settings/tabs/Cloud/CloudPage.module.css @@ -25,7 +25,6 @@ height: 32px; } -.cloud-page-title, .heartbit-button { margin-top: 24px; } @@ -59,7 +58,7 @@ } .table-title { - margin-bottom: 16px; + margin-bottom: var(--title-marginBottom); } .table-button { diff --git a/grafana-plugin/src/pages/cloud/CloudPage.tsx b/grafana-plugin/src/pages/settings/tabs/Cloud/CloudPage.tsx similarity index 100% rename from grafana-plugin/src/pages/cloud/CloudPage.tsx rename to grafana-plugin/src/pages/settings/tabs/Cloud/CloudPage.tsx diff --git a/grafana-plugin/src/pages/livesettings/LiveSettings.config.ts b/grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettings.config.ts similarity index 100% rename from grafana-plugin/src/pages/livesettings/LiveSettings.config.ts rename to grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettings.config.ts diff --git a/grafana-plugin/src/pages/livesettings/LiveSettings.helpers.ts b/grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettings.helpers.ts similarity index 100% rename from grafana-plugin/src/pages/livesettings/LiveSettings.helpers.ts rename to grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettings.helpers.ts diff --git a/grafana-plugin/src/pages/livesettings/LiveSettings.module.css b/grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettings.module.css similarity index 90% rename from grafana-plugin/src/pages/livesettings/LiveSettings.module.css rename to grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettings.module.css index 7bdf528a..1aaff2f7 100644 --- a/grafana-plugin/src/pages/livesettings/LiveSettings.module.css +++ b/grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettings.module.css @@ -1,7 +1,3 @@ -.root { - margin-top: 24px; -} - .align-top { vertical-align: top; } diff --git a/grafana-plugin/src/pages/livesettings/LiveSettingsPage.tsx b/grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettingsPage.tsx similarity index 100% rename from grafana-plugin/src/pages/livesettings/LiveSettingsPage.tsx rename to grafana-plugin/src/pages/settings/tabs/LiveSettings/LiveSettingsPage.tsx diff --git a/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.module.css b/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.module.css new file mode 100644 index 00000000..9c055775 --- /dev/null +++ b/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.module.css @@ -0,0 +1,7 @@ +.title { + margin-bottom: 20px; +} + +.settings { + width: fit-content; +} diff --git a/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.tsx b/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.tsx new file mode 100644 index 00000000..b1851d5a --- /dev/null +++ b/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.tsx @@ -0,0 +1,82 @@ +import React from 'react'; + +import { Field, Input, Switch } from '@grafana/ui'; +import cn from 'classnames/bind'; +import { observer } from 'mobx-react'; +import LegacyNavHeading from 'navbar/LegacyNavHeading'; + +import Text from 'components/Text/Text'; +import ApiTokenSettings from 'containers/ApiTokenSettings/ApiTokenSettings'; +import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; +import { WithStoreProps } from 'state/types'; +import { UserAction } from 'state/userAction'; +import { withMobXProviderContext } from 'state/withStore'; + +import styles from './MainSettings.module.css'; + +const cx = cn.bind(styles); + +interface SettingsPageProps extends WithStoreProps {} + +interface SettingsPageState { + apiUrl?: string; +} + +@observer +class SettingsPage extends React.Component { + state: SettingsPageState = { + apiUrl: '', + }; + + async componentDidMount() { + const { store } = this.props; + const url = await store.getApiUrlForSettings(); + this.setState({ apiUrl: url }); + } + + render() { + const { store } = this.props; + const { teamStore } = store; + const { apiUrl } = this.state; + + return ( +
+ + + Organization settings + + + +
+ + + { + teamStore.saveCurrentTeam({ + is_resolution_note_required: event.currentTarget.checked, + }); + }} + /> + + +
+ + API URL + +
+ + + +
+ +
+ ); + } +} + +export default withMobXProviderContext(SettingsPage); diff --git a/grafana-plugin/src/pages/test/Test.module.css b/grafana-plugin/src/pages/test/Test.module.css index 729f2a31..95392cf9 100644 --- a/grafana-plugin/src/pages/test/Test.module.css +++ b/grafana-plugin/src/pages/test/Test.module.css @@ -1,7 +1,3 @@ -.root { - margin-top: 24px; -} - .select { width: 400px; } diff --git a/grafana-plugin/src/pages/test/Test.tsx b/grafana-plugin/src/pages/test/Test.tsx index ab40b2d0..f7e3652d 100644 --- a/grafana-plugin/src/pages/test/Test.tsx +++ b/grafana-plugin/src/pages/test/Test.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { Button } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { observer } from 'mobx-react'; @@ -16,11 +17,13 @@ const cx = cn.bind(styles); class Test extends React.Component { render() { return ( -
- - {(disabled) => } - -
+ +
+ + {(disabled) => } + +
+
); } } diff --git a/grafana-plugin/src/pages/users/Users.module.css b/grafana-plugin/src/pages/users/Users.module.css index 021460b0..4a7864cd 100644 --- a/grafana-plugin/src/pages/users/Users.module.css +++ b/grafana-plugin/src/pages/users/Users.module.css @@ -1,7 +1,3 @@ -.root { - margin-top: 24px; -} - .users-title { display: flex; align-items: center; @@ -19,7 +15,7 @@ .users-header { display: flex; justify-content: space-between; - margin-bottom: 24px; + margin-bottom: var(--title-marginBottom); } .users-header-left { diff --git a/grafana-plugin/src/pages/users/Users.tsx b/grafana-plugin/src/pages/users/Users.tsx index c84deaa1..c4a6458d 100644 --- a/grafana-plugin/src/pages/users/Users.tsx +++ b/grafana-plugin/src/pages/users/Users.tsx @@ -3,9 +3,11 @@ import React from 'react'; import { AppRootProps } from '@grafana/data'; import { getLocationSrv } from '@grafana/runtime'; import { Alert, Button, HorizontalGroup, Icon, VerticalGroup } from '@grafana/ui'; +import { PluginPage } from 'PluginPage'; import cn from 'classnames/bind'; import { debounce } from 'lodash-es'; import { observer } from 'mobx-react'; +import LegacyNavHeading from 'navbar/LegacyNavHeading'; import Avatar from 'components/Avatar/Avatar'; import GTable from 'components/GTable/GTable'; @@ -21,6 +23,8 @@ import UserSettings from 'containers/UserSettings/UserSettings'; import { WithPermissionControl } from 'containers/WithPermissionControl/WithPermissionControl'; import { getRole } from 'models/user/user.helpers'; import { User as UserType, UserRole } from 'models/user/user.types'; +import { pages } from 'pages'; +import { getQueryParams } from 'plugin/GrafanaPluginRootPage.helpers'; import { WithStoreProps } from 'state/types'; import { UserAction } from 'state/userAction'; import { withMobXProviderContext } from 'state/withStore'; @@ -61,10 +65,10 @@ class Users extends React.Component { initialUsersLoaded = false; + private userId: string; + async componentDidMount() { - const { - query: { p }, - } = this.props; + const { p } = getQueryParams(); this.setState({ page: p ? Number(p) : 1 }, this.updateUsers); this.parseParams(); @@ -83,7 +87,7 @@ class Users extends React.Component { return await userStore.updateItems(getRealFilters(usersFilters), page); }; - componentDidUpdate(prevProps: Readonly, _prevState: Readonly, _snapshot?: any) { + componentDidUpdate() { const { store } = this.props; if (!this.initialUsersLoaded && store.isUserActionAllowed(UserAction.ViewOtherUsers)) { @@ -91,7 +95,7 @@ class Users extends React.Component { this.initialUsersLoaded = true; } - if (this.props.query.id !== prevProps.query.id) { + if (this.userId !== getQueryParams()['id']) { this.parseParams(); } } @@ -99,10 +103,10 @@ class Users extends React.Component { parseParams = async () => { this.setState({ errorData: initErrorDataState() }); // reset wrong team error to false on query parse - const { - store, - query: { id }, - } = this.props; + const { store } = this.props; + const { id } = getQueryParams(); + + this.userId = id; if (id) { await (id === 'me' ? store.userStore.loadCurrentUser() : store.userStore.loadUser(String(id), true)).catch( @@ -171,20 +175,22 @@ class Users extends React.Component { const { count, results } = userStore.getSearchResult(); return ( - - {() => ( + + <>
- Users + + Users + To manage permissions or add users, please visit{' '} Grafana user management @@ -244,8 +250,8 @@ class Users extends React.Component { {userPkToEdit && }
- )} - + + ); } diff --git a/grafana-plugin/src/plugin.json b/grafana-plugin/src/plugin.json index 43462418..50415d19 100644 --- a/grafana-plugin/src/plugin.json +++ b/grafana-plugin/src/plugin.json @@ -34,8 +34,7 @@ "name": "Alert Groups", "path": "/a/grafana-oncall-app/?page=incidents", "role": "Viewer", - "addToNav": true, - "defaultNav": true + "addToNav": true }, { "type": "page", @@ -65,13 +64,6 @@ "role": "Viewer", "addToNav": true }, - { - "type": "page", - "name": "ChatOps", - "path": "/a/grafana-oncall-app/?page=chat-ops", - "role": "Viewer", - "addToNav": true - }, { "type": "page", "name": "Outgoing Webhooks", diff --git a/grafana-plugin/src/plugin/GrafanaPluginRootPage.helpers.tsx b/grafana-plugin/src/plugin/GrafanaPluginRootPage.helpers.tsx new file mode 100644 index 00000000..23854334 --- /dev/null +++ b/grafana-plugin/src/plugin/GrafanaPluginRootPage.helpers.tsx @@ -0,0 +1,14 @@ +import { config } from '@grafana/runtime'; + +export function isTopNavbar(): boolean { + return !!config.featureToggles.topnav; +} + +export function getQueryParams(): any { + const searchParams = new URLSearchParams(window.location.search); + const result = {}; + for (const [key, value] of searchParams) { + result[key] = value; + } + return result; +} diff --git a/grafana-plugin/src/GrafanaPluginRootPage.tsx b/grafana-plugin/src/plugin/GrafanaPluginRootPage.tsx similarity index 68% rename from grafana-plugin/src/GrafanaPluginRootPage.tsx rename to grafana-plugin/src/plugin/GrafanaPluginRootPage.tsx index 3642b467..416b0767 100644 --- a/grafana-plugin/src/GrafanaPluginRootPage.tsx +++ b/grafana-plugin/src/plugin/GrafanaPluginRootPage.tsx @@ -1,7 +1,9 @@ -import React, { useEffect, useMemo } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { AppRootProps } from '@grafana/data'; +import { locationService } from '@grafana/runtime'; import { Button, HorizontalGroup, LinkButton } from '@grafana/ui'; +import classnames from 'classnames'; import dayjs from 'dayjs'; import isSameOrAfter from 'dayjs/plugin/isSameOrAfter'; import isSameOrBefore from 'dayjs/plugin/isSameOrBefore'; @@ -10,17 +12,18 @@ import localeData from 'dayjs/plugin/localeData'; import timezone from 'dayjs/plugin/timezone'; import utc from 'dayjs/plugin/utc'; import weekday from 'dayjs/plugin/weekday'; -import { observer, Provider } from 'mobx-react'; - import 'interceptors'; +import { observer, Provider } from 'mobx-react'; +import Header from 'navbar/Header/Header'; +import LegacyNavTabsBar from 'navbar/LegacyNavTabsBar'; import DefaultPageLayout from 'containers/DefaultPageLayout/DefaultPageLayout'; -import GrafanaTeamSelect from 'containers/GrafanaTeamSelect/GrafanaTeamSelect'; import logo from 'img/logo.svg'; import { pages } from 'pages'; +import { routes } from 'pages/routes'; import { rootStore } from 'state'; import { useStore } from 'state/useStore'; -import { useNavModel } from 'utils/hooks'; +import { useQueryParams, useQueryPath } from 'utils/hooks'; dayjs.extend(utc); dayjs.extend(timezone); @@ -30,10 +33,11 @@ dayjs.extend(isSameOrBefore); dayjs.extend(isSameOrAfter); dayjs.extend(isoWeek); -import './style/vars.css'; -import './style/index.css'; +import 'style/vars.css'; +import 'style/global.css'; +import 'style/utils.css'; -import { AppFeature } from './state/features'; +import { isTopNavbar } from './GrafanaPluginRootPage.helpers'; export const GrafanaPluginRootPage = (props: AppRootProps) => ( @@ -96,21 +100,18 @@ const RootWithLoader = observer((props: AppRootProps) => { }); export const Root = observer((props: AppRootProps) => { - const { - path, - onNavChanged, - query: { page }, - meta, - } = props; + const [didFinishLoading, setDidFinishLoading] = useState(false); + const queryParams = useQueryParams(); + const page = queryParams.get('page'); + const path = useQueryPath(); // Required to support grafana instances that use a custom `root_url`. const pathWithoutLeadingSlash = path.replace(/^\//, ''); const store = useStore(); - const { backendLicense } = store; useEffect(() => { - store.updateBasicData(); + updateBasicData(); }, []); useEffect(() => { @@ -126,33 +127,48 @@ export const Root = observer((props: AppRootProps) => { }; }, []); - // Update the navigation when the page or path changes - const navModel = useNavModel( - useMemo( - () => ({ - page, - pages, - path: pathWithoutLeadingSlash, - meta, - grafanaUser: window.grafanaBootData.user, - enableLiveSettings: store.hasFeature(AppFeature.LiveSettings), - enableCloudPage: store.hasFeature(AppFeature.CloudConnection), - backendLicense, - }), - [meta, pathWithoutLeadingSlash, page, store.features, backendLicense] - ) - ); - useEffect(() => { - /* @ts-ignore */ - onNavChanged(navModel); - }, [navModel, onNavChanged]); + const updateBasicData = async () => { + await store.updateBasicData(); + setDidFinishLoading(true); + }; - const Page = pages.find(({ id }) => id === page)?.component || pages[0].component; + const Page = useMemo(() => getPageMatchingComponent(page), [page]); + + if (!didFinishLoading) { + return null; + } return ( - - + {!isTopNavbar() && ( + <> +
+ + + )} + +
+ +
); }); + +function getPageMatchingComponent(pageId: string): (props?: any) => JSX.Element { + let matchingPage = routes[pageId]; + if (!matchingPage) { + const defaultPageId = pages['incidents'].id; + matchingPage = routes[defaultPageId]; + locationService.replace(pages[defaultPageId].path); + } + + return matchingPage.component; +} diff --git a/grafana-plugin/src/state/rootBaseStore.ts b/grafana-plugin/src/state/rootBaseStore.ts index ff884dd0..8dfd0e59 100644 --- a/grafana-plugin/src/state/rootBaseStore.ts +++ b/grafana-plugin/src/state/rootBaseStore.ts @@ -29,6 +29,7 @@ import { Timezone } from 'models/timezone/timezone.types'; import { UserStore } from 'models/user/user'; import { UserGroupStore } from 'models/user_group/user_group'; import { makeRequest } from 'network'; +import { NavMenuItem } from 'pages/routes'; import { AppFeature } from './features'; import { @@ -99,6 +100,9 @@ export class RootBaseStore { @observable onCallApiUrl: string; + @observable + navMenuItem: NavMenuItem; + // -------------------------- userStore: UserStore = new UserStore(this); @@ -125,16 +129,18 @@ export class RootBaseStore { // stores async updateBasicData() { - this.teamStore.loadCurrentTeam(); - this.grafanaTeamStore.updateItems(); - this.updateFeatures(); - this.userStore.updateNotificationPolicyOptions(); - this.userStore.updateNotifyByOptions(); - this.alertReceiveChannelStore.updateAlertReceiveChannelOptions(); - this.alertReceiveChannelStore.updateAlertReceiveChannelOptions(); - this.escalationPolicyStore.updateWebEscalationPolicyOptions(); - this.escalationPolicyStore.updateEscalationPolicyOptions(); - this.escalationPolicyStore.updateNumMinutesInWindowOptions(); + return Promise.all([ + this.teamStore.loadCurrentTeam(), + this.grafanaTeamStore.updateItems(), + this.updateFeatures(), + this.userStore.updateNotificationPolicyOptions(), + this.userStore.updateNotifyByOptions(), + this.alertReceiveChannelStore.updateAlertReceiveChannelOptions(), + this.alertReceiveChannelStore.updateAlertReceiveChannelOptions(), + this.escalationPolicyStore.updateWebEscalationPolicyOptions(), + this.escalationPolicyStore.updateEscalationPolicyOptions(), + this.escalationPolicyStore.updateNumMinutesInWindowOptions(), + ]); } async getUserRole() { diff --git a/grafana-plugin/src/style/index.css b/grafana-plugin/src/style/global.css similarity index 81% rename from grafana-plugin/src/style/index.css rename to grafana-plugin/src/style/global.css index e248f1e8..07a8af39 100644 --- a/grafana-plugin/src/style/index.css +++ b/grafana-plugin/src/style/global.css @@ -1,19 +1,3 @@ -.spin { - width: 100%; - margin-top: 200px; - margin-bottom: 200px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - - /* animation: fadeIn 1s infinite alternate; */ -} - -.spin-text { - margin-top: 20px; -} - .configure-plugin { margin-top: 10px; } @@ -24,6 +8,24 @@ } } +/* Spinner */ + +.spin { + width: 100%; + margin-top: 200px; + margin-bottom: 200px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.spin-text { + margin-top: 20px; +} + +/* Tables */ + .disabled-row { background: #f0f0f0; } @@ -31,3 +33,9 @@ .highlighted-row { background: var(--highlighted-row-bg); } + +/* Navigation */ + +.navbarRootFallback { + margin-top: 24px; +} diff --git a/grafana-plugin/src/style/utils.css b/grafana-plugin/src/style/utils.css new file mode 100644 index 00000000..ab2bda7f --- /dev/null +++ b/grafana-plugin/src/style/utils.css @@ -0,0 +1,20 @@ +.u-flex { + display: flex; + flex-direction: row; +} + +.u-align-items-center { + align-items: center; +} + +.u-position-relative { + position: relative; +} + +.u-pull-right { + margin-left: auto; +} + +.u-pull-left { + margin-right: auto; +} diff --git a/grafana-plugin/src/style/vars.css b/grafana-plugin/src/style/vars.css index 748530b2..8204231a 100644 --- a/grafana-plugin/src/style/vars.css +++ b/grafana-plugin/src/style/vars.css @@ -14,6 +14,7 @@ --gradient-brandHorizontal: linear-gradient(90deg, #f83 0%, #f53e4c 100%); --gradient-brandVertical: linear-gradient(0.01deg, #f53e4c -31.2%, #f83 113.07%); --always-gray: #ccccdc; + --title-marginBottom: 16px; } .theme-light { diff --git a/grafana-plugin/src/utils/hooks.tsx b/grafana-plugin/src/utils/hooks.tsx index a1996767..9dea073d 100644 --- a/grafana-plugin/src/utils/hooks.tsx +++ b/grafana-plugin/src/utils/hooks.tsx @@ -1,90 +1,12 @@ -import React, { useEffect, useRef, useState, useMemo } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; -import { AppRootProps, NavModelItem } from '@grafana/data'; - -import NavBarSubtitle from 'components/NavBar/NavBarSubtitle'; -import { PageDefinition } from 'pages'; - -import { APP_TITLE } from './consts'; - -type Args = { - meta: AppRootProps['meta']; - pages: PageDefinition[]; - path: string; - page: string; - grafanaUser: { - orgRole: 'Viewer' | 'Editor' | 'Admin'; - }; - enableLiveSettings: boolean; - enableCloudPage: boolean; - backendLicense: string; -}; +import { useLocation } from 'react-router-dom'; export function useForceUpdate() { const [, setValue] = useState(0); return () => setValue((value) => value + 1); } -export function useNavModel({ - meta, - pages, - path, - page, - grafanaUser, - enableLiveSettings, - enableCloudPage, - backendLicense, -}: Args) { - return useMemo(() => { - const tabs: NavModelItem[] = []; - - pages.forEach(({ text, icon, id, role, hideFromTabs }) => { - tabs.push({ - text, - icon, - id, - url: `${path}?page=${id}`, - hideFromTabs: - hideFromTabs || - (role === 'Admin' && grafanaUser.orgRole !== role) || - (id === 'live-settings' && !enableLiveSettings) || - (id === 'cloud' && !enableCloudPage), - }); - - if (page === id) { - tabs[tabs.length - 1].active = true; - } - }); - - // Fallback if current `tab` doesn't match any page - if (!tabs.some(({ active }) => active)) { - tabs[0].active = true; - } - - const node = { - text: APP_TITLE, - img: meta.info.logos.large, - subTitle: , - url: path, - children: tabs, - }; - - return { - node, - main: node, - }; - }, [ - meta.info.logos.large, - pages, - path, - page, - enableLiveSettings, - enableCloudPage, - backendLicense, - grafanaUser.orgRole, - ]); -} - export function usePrevious(value: any) { const ref = useRef(); useEffect(() => { @@ -93,6 +15,17 @@ export function usePrevious(value: any) { return ref.current; } +export function useQueryParams() { + const { search } = useLocation(); + + return React.useMemo(() => new URLSearchParams(search), [search]); +} + +export function useQueryPath() { + const location = useLocation(); + return React.useMemo(() => location.pathname, [location]); +} + export function useDebouncedCallback(callback: (...args: A) => void, wait: number) { // track args & timeout handle between calls const argsRef = useRef(); diff --git a/grafana-plugin/src/utils/index.ts b/grafana-plugin/src/utils/index.ts index 76259213..efa429ca 100644 --- a/grafana-plugin/src/utils/index.ts +++ b/grafana-plugin/src/utils/index.ts @@ -6,6 +6,16 @@ import appEvents from 'grafana/app/core/app_events'; import { isArray, concat, isPlainObject, flatMap, map, keys } from 'lodash-es'; import qs from 'query-string'; +export class KeyValuePair { + key: string; + value: string; + + constructor(key: string, value: string) { + this.key = key; + this.value = value; + } +} + export const TZ_OFFSET = new Date().getTimezoneOffset(); export const getTzOffsetHours = (): number => { diff --git a/grafana-plugin/yarn.lock b/grafana-plugin/yarn.lock index e410d4bb..6902ad29 100644 --- a/grafana-plugin/yarn.lock +++ b/grafana-plugin/yarn.lock @@ -22,38 +22,59 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.4", "@babel/compat-data@^7.20.0": +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.9", "@babel/core@^7.18.9", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" - integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== +"@babel/core@7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.6" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helpers" "^7.19.4" - "@babel/parser" "^7.19.6" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.6" - "@babel/types" "^7.19.4" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.19.6", "@babel/generator@^7.20.1", "@babel/generator@^7.7.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.1.tgz#ef32ecd426222624cbd94871a7024639cf61a9fa" - integrity sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg== +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.9", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" + integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== dependencies: - "@babel/types" "^7.20.0" + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.2" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.1" + "@babel/parser" "^7.20.2" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.9", "@babel/generator@^7.20.1", "@babel/generator@^7.20.2", "@babel/generator@^7.7.2": + version "7.20.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" + integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== + dependencies: + "@babel/types" "^7.20.2" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -72,7 +93,7 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== @@ -82,17 +103,17 @@ browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b" - integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0", "@babel/helper-create-class-features-plugin@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz#3c08a5b5417c7f07b5cf3dfb6dc79cbec682e8c2" + integrity sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-member-expression-to-functions" "^7.18.9" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": @@ -156,19 +177,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" - integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.6" - "@babel/types" "^7.19.4" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -177,10 +198,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -192,7 +213,7 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9", "@babel/helper-replace-supers@^7.19.1": +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== @@ -203,12 +224,12 @@ "@babel/traverse" "^7.19.1" "@babel/types" "^7.19.0" -"@babel/helper-simple-access@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" - integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== +"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.19.4" + "@babel/types" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers@^7.18.9": version "7.20.0" @@ -249,7 +270,7 @@ "@babel/traverse" "^7.19.0" "@babel/types" "^7.19.0" -"@babel/helpers@^7.19.4": +"@babel/helpers@^7.18.9", "@babel/helpers@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== @@ -267,10 +288,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.6", "@babel/parser@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.1.tgz#3e045a92f7b4623cafc2425eddcb8cf2e54f9cc5" - integrity sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.9", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" + integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -288,7 +309,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.19.1": +"@babel/plugin-proposal-async-generator-functions@^7.18.6", "@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== @@ -316,12 +337,12 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.0.tgz#3acef1f1206d7a6a1436aa6ccf9ed7b1bd06aff7" - integrity sha512-vnuRRS20ygSxclEYikHzVrP9nZDFXaSzvJxGLQNAiBX041TmhS4hOUHWNIpq/q4muENuEP9XPJFXTNFejhemkg== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.2.tgz#1c6c32b2a44b154ebeec2bb534f9eaebdb541fb6" + integrity sha512-nkBH96IBmgKnbHQ5gXFrcmez+Z9S2EIDKDQGp005ROqBigc88Tky4rzCnlP/lnlj245dCEQl4/YyV0V1kYh5dw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/plugin-syntax-decorators" "^7.19.0" @@ -385,16 +406,16 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.18.8" -"@babel/plugin-proposal-object-rest-spread@^7.18.9", "@babel/plugin-proposal-object-rest-spread@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz#a8fc86e8180ff57290c91a75d83fe658189b642d" - integrity sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q== +"@babel/plugin-proposal-object-rest-spread@^7.18.9", "@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" + integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== dependencies: - "@babel/compat-data" "^7.19.4" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.1" "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -488,7 +509,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.18.6": +"@babel/plugin-syntax-import-assertions@^7.18.6", "@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== @@ -602,25 +623,25 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.19.4": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.0.tgz#91fe5e6ffc9ba13cb6c95ed7f0b1204f68c988c5" - integrity sha512-sXOohbpHZSk7GjxK9b3dKB7CfqUD5DwOH+DggKzOQ7TXYP+RCSbRykfjQmn/zq+rBjycVRtLf9pYhAaEJA786w== +"@babel/plugin-transform-block-scoping@^7.18.9", "@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz#f59b1767e6385c663fd0bce655db6ca9c8b236ed" + integrity sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20" - integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== +"@babel/plugin-transform-classes@^7.18.9", "@babel/plugin-transform-classes@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" + integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.19.0" + "@babel/helper-compilation-targets" "^7.20.0" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.19.1" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" @@ -631,12 +652,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.19.4", "@babel/plugin-transform-destructuring@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.0.tgz#712829ef4825d9cc04bb379de316f981e9a6f648" - integrity sha512-1dIhvZfkDVx/zn2S1aFwlruspTt4189j7fEkH0Y0VyuDM6bQt7bD6kLcz3l4IlLG+e5OReaBz9ROAbttRtUHqA== +"@babel/plugin-transform-destructuring@^7.18.9", "@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" + integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" @@ -691,7 +712,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.18.6": +"@babel/plugin-transform-modules-amd@^7.18.6", "@babel/plugin-transform-modules-amd@^7.19.6": version "7.19.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== @@ -699,7 +720,7 @@ "@babel/helper-module-transforms" "^7.19.6" "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-modules-commonjs@^7.18.6": +"@babel/plugin-transform-modules-commonjs@^7.18.6", "@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.19.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== @@ -708,7 +729,7 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/helper-simple-access" "^7.19.4" -"@babel/plugin-transform-modules-systemjs@^7.19.0": +"@babel/plugin-transform-modules-systemjs@^7.18.9", "@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.19.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== @@ -726,7 +747,7 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": +"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== @@ -749,12 +770,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.18.8": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.1.tgz#9a5aa370fdcce36f110455e9369db7afca0f9eeb" - integrity sha512-nDvKLrAvl+kf6BOy1UJ3MGwzzfTMgppxwiD2Jb4LO3xjYyZq30oQzDNJbCQpMdG9+j2IXHoiMrw5Cm/L6ZoxXQ== +"@babel/plugin-transform-parameters@^7.18.8", "@babel/plugin-transform-parameters@^7.20.1": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz#7b3468d70c3c5b62e46be0a47b6045d8590fb748" + integrity sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -771,11 +792,11 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.18.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz#edf3bec47eb98f14e84fa0af137fcc6aad8e0443" - integrity sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" + integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" @@ -825,16 +846,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-runtime@7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz#d9e4b1b25719307bfafbf43065ed7fb3a83adb8f" - integrity sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg== +"@babel/plugin-transform-runtime@7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz#37d14d1fa810a368fd635d4d1476c0154144a96f" + integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== dependencies: "@babel/helper-module-imports" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.9" - babel-plugin-polyfill-corejs2 "^0.3.1" - babel-plugin-polyfill-corejs3 "^0.5.2" - babel-plugin-polyfill-regenerator "^0.3.1" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" semver "^6.3.0" "@babel/plugin-transform-runtime@^7.19.6": @@ -856,7 +877,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.19.0": +"@babel/plugin-transform-spread@^7.18.9", "@babel/plugin-transform-spread@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== @@ -885,25 +906,25 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz#303feb7a920e650f2213ef37b36bbf327e6fa5a0" - integrity sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-typescript" "^7.18.6" - -"@babel/plugin-transform-typescript@^7.18.12", "@babel/plugin-transform-typescript@^7.18.6": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.0.tgz#2c7ec62b8bfc21482f3748789ba294a46a375169" - integrity sha512-xOAsAFaun3t9hCwZ13Qe7gq423UgMZ6zAgmLxeGGapFqlT/X3L5qT2btjiVLlFn7gWtMaVyceS5VxGAuKbgizw== +"@babel/plugin-transform-typescript@7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.0.tgz#50c3a68ec8efd5e040bde2cd764e8e16bc0cbeaf" + integrity sha512-DOOIywxPpkQHXijXv+s9MDAyZcLp12oYRl3CMWZ6u7TjSoCBq/KqHR/nNFR3+i2xqheZxoF0H2XyL7B6xeSRuA== dependencies: "@babel/helper-create-class-features-plugin" "^7.19.0" "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-typescript" "^7.18.6" + +"@babel/plugin-transform-typescript@^7.18.12", "@babel/plugin-transform-typescript@^7.18.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" + integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" -"@babel/plugin-transform-unicode-escapes@^7.18.10": +"@babel/plugin-transform-unicode-escapes@^7.18.10", "@babel/plugin-transform-unicode-escapes@^7.18.6": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== @@ -918,18 +939,18 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@^7.18.10", "@babel/preset-env@^7.18.9": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.4.tgz#4c91ce2e1f994f717efb4237891c3ad2d808c94b" - integrity sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg== +"@babel/preset-env@7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.9.tgz#9b3425140d724fbe590322017466580844c7eaff" + integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg== dependencies: - "@babel/compat-data" "^7.19.4" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.19.1" + "@babel/plugin-proposal-async-generator-functions" "^7.18.6" "@babel/plugin-proposal-class-properties" "^7.18.6" "@babel/plugin-proposal-class-static-block" "^7.18.6" "@babel/plugin-proposal-dynamic-import" "^7.18.6" @@ -938,7 +959,7 @@ "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.19.4" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" "@babel/plugin-proposal-optional-chaining" "^7.18.9" "@babel/plugin-proposal-private-methods" "^7.18.6" @@ -962,10 +983,10 @@ "@babel/plugin-transform-arrow-functions" "^7.18.6" "@babel/plugin-transform-async-to-generator" "^7.18.6" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.19.4" - "@babel/plugin-transform-classes" "^7.19.0" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.18.9" "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.19.4" + "@babel/plugin-transform-destructuring" "^7.18.9" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" @@ -975,12 +996,93 @@ "@babel/plugin-transform-member-expression-literals" "^7.18.6" "@babel/plugin-transform-modules-amd" "^7.18.6" "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.0" + "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.18.9" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.6" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-env@^7.18.10": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" "@babel/plugin-transform-modules-umd" "^7.18.6" "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.1" "@babel/plugin-transform-property-literals" "^7.18.6" "@babel/plugin-transform-regenerator" "^7.18.6" "@babel/plugin-transform-reserved-words" "^7.18.6" @@ -992,7 +1094,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.18.10" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.19.4" + "@babel/types" "^7.20.2" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -1010,7 +1112,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.18.6": +"@babel/preset-react@7.18.6", "@babel/preset-react@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== @@ -1022,7 +1124,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.18.6" "@babel/plugin-transform-react-pure-annotations" "^7.18.6" -"@babel/preset-typescript@^7.18.6": +"@babel/preset-typescript@7.18.6", "@babel/preset-typescript@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== @@ -1046,7 +1148,7 @@ dependencies: regenerator-runtime "^0.13.10" -"@babel/template@^7.18.10", "@babel/template@^7.3.3": +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== @@ -1055,7 +1157,7 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.6", "@babel/traverse@^7.20.1", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.18.9", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.7.2": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== @@ -1071,10 +1173,10 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.0.tgz#52c94cf8a7e24e89d2a194c25c35b17a64871479" - integrity sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg== +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" + integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" @@ -1364,55 +1466,42 @@ ua-parser-js "^1.0.2" web-vitals "^2.1.4" -"@grafana/data@9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@grafana/data/-/data-9.1.1.tgz#342af5824359ae6f8b4f1bcc1ebb2ae3fb3e4d37" - integrity sha512-DO2Ry97iGbpnJCwz1yA6yQgp34Diaan34t9zXJXGdEFNZ72hbKAtoDxo6X03QTynMtrB0AJcsDIYmSUAkeZQog== +"@grafana/data@9.2.4", "@grafana/data@^9.2.4": + version "9.2.4" + resolved "https://registry.yarnpkg.com/@grafana/data/-/data-9.2.4.tgz#38067f207006c07754c3ed5a8835dc1909df7e2d" + integrity sha512-ukrvtQ0CzijpRZhBriv3LX935BKXRX4jf9l+jgK2uZJSYFAMbgz/Fvfagfr7sYmIPe8Ms4r3hslu2hbynWHzTw== dependencies: "@braintree/sanitize-url" "6.0.0" - "@grafana/schema" "9.1.1" + "@grafana/schema" "9.2.4" "@types/d3-interpolate" "^1.4.0" d3-interpolate "1.4.0" date-fns "2.29.1" eventemitter3 "4.0.7" + fast_array_intersect "1.1.0" + history "4.10.1" lodash "4.17.21" - marked "4.0.18" + marked "4.1.0" moment "2.29.4" - moment-timezone "0.5.34" + moment-timezone "0.5.35" ol "6.15.1" papaparse "5.3.2" - react "17.0.2" - react-dom "17.0.2" regenerator-runtime "0.13.9" rxjs "7.5.6" + tinycolor2 "1.4.2" tslib "2.4.0" uplot "1.6.22" xss "1.0.13" -"@grafana/e2e-selectors@9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@grafana/e2e-selectors/-/e2e-selectors-9.1.1.tgz#acd53200f7c6f7f831266434cf9d61b2dc0580bd" - integrity sha512-2y0Sb3sDYn/3iuYQmjI8Aae6vWY12vwDwZFMbgvWZW1/Bnn8YqEyYu0LyIV6QWdoLfAjre/7KPYzja2fjM8uZQ== +"@grafana/e2e-selectors@9.2.4": + version "9.2.4" + resolved "https://registry.yarnpkg.com/@grafana/e2e-selectors/-/e2e-selectors-9.2.4.tgz#748539cc0313ee1c23055a100313235ef2fca64b" + integrity sha512-k8Pqjb5yZa/rT0djUNceiDQCN6SIpYciwJbfn/8fl5zAEMLpInx9n8EfnefkinaAfxKcMB4IhDH/R+l4D0hAlQ== dependencies: "@grafana/tsconfig" "^1.2.0-rc1" tslib "2.4.0" - typescript "4.7.4" + typescript "4.8.2" -"@grafana/eslint-config@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@grafana/eslint-config/-/eslint-config-4.0.0.tgz#3fbb1c9cdcc4822226ecf53f3f532fecfd58861e" - integrity sha512-Xhm90JRmglcOSgGxhHldSRnnQ+XyX4wKEwegy5kTPlAwUBp6Mcu5ptKw/Atx1gVgrvN2wgcuhYMMsFKpv+caZg== - dependencies: - "@typescript-eslint/eslint-plugin" "5.16.0" - "@typescript-eslint/parser" "5.16.0" - eslint "8.11.0" - eslint-config-prettier "8.5.0" - eslint-plugin-jsdoc "38.0.6" - eslint-plugin-react "7.29.4" - eslint-plugin-react-hooks "4.3.0" - typescript "4.6.4" - -"@grafana/eslint-config@^5.0.0": +"@grafana/eslint-config@5.0.0", "@grafana/eslint-config@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@grafana/eslint-config/-/eslint-config-5.0.0.tgz#e08a89d378772340bc6cd1872ec4d15666269aba" integrity sha512-8kJ95KYyeSBjucdu9R4qem8ik6s3LdCRxC2cfub9vSngzUyQIwPpXbLlWr9FrpZcmP5NiZBB15FhpW/FxjYbQQ== @@ -1426,74 +1515,50 @@ eslint-plugin-react-hooks "4.3.0" typescript "4.6.4" -"@grafana/runtime@9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@grafana/runtime/-/runtime-9.1.1.tgz#412ad5d087b72f1b7a21776c2e6fbcbc6483e61f" - integrity sha512-vr+F3921J3XczGgCH0/TiQ/k8NHtFLIK+5rMXpEZZiX9tNGI55DeWhKcQ6c9pIF73vkglvSiUl8ixsnydi1S/Q== +"@grafana/runtime@^9.2.4": + version "9.2.4" + resolved "https://registry.yarnpkg.com/@grafana/runtime/-/runtime-9.2.4.tgz#f3d1a4e2ee51fed76ac31a37422e5978e3ff57a9" + integrity sha512-k6YLPBB8waRe5SqzwmhxwzEYduY3GvBsZTbERIwf+8/ep7kfRnqAhbbFFUujQU4+pgBd3N6HtXBg9KKB6eLqaA== dependencies: "@grafana/agent-web" "^0.4.0" - "@grafana/data" "9.1.1" - "@grafana/e2e-selectors" "9.1.1" - "@grafana/ui" "9.1.1" + "@grafana/data" "9.2.4" + "@grafana/e2e-selectors" "9.2.4" + "@grafana/ui" "9.2.4" "@sentry/browser" "6.19.7" history "4.10.1" lodash "4.17.21" - react "17.0.2" - react-dom "17.0.2" rxjs "7.5.6" systemjs "0.20.19" tslib "2.4.0" -"@grafana/schema@9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@grafana/schema/-/schema-9.1.1.tgz#ece11c4c0adad15b66fe63854ea76011e7e1202a" - integrity sha512-gEsnoqemRvPVZkaHYWvZt3vfvhS4nxENQjpJlIkzCa04iWVJpHu/j0lylPVtFAg8YXY8AyIK1ECWqwnb2ANfCw== +"@grafana/schema@9.2.4": + version "9.2.4" + resolved "https://registry.yarnpkg.com/@grafana/schema/-/schema-9.2.4.tgz#d96bfa80ef0f5e59d83002544d4570c19d79b934" + integrity sha512-O5lZrT2AdVNisGhqaEjat0MgHlnKN1M3vbdaEcvrXwyXOaZU6V/A3LjR+pNAcplYgw+9BjBdm/83vQFgQZ2s2g== dependencies: tslib "2.4.0" -"@grafana/slate-react@0.22.10-grafana": - version "0.22.10-grafana" - resolved "https://registry.yarnpkg.com/@grafana/slate-react/-/slate-react-0.22.10-grafana.tgz#53653bbef73530334a2db284129ccd0dfd682fef" - integrity sha512-Dl/Nfft7i6enS1ToWUInv7V3L5UhhtpIdRln+967f5roj+cI+enqOhpP0HY+4rAp6XW0qUVRujqc30KJKID3jg== +"@grafana/toolkit@^9.2.4": + version "9.2.4" + resolved "https://registry.yarnpkg.com/@grafana/toolkit/-/toolkit-9.2.4.tgz#91ab3c391297a4b1ee5d4a8a0deb9118739b6295" + integrity sha512-EHaXvJAVlN9lf0iQoBh9V6XZxWmgPPRrJazJS551jG1nWnk6ycvz7yqxKhXB4Jk0MnLZGBtPFPh/CczcYoVnrw== dependencies: - debug "^3.1.0" - get-window "^1.1.1" - is-window "^1.0.2" - lodash "^4.1.1" - memoize-one "^4.0.0" - prop-types "^15.5.8" - react-immutable-proptypes "^2.1.0" - selection-is-backward "^1.0.0" - slate-base64-serializer "^0.2.111" - slate-dev-environment "^0.2.2" - slate-hotkeys "^0.2.9" - slate-plain-serializer "^0.7.10" - slate-prop-types "^0.5.41" - slate-react-placeholder "^0.2.8" - tiny-invariant "^1.0.1" - tiny-warning "^0.0.3" - -"@grafana/toolkit@9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@grafana/toolkit/-/toolkit-9.1.1.tgz#0f75b8977a498e9f502ad3b5fd40c9d653b6b5f9" - integrity sha512-i7Dr9VcLFdXO8j6QnoZdropW1d7nh0TiKVs9FCdTgcwsSmxTJ7g3h1vvTCilnL0zOjU3UsZsvRThGaIMQixcBw== - dependencies: - "@babel/core" "^7.18.9" + "@babel/core" "7.18.9" "@babel/plugin-proposal-class-properties" "7.18.6" "@babel/plugin-proposal-nullish-coalescing-operator" "7.18.6" "@babel/plugin-proposal-object-rest-spread" "7.18.9" "@babel/plugin-proposal-optional-chaining" "7.18.9" "@babel/plugin-syntax-dynamic-import" "7.8.3" "@babel/plugin-transform-react-constant-elements" "7.18.9" - "@babel/plugin-transform-runtime" "7.18.9" - "@babel/plugin-transform-typescript" "7.18.8" - "@babel/preset-env" "^7.18.9" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@grafana/data" "9.1.1" - "@grafana/eslint-config" "^4.0.0" + "@babel/plugin-transform-runtime" "7.18.10" + "@babel/plugin-transform-typescript" "7.19.0" + "@babel/preset-env" "7.18.9" + "@babel/preset-react" "7.18.6" + "@babel/preset-typescript" "7.18.6" + "@grafana/data" "9.2.4" + "@grafana/eslint-config" "5.0.0" "@grafana/tsconfig" "^1.2.0-rc1" - "@grafana/ui" "9.1.1" + "@grafana/ui" "9.2.4" "@jest/core" "27.5.1" "@types/command-exists" "^1.2.0" "@types/eslint" "8.4.1" @@ -1507,8 +1572,8 @@ "@types/rimraf" "3.0.2" "@types/semver" "7.3.9" "@types/tmp" "0.2.3" - "@typescript-eslint/eslint-plugin" "5.16.0" - "@typescript-eslint/parser" "5.16.0" + "@typescript-eslint/eslint-plugin" "5.36.2" + "@typescript-eslint/parser" "5.36.2" axios "^0.26.1" babel-jest "27.5.1" babel-loader "^8.2.5" @@ -1525,7 +1590,6 @@ eslint-plugin-react "7.29.4" eslint-plugin-react-hooks "4.6.0" execa "^5.1.1" - file-loader "^6.2.0" fork-ts-checker-webpack-plugin "^7.2.1" fs-extra "^10.0.0" globby "^11.0.4" @@ -1561,8 +1625,7 @@ ts-loader "^9.3.1" ts-node "^9.1.0" tslib "2.4.0" - typescript "4.7.4" - url-loader "^4.1.1" + typescript "4.8.2" webpack "^5.72.0" "@grafana/tsconfig@^1.2.0-rc1": @@ -1570,31 +1633,30 @@ resolved "https://registry.yarnpkg.com/@grafana/tsconfig/-/tsconfig-1.2.0-rc1.tgz#10973c978ec95b0ea637511254b5f478bce04de7" integrity sha512-+SgQeBQ1pT6D/E3/dEdADqTrlgdIGuexUZ8EU+8KxQFKUeFeU7/3z/ayI2q/wpJ/Kr6WxBBNlrST6aOKia19Ag== -"@grafana/ui@9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@grafana/ui/-/ui-9.1.1.tgz#b9778cb7db70ea4fe70836461f1e53873ae0e0b6" - integrity sha512-jfZfke4THg35wPl8Y9vrssNwkv3q9a2gsJ2tVv0ZqFEnJl2RVnG2csw72hAtAyqTs/lykOyb8IM9kE6AlPxtKQ== +"@grafana/ui@9.2.4", "@grafana/ui@^9.2.4": + version "9.2.4" + resolved "https://registry.yarnpkg.com/@grafana/ui/-/ui-9.2.4.tgz#885b0f10bd700aa0dc094f2fcb554477fc47e410" + integrity sha512-V9sNQwcAkMAmWjM/DLMw9X+J0nqBmrwNV1uJ1kyS+3cRRwCNyJsZUz3NuOnzCbvCEl3bopLyY/WBSHONbLEoig== dependencies: "@emotion/css" "11.9.0" "@emotion/react" "11.9.3" - "@grafana/data" "9.1.1" - "@grafana/e2e-selectors" "9.1.1" - "@grafana/schema" "9.1.1" - "@grafana/slate-react" "0.22.10-grafana" - "@monaco-editor/react" "4.3.1" + "@grafana/data" "9.2.4" + "@grafana/e2e-selectors" "9.2.4" + "@grafana/schema" "9.2.4" + "@monaco-editor/react" "4.4.5" "@popperjs/core" "2.11.5" - "@react-aria/button" "3.5.1" - "@react-aria/dialog" "3.2.1" - "@react-aria/focus" "3.6.1" - "@react-aria/menu" "3.5.1" - "@react-aria/overlays" "3.9.1" + "@react-aria/button" "3.6.1" + "@react-aria/dialog" "3.3.1" + "@react-aria/focus" "3.8.0" + "@react-aria/menu" "3.6.1" + "@react-aria/overlays" "3.10.1" "@react-aria/utils" "3.13.1" - "@react-stately/menu" "3.3.1" + "@react-stately/menu" "3.4.1" "@sentry/browser" "6.19.7" ansicolor "1.1.100" calculate-size "1.1.1" classnames "2.3.1" - core-js "3.24.0" + core-js "3.25.1" d3 "5.15.0" date-fns "2.29.1" hoist-non-react-statics "3.3.2" @@ -1604,19 +1666,17 @@ lodash "4.17.21" memoize-one "6.0.0" moment "2.29.4" - monaco-editor "^0.31.1" + monaco-editor "0.34.0" ol "6.15.1" - prismjs "1.28.0" + prismjs "1.29.0" rc-cascader "3.6.1" rc-drawer "4.4.3" rc-slider "9.7.5" rc-time-picker "^3.7.3" - react "17.0.2" react-beautiful-dnd "13.1.0" react-calendar "3.7.0" react-colorful "5.5.1" react-custom-scrollbars-2 "4.5.0" - react-dom "17.0.2" react-dropzone "14.2.2" react-highlight-words "0.18.0" react-hook-form "7.5.3" @@ -1631,8 +1691,9 @@ react-use "17.4.0" react-window "1.8.7" rxjs "7.5.6" - slate "0.47.8" - slate-plain-serializer "0.7.10" + slate "0.47.9" + slate-plain-serializer "0.7.11" + slate-react "0.22.10" tinycolor2 "1.4.2" tslib "2.4.0" uplot "1.6.22" @@ -1767,10 +1828,10 @@ "@types/node" "*" jest-mock "^27.5.1" -"@jest/expect-utils@^29.2.2": - version "29.2.2" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.2.2.tgz#460a5b5a3caf84d4feb2668677393dd66ff98665" - integrity sha512-vwnVmrVhTmGgQzyvcpze08br91OL61t9O0lJMDyb6Y/D8EKQ9V7rGUb/p7PDt0GPzK0zFYqXWFo4EO2legXmkg== +"@jest/expect-utils@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" + integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== dependencies: jest-get-type "^29.2.0" @@ -1786,7 +1847,7 @@ jest-mock "^27.5.1" jest-util "^27.5.1" -"@jest/globals@27.5.1", "@jest/globals@^27.5.1": +"@jest/globals@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== @@ -1894,10 +1955,10 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.2.1.tgz#ec9c683094d4eb754e41e2119d8bdaef01cf6da0" - integrity sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw== +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== dependencies: "@jest/schemas" "^29.0.0" "@types/istanbul-lib-coverage" "^2.0.0" @@ -1995,19 +2056,19 @@ resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" integrity sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA== -"@monaco-editor/loader@^1.2.0": +"@monaco-editor/loader@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.2.tgz#04effbb87052d19cd7d3c9d81c0635490f9bb6d8" integrity sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g== dependencies: state-local "^1.0.6" -"@monaco-editor/react@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.3.1.tgz#d65bcbf174c39b6d4e7fec43d0cddda82b70a12a" - integrity sha512-f+0BK1PP/W5I50hHHmwf11+Ea92E5H1VZXs+wvKplWUWOfyMa1VVwqkJrXjRvbcqHL+XdIGYWhWNdi4McEvnZg== +"@monaco-editor/react@4.4.5": + version "4.4.5" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.4.5.tgz#beabe491efeb2457441a00d1c7651c653697f65b" + integrity sha512-IImtzU7sRc66OOaQVCG+5PFHkSWnnhrUWGBuH6zNmH2h0YgmAhcjHZQc/6MY9JWEbUtVF1WPBMJ9u1XuFbRrVA== dependencies: - "@monaco-editor/loader" "^1.2.0" + "@monaco-editor/loader" "^1.3.2" prop-types "^15.7.2" "@nodelib/fs.scandir@2.1.5": @@ -2039,9 +2100,9 @@ "@opentelemetry/api" "^1.0.0" "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.2.0.tgz#89ef99401cde6208cff98760b67663726ef26686" - integrity sha512-0nBr+VZNKm9tvNDZFstI3Pq1fCTEDK5OZTnVKNvBNAKgd0yIvmwsP4m61rEv7ZP+tOUjWJhROpxK5MsnlF911g== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.3.0.tgz#27c6f776ac3c1c616651e506a89f438a0ed6a055" + integrity sha512-YveTnGNsFFixTKJz09Oi4zYkiLT5af3WpZDu4aIUM7xX+2bHAkOJayFTVQd6zB8kkWPpbua4Ha6Ql00grdLlJQ== "@opentelemetry/core@1.3.1": version "1.3.1" @@ -2113,41 +2174,43 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== -"@react-aria/button@3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.5.1.tgz#8084a50d4f7daa34dfd7b6d41b90f40dcf15e15e" - integrity sha512-M0AaDeJoM4wu2xkv1FvbhuvWB78yF8yNE91KkyEW+TMBiEjSaij61jyov95m08DT2EXSxuXnch3BoP8s3XHj4g== - dependencies: - "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.6.1" - "@react-aria/interactions" "^3.9.1" - "@react-aria/utils" "^3.13.1" - "@react-stately/toggle" "^3.3.1" - "@react-types/button" "^3.5.1" - -"@react-aria/dialog@3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.2.1.tgz#8e004727b7cc6fcde3ab4de2a50c7d06e6b0d7c3" - integrity sha512-q3834JCNXcVSSfiez8R+6OunQzwiaM/sGctklRVBUooo80nJbPhnegumKiYe1Va4Gz7i/aLZwSEeK4AU3GMA9Q== - dependencies: - "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.6.1" - "@react-aria/utils" "^3.13.1" - "@react-stately/overlays" "^3.3.1" - "@react-types/dialog" "^3.4.1" - -"@react-aria/focus@3.6.1": +"@react-aria/button@3.6.1": version "3.6.1" - resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.6.1.tgz#46478d0919bdc4fedfa1ea115b36f93c055ce8d8" - integrity sha512-4IHAu+826jC3SjWwuaYhCr0qhWg4XwmJIUEhcL1wbw3fq2dsjIBwEJ5HoayhluiVCfjGbcQcJNf1L4Vj3VTp4w== + resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.6.1.tgz#111e296df8e171e4eb227c306f087337490bc896" + integrity sha512-g10dk0eIQ71F1QefUymbff0yceQFHEKzOwK7J5QAFB5w/FUSmCTsMkBrrra4AogRxYHIAr5adPic5F2g7VzQFw== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/interactions" "^3.9.1" - "@react-aria/utils" "^3.13.1" - "@react-types/shared" "^3.13.1" + "@react-aria/focus" "^3.8.0" + "@react-aria/interactions" "^3.11.0" + "@react-aria/utils" "^3.13.3" + "@react-stately/toggle" "^3.4.1" + "@react-types/button" "^3.6.1" + "@react-types/shared" "^3.14.1" + +"@react-aria/dialog@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.3.1.tgz#16e250ecc25ddd5da140a4b3dccb4af0d2bfacb8" + integrity sha512-Sz7XdzX3rRhmfIp1rYS5D90T1tqiDsAkONsbPBRqUJx7NrjKiHhx3wvG4shiK66cPhAZwBk7wuQmMugDeIDFSA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/focus" "^3.8.0" + "@react-aria/utils" "^3.13.3" + "@react-stately/overlays" "^3.4.1" + "@react-types/dialog" "^3.4.3" + "@react-types/shared" "^3.14.1" + +"@react-aria/focus@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.8.0.tgz#b292df7e35ed1b57af43f98df8135b00c4667d17" + integrity sha512-XuaLFdqf/6OyILifkVJo++5k2O+wlpNvXgsJkRWn/wSmB77pZKURm2MMGiSg2u911NqY+829UrSlpmhCZrc8RA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/interactions" "^3.11.0" + "@react-aria/utils" "^3.13.3" + "@react-types/shared" "^3.14.1" clsx "^1.1.1" -"@react-aria/focus@^3.6.1", "@react-aria/focus@^3.9.0": +"@react-aria/focus@^3.8.0", "@react-aria/focus@^3.9.0": version "3.9.0" resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.9.0.tgz#fa4478eebdc3c199a0529470f1d7b36608ef0d10" integrity sha512-DwesjEjWjFfwAwzv9qeqkyKZNPAYmPa3UrygxzmXeKEg2JpaACGZPxRcmT2EFJFEDbX8daQDEeRGyLO49o5agg== @@ -2158,7 +2221,7 @@ "@react-types/shared" "^3.15.0" clsx "^1.1.1" -"@react-aria/i18n@^3.4.1", "@react-aria/i18n@^3.6.1": +"@react-aria/i18n@^3.6.0", "@react-aria/i18n@^3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.6.1.tgz#b97e78e3ec040a5ca08d166033f2d358ef1af4c5" integrity sha512-kAetWsj9HOqwaqLhmFU2udhZ+4QGGYkQOgGBJYdrB7GfLZQ1GPBlZjv3QFdkX4oSf/k9cFqgftxvVQQDYZLOew== @@ -2172,7 +2235,7 @@ "@react-aria/utils" "^3.14.0" "@react-types/shared" "^3.15.0" -"@react-aria/interactions@^3.12.0", "@react-aria/interactions@^3.9.1": +"@react-aria/interactions@^3.11.0", "@react-aria/interactions@^3.12.0": version "3.12.0" resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.12.0.tgz#b16a392c3dc23351c8fd33a16cef0ef93dc4682d" integrity sha512-KcKurjPZwme9ggvGQjbjqZtZtuyXipTBVMHUah9a3+Dz7vXxhRg5vFaEdM79oQnNsrGFW5xS6SKBehl/JG6BMw== @@ -2181,42 +2244,41 @@ "@react-aria/utils" "^3.14.0" "@react-types/shared" "^3.15.0" -"@react-aria/menu@3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.5.1.tgz#5e37a29685e8fe72730c855e13526522d1cdee89" - integrity sha512-6l9m3/zs3EwSQ5B62wYaLGYP0zif6Esyh+rnxvbwlknsqUsTTDYc8Ly25M5PcGK4oeeLjHajPdFq6hMfNNhMgg== +"@react-aria/menu@3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.6.1.tgz#91ad540795316623e539b32163a5d6a95f09052c" + integrity sha512-HUJVIOW9TwDS4RpAaw9/JqcOXFCn3leVUumWLfbwwzxON/Sbywr1j1jLuIkfIRAPmp0QVd42f6/9Y0cfH78BQQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.4.1" - "@react-aria/interactions" "^3.9.1" - "@react-aria/overlays" "^3.9.1" - "@react-aria/selection" "^3.9.1" - "@react-aria/utils" "^3.13.1" - "@react-stately/collections" "^3.4.1" - "@react-stately/menu" "^3.3.1" - "@react-stately/tree" "^3.3.1" - "@react-types/button" "^3.5.1" - "@react-types/menu" "^3.6.1" - "@react-types/shared" "^3.13.1" + "@react-aria/i18n" "^3.6.0" + "@react-aria/interactions" "^3.11.0" + "@react-aria/overlays" "^3.10.1" + "@react-aria/selection" "^3.10.1" + "@react-aria/utils" "^3.13.3" + "@react-stately/collections" "^3.4.3" + "@react-stately/menu" "^3.4.1" + "@react-stately/tree" "^3.3.3" + "@react-types/button" "^3.6.1" + "@react-types/menu" "^3.7.1" + "@react-types/shared" "^3.14.1" -"@react-aria/overlays@3.9.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.9.1.tgz#15905afc40076b51054f17588cfb1fb56c4de47e" - integrity sha512-gQlM9MQX+RZiX5kxuyX5C2hv7Wm0k1wM4VBfeBmcPbcOGJz3v//GN002PuSUjSTx6eaTNuQeks7Qx0Wovsnd5A== +"@react-aria/overlays@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.10.1.tgz#ea7995d818030482987fbcd2f65344daf67175c2" + integrity sha512-6hY+3PQzFXQ2Gf656IiUy2VCwxzNohCHxHTZb7WTlOyNWDN77q8lzuHBlaoEzyh25M8CCO6NPa5DukyK3uCHSQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.4.1" - "@react-aria/interactions" "^3.9.1" - "@react-aria/utils" "^3.13.1" - "@react-aria/visually-hidden" "^3.3.1" - "@react-stately/overlays" "^3.3.1" - "@react-types/button" "^3.5.1" - "@react-types/overlays" "^3.6.1" - "@react-types/shared" "^3.13.1" - dom-helpers "^5.2.1" - react-transition-group "^4.4.2" + "@react-aria/i18n" "^3.6.0" + "@react-aria/interactions" "^3.11.0" + "@react-aria/ssr" "^3.3.0" + "@react-aria/utils" "^3.13.3" + "@react-aria/visually-hidden" "^3.4.1" + "@react-stately/overlays" "^3.4.1" + "@react-types/button" "^3.6.1" + "@react-types/overlays" "^3.6.3" + "@react-types/shared" "^3.14.1" -"@react-aria/overlays@^3.9.1": +"@react-aria/overlays@^3.10.1": version "3.11.0" resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.11.0.tgz#9ecab7fbaf88b7c315215d55a3eb1ae1aa5b78f2" integrity sha512-NqLqxSiEW9AuUPcEHCIp2lHH1moNxlkP0CkuUMkT2/T5MCPm/Iq+uD53VSR+NyeCWU/aGH3ykj2kq9NSITJkOA== @@ -2233,7 +2295,7 @@ "@react-types/overlays" "^3.6.4" "@react-types/shared" "^3.15.0" -"@react-aria/selection@^3.9.1": +"@react-aria/selection@^3.10.1": version "3.11.0" resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.11.0.tgz#5d3457e9ea2a5aae4f8abf799da92c723d04172d" integrity sha512-2Qcv0PxXqOrYYT1oL+TOaB+lE/jhIPzVEPHVmf8HYzEMP5WBYP8Q+R9no5s8x++b1W0DsbUVwmk9szY48O9Bmw== @@ -2265,7 +2327,7 @@ "@react-types/shared" "^3.13.1" clsx "^1.1.1" -"@react-aria/utils@^3.13.1", "@react-aria/utils@^3.14.0": +"@react-aria/utils@^3.13.3", "@react-aria/utils@^3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.14.0.tgz#87877e89e959c8b6299da953ec3a7167de2192c3" integrity sha512-DHgmwNBNEhnb6DEYYAfbt99wprBqJJOBBeIpQ2g3+pxwlw4BZ+v4Qr+rDD0ZibWV0mYzt8zOhZ9StpId7iTF0Q== @@ -2276,7 +2338,7 @@ "@react-types/shared" "^3.15.0" clsx "^1.1.1" -"@react-aria/visually-hidden@^3.3.1", "@react-aria/visually-hidden@^3.5.0": +"@react-aria/visually-hidden@^3.4.1", "@react-aria/visually-hidden@^3.5.0": version "3.5.0" resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.5.0.tgz#aa8669545464cdb6a4b2ba47c9695d1405864a06" integrity sha512-tF/kCZCGv1yebwgH21cKbhjSV5CmB5/SAHOUM5YkO5V/lIFjaPtywcamIPI8F0JSfrwGF/Z9EqvqBxvIYGRlCA== @@ -2287,7 +2349,7 @@ "@react-types/shared" "^3.15.0" clsx "^1.1.1" -"@react-stately/collections@^3.4.1", "@react-stately/collections@^3.4.4": +"@react-stately/collections@^3.4.3", "@react-stately/collections@^3.4.4": version "3.4.4" resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.4.4.tgz#9df0b690bac0d3a95bc01352937ec74160c6bd29" integrity sha512-gryUYCe6uzqE0ea5frTwOxOPpx/6Z42PRk7KetOh3ddN3Ts0j8XQP08jP1IB/7BC1QidrkHWvDCqGHxRiEjiIg== @@ -2295,18 +2357,18 @@ "@babel/runtime" "^7.6.2" "@react-types/shared" "^3.15.0" -"@react-stately/menu@3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.3.1.tgz#8d9c9e1ba2bbb7e31cb41bf8f4a5fae2e85c9e25" - integrity sha512-/S4vTsLQK0plhVp25/MmTM38A40pG7fx4wEynSf/bQzS4Jiz+SzZzOBhF1ByysAZJvwREMuXuzakUjTSxLYdvA== +"@react-stately/menu@3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.4.1.tgz#47f23996927ffa605d725e68902e27ef848fe27a" + integrity sha512-DWo87hjKwtQsFiFJYZGcEvzfSYT/I4FoRl3Ose5lA/gPjdg97f42vumj+Kp4mqJwlla4A9Erz2vAh2uMLl4H0w== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/overlays" "^3.3.1" - "@react-stately/utils" "^3.5.0" - "@react-types/menu" "^3.6.1" - "@react-types/shared" "^3.13.1" + "@react-stately/overlays" "^3.4.1" + "@react-stately/utils" "^3.5.1" + "@react-types/menu" "^3.7.1" + "@react-types/shared" "^3.14.1" -"@react-stately/menu@^3.3.1": +"@react-stately/menu@^3.4.1": version "3.4.2" resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.4.2.tgz#5bb6847c9bf4a6140d561114b5f8709a4df12a51" integrity sha512-vFC8EloVEcqf6sgiP6ABIkC41ytjoJiGtj7Ws5OS7PvZNyxxDgJr4V0O3Pxd1T0AjlHCloBbojnvoTRwZiSr/A== @@ -2317,7 +2379,7 @@ "@react-types/menu" "^3.7.2" "@react-types/shared" "^3.15.0" -"@react-stately/overlays@^3.3.1", "@react-stately/overlays@^3.4.2": +"@react-stately/overlays@^3.4.1", "@react-stately/overlays@^3.4.2": version "3.4.2" resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.4.2.tgz#c6df94a65551137075263eeef70beba8b90b52a0" integrity sha512-UTCnn0aT+JL4ZhYPQYUWHwhmuR2T3vKTFUEZeZN9sTuDCctg08VfGoASJx8qofqkLwYJXeb8D5PMhhTDPiUQPw== @@ -2336,7 +2398,7 @@ "@react-stately/utils" "^3.5.1" "@react-types/shared" "^3.15.0" -"@react-stately/toggle@^3.3.1": +"@react-stately/toggle@^3.4.1": version "3.4.2" resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.4.2.tgz#8c70922ad559d9ef32ecf3cc3d122a66eb858f0d" integrity sha512-+pO13Ap/tj4optu6VjQrEAaAoZvJAEwarMUaZvrkc0kdvMTNPdiT/2vhN32yvsSW0ssuFqToa3jMrTylCbpo8w== @@ -2346,7 +2408,7 @@ "@react-types/checkbox" "^3.4.0" "@react-types/shared" "^3.15.0" -"@react-stately/tree@^3.3.1": +"@react-stately/tree@^3.3.3": version "3.3.4" resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.3.4.tgz#2b71436dd7ed3bd42983f4fd29a9417f947876f9" integrity sha512-CBgXvwa9qYBsJuxrAiVgGnm48eSxLe/6OjPMwH1pWf4s383Mx73MbbN4fS0oWDeXBVgdqz5/Xg/p8nvPIvl3WQ== @@ -2364,7 +2426,7 @@ dependencies: "@babel/runtime" "^7.6.2" -"@react-types/button@^3.5.1", "@react-types/button@^3.6.2": +"@react-types/button@^3.6.1", "@react-types/button@^3.6.2": version "3.6.2" resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.6.2.tgz#72d617deb0f76bd01a570ef28306ac1482c58a67" integrity sha512-qgrYT6yiGVuZSPbzeDT6kTREQVxzJ9p5chV+JX7G5Rpjl2vyUDkEhZ5V/AHLKguBALgFaWJvjtwejHQ7FtycTw== @@ -2378,7 +2440,7 @@ dependencies: "@react-types/shared" "^3.15.0" -"@react-types/dialog@^3.4.1": +"@react-types/dialog@^3.4.3": version "3.4.4" resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.4.4.tgz#48863c58e18d41de8a7e35cf2463a1ed44bd0135" integrity sha512-mBaoQn+2nd14j0WSTfqGMb8dfG6Nak4+S9HqbJeP6UjKfwnmF8aXQ/Z3EYPNcwwDB+fNYStPagxRdBeqJ1GK4g== @@ -2386,7 +2448,7 @@ "@react-types/overlays" "^3.6.4" "@react-types/shared" "^3.15.0" -"@react-types/menu@^3.6.1", "@react-types/menu@^3.7.2": +"@react-types/menu@^3.7.1", "@react-types/menu@^3.7.2": version "3.7.2" resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.7.2.tgz#04a0447f791a7ffa0a6c8dc160cbff3bbeeedefd" integrity sha512-BXMWrT3VCP6NTf0y7v1YYqRJNXkUKLzGXI+n7Qv9+aiZZfd3NNMyk20byHczhFoT2yuCcU5xhyOXzkxSo6ew3A== @@ -2394,14 +2456,14 @@ "@react-types/overlays" "^3.6.4" "@react-types/shared" "^3.15.0" -"@react-types/overlays@^3.6.1", "@react-types/overlays@^3.6.4": +"@react-types/overlays@^3.6.3", "@react-types/overlays@^3.6.4": version "3.6.4" resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.6.4.tgz#4ae4d7b3b38c45d122b0ca2dc88a57f08e89fd0e" integrity sha512-REC4IyDUHS5WhwxMxcvTo+LdrvlSYpJKjyYkPFtJoDBpM3gmXfakTY3KW6K5eZkFv3TnmXjDF9Q2yboEk2u6WQ== dependencies: "@react-types/shared" "^3.15.0" -"@react-types/shared@^3.13.1", "@react-types/shared@^3.15.0": +"@react-types/shared@^3.13.1", "@react-types/shared@^3.14.1", "@react-types/shared@^3.15.0": version "3.15.0" resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.15.0.tgz#a4a78f36bc8daaefe6e9a9df1f453271639c2233" integrity sha512-hwuE4BmgswqP+HRDSLMj7DcnYOCCK+ZRuKnc9AVhXS4LBrwRSkdUkNvXhgvqF5tav7IqTpG9pBYMR9wedehuhA== @@ -2464,9 +2526,9 @@ integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.4" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.4.tgz#d1f2d80f1bd0f2520873f161588bd9b7f8567120" - integrity sha512-RpmQdHVo8hCEHDVpO39zToS9jOhR6nw+/lQAzRNq9ErrGV9IeHM71XCn68svVl/euFeVW6BWX4p35gkhbOcSIQ== + version "1.8.5" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" + integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== dependencies: type-detect "4.0.8" @@ -2546,9 +2608,9 @@ integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + version "7.1.20" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" + integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2642,9 +2704,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.4.9" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.9.tgz#f7371980148697f4b582b086630319b55324b5aa" - integrity sha512-jFCSo4wJzlHQLCpceUhUnXdrPuCNOjGFMQ8Eg6JXxlz3QaCKOb7eGi2cephQdM4XTYsNej69P9JDJ1zqNIbncQ== + version "8.4.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" + integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2773,9 +2835,9 @@ rxjs "^6.4.0" "@types/inquirer@^8.2.1": - version "8.2.4" - resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.2.4.tgz#f7f0c76c65870c7bbc80a112c9c77ffcf7f158c1" - integrity sha512-Pxxx3i3AyK7vKAj3LRM/vF7ETcHKiLJ/u5CnNgbz/eYj/vB3xGAYtRxI5IKtq0hpe5iFHD22BKV3n6WHUu0k4Q== + version "8.2.5" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.2.5.tgz#c508423bcc11126db278170ab07347783ac2300c" + integrity sha512-QXlzybid60YtAwfgG3cpykptRYUx2KomzNutMlWsQC64J/WG/gQSl+P4w7A21sGN0VIxRVava4rgnT7FQmFCdg== dependencies: "@types/through" "*" @@ -2806,9 +2868,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.1.tgz#31fda30bdf2861706abc5f1730be78bed54f83ee" - integrity sha512-nKixEdnGDqFOZkMTF74avFNr3yRqB1ZJ6sRZv5/28D5x2oLN14KApv7F9mfDT/vUic0L3tRCsh3XWpWjtJisUQ== + version "29.2.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.2.tgz#874e7dc6702fa6a3fe6107792aa98636dcc480b4" + integrity sha512-og1wAmdxKoS71K2ZwSVqWPX6OVn3ihZ6ZT2qvZvZQm90lJVDyXIjYcu4Khx2CNIeaFv12rOU/YObOsI3VOkzog== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2861,9 +2923,9 @@ "@types/lodash" "*" "@types/lodash@*": - version "4.14.187" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.187.tgz#122ff0a7192115b4c1a19444ab4482caa77e2c9d" - integrity sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A== + version "4.14.188" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.188.tgz#e4990c4c81f7c9b00c5ff8eae389c10f27980da5" + integrity sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w== "@types/lodash@4.14.181": version "4.14.181" @@ -3025,9 +3087,9 @@ "@types/react" "*" "@types/react@*": - version "18.0.24" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.24.tgz#2f79ed5b27f08d05107aab45c17919754cc44c20" - integrity sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q== + version "18.0.25" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" + integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3200,14 +3262,29 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/eslint-plugin@^5.40.1": - version "5.42.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.42.0.tgz#36a8c0c379870127059889a9cc7e05c260d2aaa5" - integrity sha512-5TJh2AgL6+wpL8H/GTSjNb4WrjKoR2rqvFxR/DDTqYNk6uXn8BJMEcncLSpMbf/XV1aS0jAjYwn98uvVCiAywQ== +"@typescript-eslint/eslint-plugin@5.36.2": + version "5.36.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.2.tgz#6df092a20e0f9ec748b27f293a12cb39d0c1fe4d" + integrity sha512-OwwR8LRwSnI98tdc2z7mJYgY60gf7I9ZfGjN5EjCwwns9bdTuQfAXcsjSB2wSQ/TVNYSGKf4kzVXbNGaZvwiXw== dependencies: - "@typescript-eslint/scope-manager" "5.42.0" - "@typescript-eslint/type-utils" "5.42.0" - "@typescript-eslint/utils" "5.42.0" + "@typescript-eslint/scope-manager" "5.36.2" + "@typescript-eslint/type-utils" "5.36.2" + "@typescript-eslint/utils" "5.36.2" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/eslint-plugin@^5.40.1": + version "5.42.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.42.1.tgz#696b9cc21dfd4749c1c8ad1307f76a36a00aa0e3" + integrity sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg== + dependencies: + "@typescript-eslint/scope-manager" "5.42.1" + "@typescript-eslint/type-utils" "5.42.1" + "@typescript-eslint/utils" "5.42.1" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -3225,6 +3302,16 @@ "@typescript-eslint/typescript-estree" "5.16.0" debug "^4.3.2" +"@typescript-eslint/parser@5.36.2": + version "5.36.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.2.tgz#3ddf323d3ac85a25295a55fcb9c7a49ab4680ddd" + integrity sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA== + dependencies: + "@typescript-eslint/scope-manager" "5.36.2" + "@typescript-eslint/types" "5.36.2" + "@typescript-eslint/typescript-estree" "5.36.2" + debug "^4.3.4" + "@typescript-eslint/scope-manager@5.16.0": version "5.16.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.16.0.tgz#7e7909d64bd0c4d8aef629cdc764b9d3e1d3a69a" @@ -3233,13 +3320,21 @@ "@typescript-eslint/types" "5.16.0" "@typescript-eslint/visitor-keys" "5.16.0" -"@typescript-eslint/scope-manager@5.42.0": - version "5.42.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.42.0.tgz#e1f2bb26d3b2a508421ee2e3ceea5396b192f5ef" - integrity sha512-l5/3IBHLH0Bv04y+H+zlcLiEMEMjWGaCX6WyHE5Uk2YkSGAMlgdUPsT/ywTSKgu9D1dmmKMYgYZijObfA39Wow== +"@typescript-eslint/scope-manager@5.36.2": + version "5.36.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz#a75eb588a3879ae659514780831370642505d1cd" + integrity sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw== dependencies: - "@typescript-eslint/types" "5.42.0" - "@typescript-eslint/visitor-keys" "5.42.0" + "@typescript-eslint/types" "5.36.2" + "@typescript-eslint/visitor-keys" "5.36.2" + +"@typescript-eslint/scope-manager@5.42.1": + version "5.42.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.42.1.tgz#05e5e1351485637d466464237e5259b49f609b18" + integrity sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ== + dependencies: + "@typescript-eslint/types" "5.42.1" + "@typescript-eslint/visitor-keys" "5.42.1" "@typescript-eslint/type-utils@5.16.0": version "5.16.0" @@ -3250,13 +3345,23 @@ debug "^4.3.2" tsutils "^3.21.0" -"@typescript-eslint/type-utils@5.42.0": - version "5.42.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.42.0.tgz#4206d7192d4fe903ddf99d09b41d4ac31b0b7dca" - integrity sha512-HW14TXC45dFVZxnVW8rnUGnvYyRC0E/vxXShFCthcC9VhVTmjqOmtqj6H5rm9Zxv+ORxKA/1aLGD7vmlLsdlOg== +"@typescript-eslint/type-utils@5.36.2": + version "5.36.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.2.tgz#752373f4babf05e993adf2cd543a763632826391" + integrity sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw== dependencies: - "@typescript-eslint/typescript-estree" "5.42.0" - "@typescript-eslint/utils" "5.42.0" + "@typescript-eslint/typescript-estree" "5.36.2" + "@typescript-eslint/utils" "5.36.2" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/type-utils@5.42.1": + version "5.42.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.42.1.tgz#21328feb2d4b193c5852b35aabd241ccc1449daa" + integrity sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg== + dependencies: + "@typescript-eslint/typescript-estree" "5.42.1" + "@typescript-eslint/utils" "5.42.1" debug "^4.3.4" tsutils "^3.21.0" @@ -3265,10 +3370,15 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.16.0.tgz#5827b011982950ed350f075eaecb7f47d3c643ee" integrity sha512-oUorOwLj/3/3p/HFwrp6m/J2VfbLC8gjW5X3awpQJ/bSG+YRGFS4dpsvtQ8T2VNveV+LflQHjlLvB6v0R87z4g== -"@typescript-eslint/types@5.42.0": - version "5.42.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.42.0.tgz#5aeff9b5eced48f27d5b8139339bf1ef805bad7a" - integrity sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw== +"@typescript-eslint/types@5.36.2": + version "5.36.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.2.tgz#a5066e500ebcfcee36694186ccc57b955c05faf9" + integrity sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ== + +"@typescript-eslint/types@5.42.1": + version "5.42.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.42.1.tgz#0d4283c30e9b70d2aa2391c36294413de9106df2" + integrity sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA== "@typescript-eslint/typescript-estree@5.16.0": version "5.16.0" @@ -3283,13 +3393,26 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.42.0": - version "5.42.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.0.tgz#2592d24bb5f89bf54a63384ff3494870f95b3fd8" - integrity sha512-2O3vSq794x3kZGtV7i4SCWZWCwjEtkWfVqX4m5fbUBomOsEOyd6OAD1qU2lbvV5S8tgy/luJnOYluNyYVeOTTg== +"@typescript-eslint/typescript-estree@5.36.2": + version "5.36.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz#0c93418b36c53ba0bc34c61fe9405c4d1d8fe560" + integrity sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w== dependencies: - "@typescript-eslint/types" "5.42.0" - "@typescript-eslint/visitor-keys" "5.42.0" + "@typescript-eslint/types" "5.36.2" + "@typescript-eslint/visitor-keys" "5.36.2" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@5.42.1": + version "5.42.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.1.tgz#f9a223ecb547a781d37e07a5ac6ba9ff681eaef0" + integrity sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw== + dependencies: + "@typescript-eslint/types" "5.42.1" + "@typescript-eslint/visitor-keys" "5.42.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -3308,16 +3431,28 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/utils@5.42.0": - version "5.42.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.42.0.tgz#f06bd43b9a9a06ed8f29600273240e84a53f2f15" - integrity sha512-JZ++3+h1vbeG1NUECXQZE3hg0kias9kOtcQr3+JVQ3whnjvKuMyktJAAIj6743OeNPnGBmjj7KEmiDL7qsdnCQ== +"@typescript-eslint/utils@5.36.2": + version "5.36.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.2.tgz#b01a76f0ab244404c7aefc340c5015d5ce6da74c" + integrity sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.36.2" + "@typescript-eslint/types" "5.36.2" + "@typescript-eslint/typescript-estree" "5.36.2" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/utils@5.42.1": + version "5.42.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.42.1.tgz#2789b1cd990f0c07aaa3e462dbe0f18d736d5071" + integrity sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.42.0" - "@typescript-eslint/types" "5.42.0" - "@typescript-eslint/typescript-estree" "5.42.0" + "@typescript-eslint/scope-manager" "5.42.1" + "@typescript-eslint/types" "5.42.1" + "@typescript-eslint/typescript-estree" "5.42.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" @@ -3330,12 +3465,20 @@ "@typescript-eslint/types" "5.16.0" eslint-visitor-keys "^3.0.0" -"@typescript-eslint/visitor-keys@5.42.0": - version "5.42.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz#ee8d62d486f41cfe646632fab790fbf0c1db5bb0" - integrity sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg== +"@typescript-eslint/visitor-keys@5.36.2": + version "5.36.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz#2f8f78da0a3bad3320d2ac24965791ac39dace5a" + integrity sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A== dependencies: - "@typescript-eslint/types" "5.42.0" + "@typescript-eslint/types" "5.36.2" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@5.42.1": + version "5.42.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.1.tgz#df10839adf6605e1cdb79174cf21e46df9be4872" + integrity sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A== + dependencies: + "@typescript-eslint/types" "5.42.1" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.11.1": @@ -3702,14 +3845,14 @@ array-each@^1.0.1: integrity sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA== array-includes@^3.1.4, array-includes@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-move@^4.0.0: @@ -3899,7 +4042,7 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.3.1, babel-plugin-polyfill-corejs2@^0.3.3: +babel-plugin-polyfill-corejs2@^0.3.1, babel-plugin-polyfill-corejs2@^0.3.2, babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== @@ -3908,7 +4051,7 @@ babel-plugin-polyfill-corejs2@^0.3.1, babel-plugin-polyfill-corejs2@^0.3.3: "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.2: +babel-plugin-polyfill-corejs3@^0.5.2, babel-plugin-polyfill-corejs3@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== @@ -3931,7 +4074,7 @@ babel-plugin-polyfill-regenerator@^0.3.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" -babel-plugin-polyfill-regenerator@^0.4.1: +babel-plugin-polyfill-regenerator@^0.4.0, babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== @@ -4181,9 +4324,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: - version "1.0.30001429" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz#70cdae959096756a85713b36dd9cb82e62325639" - integrity sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg== + version "1.0.30001431" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" + integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== capital-case@^1.0.4: version "1.0.4" @@ -4608,7 +4751,7 @@ copy-webpack-plugin@^9.0.1: schema-utils "^3.1.1" serialize-javascript "^6.0.0" -core-js-compat@^3.21.0, core-js-compat@^3.25.1: +core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.25.1: version "3.26.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.0.tgz#94e2cf8ba3e63800c4956ea298a6473bc9d62b44" integrity sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A== @@ -4620,10 +4763,10 @@ core-js-pure@^3.25.1: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.0.tgz#7ad8a5dd7d910756f3124374b50026e23265ca9a" integrity sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA== -core-js@3.24.0: - version "3.24.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.24.0.tgz#4928d4e99c593a234eb1a1f9abd3122b04d3ac57" - integrity sha512-IeOyT8A6iK37Ep4kZDD423mpi6JfPRoPUdQwEWYiGolvn4o6j2diaRzNfDfpTdu3a5qMbrGUzKUpYpRY8jXCkQ== +core-js@3.25.1: + version "3.25.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.25.1.tgz#5818e09de0db8956e16bf10e2a7141e931b7c69c" + integrity sha512-sr0FY4lnO1hkQ4gLDr24K0DGnweGO1QwSj5BpfQjpSJPdqWalja4cTps29Y/PJVG/P7FYlPDkH3hO+Tr0CvDgQ== core-js@^2.4.0: version "2.6.12" @@ -5307,10 +5450,10 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff-sequences@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.2.0.tgz#4c55b5b40706c7b5d2c5c75999a50c56d214e8f6" - integrity sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw== +diff-sequences@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" + integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== diff@^4.0.1: version "4.0.2" @@ -5369,7 +5512,7 @@ dom-css@^2.0.0: prefix-style "2.0.1" to-camel-case "1.0.0" -dom-helpers@^5.0.1, dom-helpers@^5.2.1: +dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== @@ -5545,7 +5688,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5, es-abstract@^1.20.4: +es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.20.4" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== @@ -5879,9 +6022,9 @@ eslint@8.20.0: v8-compile-cache "^2.0.3" eslint@^8.25.0: - version "8.26.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.26.0.tgz#2bcc8836e6c424c4ac26a5674a70d44d84f2181d" - integrity sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg== + version "8.27.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.27.0.tgz#d547e2f7239994ad1faa4bb5d84e5d809db7cf64" + integrity sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ== dependencies: "@eslint/eslintrc" "^1.3.3" "@humanwhocodes/config-array" "^0.11.6" @@ -5924,9 +6067,9 @@ eslint@^8.25.0: text-table "^0.2.0" espree@^9.3.1, espree@^9.3.2, espree@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" - integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" @@ -6059,15 +6202,15 @@ expect@^27.5.1: jest-message-util "^27.5.1" expect@^29.0.0: - version "29.2.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.2.2.tgz#ba2dd0d7e818727710324a6e7f13dd0e6d086106" - integrity sha512-hE09QerxZ5wXiOhqkXy5d2G9ar+EqOyifnCXCpMNu+vZ6DG9TJ6CO2c2kPDSLqERTTWrO7OZj8EkYHQqSd78Yw== + version "29.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" + integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== dependencies: - "@jest/expect-utils" "^29.2.2" + "@jest/expect-utils" "^29.3.1" jest-get-type "^29.2.0" - jest-matcher-utils "^29.2.2" - jest-message-util "^29.2.1" - jest-util "^29.2.1" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" extend-shallow@^2.0.1: version "2.0.1" @@ -6148,6 +6291,11 @@ fast-shallow-equal@^1.0.0: resolved "https://registry.yarnpkg.com/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== +fast_array_intersect@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast_array_intersect/-/fast_array_intersect-1.1.0.tgz#8e8a83d95c515fd55bfb2b02da94da3d7f1c2b8b" + integrity sha512-/DCilZlUdz2XyNDF+ASs0PwY+RKG9Y4Silp/gbS72Cvbg4oibc778xcecg+pnNyiNHYgh/TApsiDTjpdniyShw== + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -6186,14 +6334,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - file-selector@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.6.0.tgz#fa0a8d9007b829504db4d07dd4de0310b65287dc" @@ -7749,15 +7889,15 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.2.1.tgz#027e42f5a18b693fb2e88f81b0ccab533c08faee" - integrity sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA== +jest-diff@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" + integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== dependencies: chalk "^4.0.0" - diff-sequences "^29.2.0" + diff-sequences "^29.3.1" jest-get-type "^29.2.0" - pretty-format "^29.2.1" + pretty-format "^29.3.1" jest-docblock@^27.5.1: version "27.5.1" @@ -7883,15 +8023,15 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^29.2.2: - version "29.2.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz#9202f8e8d3a54733266784ce7763e9a08688269c" - integrity sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw== +jest-matcher-utils@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" + integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== dependencies: chalk "^4.0.0" - jest-diff "^29.2.1" + jest-diff "^29.3.1" jest-get-type "^29.2.0" - pretty-format "^29.2.1" + pretty-format "^29.3.1" jest-message-util@^27.5.1: version "27.5.1" @@ -7908,18 +8048,18 @@ jest-message-util@^27.5.1: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.2.1.tgz#3a51357fbbe0cc34236f17a90d772746cf8d9193" - integrity sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw== +jest-message-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" + integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.2.1" + "@jest/types" "^29.3.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.2.1" + pretty-format "^29.3.1" slash "^3.0.0" stack-utils "^2.0.3" @@ -8069,12 +8209,12 @@ jest-util@^27.0.0, jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.0.0, jest-util@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.2.1.tgz#f26872ba0dc8cbefaba32c34f98935f6cf5fc747" - integrity sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g== +jest-util@^29.0.0, jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== dependencies: - "@jest/types" "^29.2.1" + "@jest/types" "^29.3.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -8634,10 +8774,10 @@ mapbox-to-css-font@^2.4.1: resolved "https://registry.yarnpkg.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz#41bf38faed36b7dab069828aa3654e4bd91a1eda" integrity sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow== -marked@4.0.18: - version "4.0.18" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.18.tgz#cd0ac54b2e5610cfb90e8fd46ccaa8292c9ed569" - integrity sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw== +marked@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.1.0.tgz#3fc6e7485f21c1ca5d6ec4a39de820e146954796" + integrity sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA== matchmediaquery@^0.3.0: version "0.3.1" @@ -8690,9 +8830,9 @@ mdn-data@2.0.14: integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== memfs@^3.1.2, memfs@^3.4.1: - version "3.4.9" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.9.tgz#403bb953776d72fef4e39e1197a25ffa156d143a" - integrity sha512-3rm8kbrzpUGRyPKSGuk387NZOwQ90O4rI9tsWQkzNW7BLSnKGp23RsEsKK8N8QVCrtJoAMqy3spxHC4os4G6PQ== + version "3.4.10" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.10.tgz#4cdff7cfd21351a85e11b08aa276ebf100210a4d" + integrity sha512-0bCUP+L79P4am30yP1msPzApwuMQG23TjwlwdHeEV5MxioDR1a0AgB0T9FfggU52eJuDCq8WVwb5ekznFyWiTQ== dependencies: fs-monkey "^1.0.3" @@ -8876,10 +9016,10 @@ mobx@5.13.0: resolved "https://registry.yarnpkg.com/mobx/-/mobx-5.13.0.tgz#0fd68f10aa5ff2d146a4ed9e145b53337cfbca59" integrity sha512-eSAntMSMNj0PFL705rgv+aB/z1RjNqDnFEpBe18yQVreXTWiVgIrmBUXzjnJfuba+eo4eAk6zi+/gXQkSUea8A== -moment-timezone@0.5.34: - version "0.5.34" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" - integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg== +moment-timezone@0.5.35: + version "0.5.35" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.35.tgz#6fa2631bdbe8ff04f6b8753f7199516be6dc9839" + integrity sha512-cY/pBOEXepQvlgli06ttCTKcIf8cD1nmNwOKQQAdHBqYApQSpAqotBMX0RJZNgMp6i0PlZuf1mFtnlyEkwyvFw== dependencies: moment ">= 2.9.0" @@ -8895,10 +9035,10 @@ moment@2.29.4, moment@2.x, "moment@>= 2.9.0": resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -monaco-editor@^0.31.1: - version "0.31.1" - resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.31.1.tgz#67f597b3e45679d1f551237e12a3a42c4438b97b" - integrity sha512-FYPwxGZAeP6mRRyrr5XTGHD9gRXVjy7GUzF4IPChnyt3fS5WrNxIkS8DNujWf6EQy0Zlzpxw8oTVE+mWI2/D1Q== +monaco-editor@0.34.0: + version "0.34.0" + resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.34.0.tgz#b1749870a1f795dbfc4dc03d8e9b646ddcbeefa7" + integrity sha512-VF+S5zG8wxfinLKLrWcl4WUizMx+LeJrG4PM/M78OhcwocpV0jiyhX/pG6Q9jIOhrb/ckYi6nHnaR5OojlOZCQ== moo-color@^1.0.2: version "1.0.3" @@ -9163,30 +9303,30 @@ object.defaults@^1.1.0: isobject "^3.0.0" object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.hasown@^1.1.0, object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" object.map@^1.0.0: version "1.0.1" @@ -9204,13 +9344,13 @@ object.pick@^1.2.0, object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" ol-mapbox-style@^8.0.5: version "8.2.1" @@ -9376,9 +9516,9 @@ p-try@^2.0.0: integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" - integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== papaparse@5.3.2: version "5.3.2" @@ -10238,19 +10378,19 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.2.1.tgz#86e7748fe8bbc96a6a4e04fa99172630907a9611" - integrity sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA== +pretty-format@^29.0.0, pretty-format@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" + integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== dependencies: "@jest/schemas" "^29.0.0" ansi-styles "^5.0.0" react-is "^18.0.0" -prismjs@1.28.0: - version "1.28.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" - integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== +prismjs@1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" @@ -10881,7 +11021,7 @@ react-transition-group@4.4.2: loose-envify "^1.4.0" prop-types "^15.6.2" -react-transition-group@^4.3.0, react-transition-group@^4.4.2, react-transition-group@^4.4.5: +react-transition-group@^4.3.0, react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== @@ -11038,7 +11178,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -11338,17 +11478,17 @@ sass-loader@^12.6.0: neo-async "^2.6.2" sass-loader@^13.0.2: - version "13.1.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.1.0.tgz#e5b9acf14199a9bc6eaed7a0b8b23951c2cebf6f" - integrity sha512-tZS1RJQ2n2+QNyf3CCAo1H562WjL/5AM6Gi8YcPVVoNxQX8d19mx8E+8fRrMWsyc93ZL6Q8vZDSM0FHVTJaVnQ== + version "13.2.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.2.0.tgz#80195050f58c9aac63b792fa52acb6f5e0f6bdc3" + integrity sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg== dependencies: klona "^2.0.4" neo-async "^2.6.2" sass@^1.49.9: - version "1.55.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.55.0.tgz#0c4d3c293cfe8f8a2e8d3b666e1cf1bff8065d1c" - integrity sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A== + version "1.56.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" + integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -11392,7 +11532,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -11561,7 +11701,7 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -slate-base64-serializer@^0.2.111: +slate-base64-serializer@^0.2.112: version "0.2.115" resolved "https://registry.yarnpkg.com/slate-base64-serializer/-/slate-base64-serializer-0.2.115.tgz#438e051959bde013b50507f3144257e74039ff7f" integrity sha512-GnLV7bUW/UQ5j7rVIxCU5zdB6NOVsEU6YWsCp68dndIjSGTGLaQv2+WwV3NcnrGGZEYe5qgo33j2QWrPws2C1A== @@ -11583,30 +11723,52 @@ slate-hotkeys@^0.2.9: is-hotkey "0.1.4" slate-dev-environment "^0.2.2" -slate-plain-serializer@0.7.10: - version "0.7.10" - resolved "https://registry.yarnpkg.com/slate-plain-serializer/-/slate-plain-serializer-0.7.10.tgz#bc4a6942cf52fde826019bb1095dffd0dac8cc08" - integrity sha512-/QvMCQ0F3NzbnuoW+bxsLIChPdRgxBjQeGhYhpRGTVvlZCLOmfDvavhN6fHsuEwkvdwOmocNF30xT1WVlmibYg== +slate-plain-serializer@0.7.11: + version "0.7.11" + resolved "https://registry.yarnpkg.com/slate-plain-serializer/-/slate-plain-serializer-0.7.11.tgz#74ff6eb949e9fbd92ad98ed833d74d5082f2688b" + integrity sha512-vzXQ68GiHHcTUcAB6ggf2qN/sX9BoLs77SMHacp5Gkg+oHAA/NxRzRH4efDAhpiJqfJZDrA3rQySK6+Y7KAuwg== -slate-plain-serializer@^0.7.10: +slate-plain-serializer@^0.7.11: version "0.7.13" resolved "https://registry.yarnpkg.com/slate-plain-serializer/-/slate-plain-serializer-0.7.13.tgz#6de8f5c645dd749f1b2e4426c20de74bfd213adf" integrity sha512-TtrlaslxQBEMV0LYdf3s7VAbTxRPe1xaW10WNNGAzGA855/0RhkaHjKkQiRjHv5rvbRleVf7Nxr9fH+4uErfxQ== -slate-prop-types@^0.5.41: +slate-prop-types@^0.5.42: version "0.5.44" resolved "https://registry.yarnpkg.com/slate-prop-types/-/slate-prop-types-0.5.44.tgz#da60b69c3451c3bd6cdd60a45d308eeba7e83c76" integrity sha512-JS0iW7uaciE/W3ADuzeN1HOnSjncQhHPXJ65nZNQzB0DF7mXVmbwQKI6cmCo/xKni7XRJT0JbWSpXFhEdPiBUA== -slate-react-placeholder@^0.2.8: +slate-react-placeholder@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/slate-react-placeholder/-/slate-react-placeholder-0.2.9.tgz#30f450a05d4871c7d1a27668ebe7907861e7ca74" integrity sha512-YSJ9Gb4tGpbzPje3eNKtu26hWM8ApxTk9RzjK+6zfD5V/RMTkuWONk24y6c9lZk0OAYNZNUmrnb/QZfU3j9nag== -slate@0.47.8: - version "0.47.8" - resolved "https://registry.yarnpkg.com/slate/-/slate-0.47.8.tgz#1e987b74d8216d44ec56154f0e6d3c722ce21e6e" - integrity sha512-/Jt0eq4P40qZvtzeKIvNb+1N97zVICulGQgQoMDH0TI8h8B+5kqa1YeckRdRnuvfYJm3J/9lWn2V3J1PrF+hag== +slate-react@0.22.10: + version "0.22.10" + resolved "https://registry.yarnpkg.com/slate-react/-/slate-react-0.22.10.tgz#01296dadb707869ace6cb21d336c90bedfb567bf" + integrity sha512-B2Ms1u/REbdd8yKkOItKgrw/tX8klgz5l5x6PP86+oh/yqmB6EHe0QyrYlQ9fc3WBlJUVTOL+nyAP1KmlKj2/w== + dependencies: + debug "^3.1.0" + get-window "^1.1.1" + is-window "^1.0.2" + lodash "^4.1.1" + memoize-one "^4.0.0" + prop-types "^15.5.8" + react-immutable-proptypes "^2.1.0" + selection-is-backward "^1.0.0" + slate-base64-serializer "^0.2.112" + slate-dev-environment "^0.2.2" + slate-hotkeys "^0.2.9" + slate-plain-serializer "^0.7.11" + slate-prop-types "^0.5.42" + slate-react-placeholder "^0.2.9" + tiny-invariant "^1.0.1" + tiny-warning "^0.0.3" + +slate@0.47.9: + version "0.47.9" + resolved "https://registry.yarnpkg.com/slate/-/slate-0.47.9.tgz#090597dd790e79718f782994907d34a903739443" + integrity sha512-EK4O6b7lGt+g5H9PGw9O5KCM4RrOvOgE9mPi3rzQ0zDRlgAb2ga4TdpS6XNQbrsJWsc8I1fjaSsUeCqCUhhi9A== dependencies: debug "^3.1.0" direction "^0.1.5" @@ -11813,9 +11975,9 @@ stack-generator@^2.0.5: stackframe "^1.3.4" stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" @@ -11891,36 +12053,36 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2 strip-ansi "^6.0.1" string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" + regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string_decoder@^1.1.1: version "1.3.0" @@ -12005,9 +12167,9 @@ stylehacks@^5.1.1: postcss-selector-parser "^6.0.4" stylelint-config-prettier@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-9.0.3.tgz#0dccebeff359dcc393c9229184408b08964d561c" - integrity sha512-5n9gUDp/n5tTMCq1GLqSpA30w2sqWITSSEiAWQlpxkKGAUbjcemQ0nbkRvRUa0B1LgD3+hCvdL7B1eTxy1QHJg== + version "9.0.4" + resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-9.0.4.tgz#1b1dda614d5b3ef6c1f583fa6fa55f88245eb00b" + integrity sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg== stylelint-config-recommended@^5.0.0: version "5.0.0" @@ -12534,10 +12696,10 @@ typescript@4.6.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== -typescript@4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +typescript@4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.2.tgz#e3b33d5ccfb5914e4eeab6699cf208adee3fd790" + integrity sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw== ua-parser-js@^1.0.2: version "1.0.32" @@ -12697,15 +12859,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -12880,9 +13033,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.72.0: - version "5.74.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" - integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== + version "5.75.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" + integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51"