+
}>
void;
+ loadingUserPreferences: boolean;
+}): JSX.Element {
+ const { user } = useAppContext();
+ const [rulesExist, setRulesExist] = useState(false);
+
+ const [sortedAlertRules, setSortedAlertRules] = useState([]);
+
+ const location = useLocation();
+ const params = new URLSearchParams(location.search);
+
+ // Fetch Alerts
+ const { data: alerts, isError, isLoading } = useQuery('allAlerts', {
+ queryFn: getAll,
+ cacheTime: 0,
+ });
+
+ useEffect(() => {
+ const rules = alerts?.payload || [];
+ setRulesExist(rules.length > 0);
+
+ const sortedRules = rules.sort((a, b) => {
+ // First, prioritize firing alerts
+ if (a.state === 'firing' && b.state !== 'firing') return -1;
+ if (a.state !== 'firing' && b.state === 'firing') return 1;
+
+ // Then sort by updateAt timestamp
+ const aUpdateAt = new Date(a.updateAt).getTime();
+ const bUpdateAt = new Date(b.updateAt).getTime();
+ return bUpdateAt - aUpdateAt;
+ });
+
+ if (sortedRules.length > 0 && !loadingUserPreferences) {
+ onUpdateChecklistDoneItem('SETUP_ALERTS');
+ }
+
+ setSortedAlertRules(sortedRules.slice(0, 5));
+ }, [alerts, onUpdateChecklistDoneItem, loadingUserPreferences]);
+
+ const emptyStateCard = (): JSX.Element => (
+
+
+
+
+
+
No Alert rules yet.
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+ Create an Alert Rule to get started
+
+ )}
+
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+
+
}
+ onClick={(): void => {
+ logEvent('Homepage: Create alert rule clicked', {});
+ }}
+ >
+ Create Alert Rule
+
+
+
+
{
+ logEvent('Homepage: Learn more clicked', {
+ source: 'Alert Rules',
+ });
+
+ window.open(
+ 'https://signoz.io/docs/alerts/',
+ '_blank',
+ 'noreferrer noopener',
+ );
+ }}
+ >
+ Learn more
+
+
+ )}
+
+
+ );
+
+ const onEditHandler = (record: GettableAlert) => (): void => {
+ logEvent('Homepage: Alert clicked', {
+ ruleId: record.id,
+ ruleName: record.alert,
+ ruleState: record.state,
+ });
+
+ const compositeQuery = mapQueryDataFromApi(record.condition.compositeQuery);
+ params.set(
+ QueryParams.compositeQuery,
+ encodeURIComponent(JSON.stringify(compositeQuery)),
+ );
+
+ params.set(QueryParams.panelTypes, record.condition.compositeQuery.panelType);
+
+ params.set(QueryParams.ruleId, record.id.toString());
+
+ history.push(`${ROUTES.ALERT_OVERVIEW}?${params.toString()}`);
+ };
+
+ const renderAlertRules = (): JSX.Element => (
+
+
+ {sortedAlertRules.map((rule) => (
+
{
+ if (e.key === 'Enter') {
+ onEditHandler(rule);
+ }
+ }}
+ >
+
+
+
+
+ {rule.alert}
+
+
+
+
+ {rule?.labels?.severity}
+
+ {rule?.state === 'firing' && (
+
+ {rule?.state}
+
+ )}
+
+
+ ))}
+
+
+ );
+
+ if (isLoading) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ if (isError) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ return (
+
+ {rulesExist && (
+
+ Alerts
+
+ )}
+
+ {rulesExist ? renderAlertRules() : emptyStateCard()}
+
+
+ {rulesExist && (
+
+
+
+
{
+ logEvent('Homepage: All alert rules clicked', {});
+ }}
+ >
+ All Alert Rules
+
+
+
+
+ )}
+
+ );
+}
diff --git a/frontend/src/container/Home/Dashboards/Dashboards.tsx b/frontend/src/container/Home/Dashboards/Dashboards.tsx
new file mode 100644
index 0000000000..4e10a42df4
--- /dev/null
+++ b/frontend/src/container/Home/Dashboards/Dashboards.tsx
@@ -0,0 +1,216 @@
+import { Button, Skeleton, Tag } from 'antd';
+import logEvent from 'api/common/logEvent';
+import ROUTES from 'constants/routes';
+import { useGetAllDashboard } from 'hooks/dashboard/useGetAllDashboard';
+import { useSafeNavigate } from 'hooks/useSafeNavigate';
+import { ArrowRight, ArrowUpRight, Plus } from 'lucide-react';
+import Card from 'periscope/components/Card/Card';
+import { useAppContext } from 'providers/App/App';
+import { useEffect, useState } from 'react';
+import { Link } from 'react-router-dom';
+import { Dashboard } from 'types/api/dashboard/getAll';
+import { USER_ROLES } from 'types/roles';
+
+export default function Dashboards({
+ onUpdateChecklistDoneItem,
+ loadingUserPreferences,
+}: {
+ onUpdateChecklistDoneItem: (itemKey: string) => void;
+ loadingUserPreferences: boolean;
+}): JSX.Element {
+ const { safeNavigate } = useSafeNavigate();
+ const { user } = useAppContext();
+
+ const [sortedDashboards, setSortedDashboards] = useState([]);
+
+ // Fetch Dashboards
+ const {
+ data: dashboardsList,
+ isLoading: isDashboardListLoading,
+ isError: isDashboardListError,
+ } = useGetAllDashboard();
+
+ useEffect(() => {
+ if (!dashboardsList) return;
+
+ const sortedDashboards = dashboardsList.sort((a, b) => {
+ const aUpdateAt = new Date(a.updatedAt).getTime();
+ const bUpdateAt = new Date(b.updatedAt).getTime();
+ return bUpdateAt - aUpdateAt;
+ });
+
+ if (sortedDashboards.length > 0 && !loadingUserPreferences) {
+ onUpdateChecklistDoneItem('SETUP_DASHBOARDS');
+ }
+
+ setSortedDashboards(sortedDashboards.slice(0, 5));
+ }, [dashboardsList, onUpdateChecklistDoneItem, loadingUserPreferences]);
+
+ const emptyStateCard = (): JSX.Element => (
+
+
+
+
+
+
You don’t have any dashboards yet.
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
Create a dashboard to get started
+ )}
+
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+
+
}
+ onClick={(): void => {
+ logEvent('Homepage: Create dashboard clicked', {});
+ }}
+ >
+ New Dashboard
+
+
+
+
{
+ logEvent('Homepage: Learn more clicked', {
+ source: 'Dashboards',
+ });
+ window.open(
+ 'https://signoz.io/docs/userguide/manage-dashboards/',
+ '_blank',
+ );
+ }}
+ >
+ Learn more
+
+
+ )}
+
+
+ );
+
+ const renderDashboardsList = (): JSX.Element => (
+
+
+ {sortedDashboards.slice(0, 5).map((dashboard) => {
+ const getLink = (): string => `${ROUTES.ALL_DASHBOARD}/${dashboard.uuid}`;
+
+ const onClickHandler = (event: React.MouseEvent
): void => {
+ event.stopPropagation();
+ logEvent('Homepage: Dashboard clicked', {
+ dashboardId: dashboard.id,
+ dashboardName: dashboard.data.title,
+ });
+ if (event.metaKey || event.ctrlKey) {
+ window.open(getLink(), '_blank');
+ } else {
+ safeNavigate(getLink());
+ }
+ };
+
+ return (
+ {
+ if (e.key === 'Enter') {
+ onClickHandler((e as unknown) as React.MouseEvent
);
+ }
+ }}
+ >
+
+
+
+
+ {dashboard.data.title}
+
+
+
+
+ {dashboard.data.tags?.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+ );
+ })}
+
+
+ );
+
+ if (isDashboardListLoading) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ if (isDashboardListError) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ const dashboardsExist = sortedDashboards.length > 0;
+
+ return (
+
+ {dashboardsExist && (
+
+ Dashboards
+
+ )}
+
+ {dashboardsExist ? renderDashboardsList() : emptyStateCard()}
+
+
+ {dashboardsExist && (
+
+
+
+
{
+ logEvent('Homepage: All dashboards clicked', {});
+ }}
+ >
+ All Dashboards
+
+
+
+
+ )}
+
+ );
+}
diff --git a/frontend/src/container/Home/DataSourceInfo/DataSourceInfo.tsx b/frontend/src/container/Home/DataSourceInfo/DataSourceInfo.tsx
new file mode 100644
index 0000000000..f368a858cc
--- /dev/null
+++ b/frontend/src/container/Home/DataSourceInfo/DataSourceInfo.tsx
@@ -0,0 +1,184 @@
+/* eslint-disable sonarjs/no-identical-functions */
+import { Button, Skeleton, Tag, Typography } from 'antd';
+import logEvent from 'api/common/logEvent';
+import ROUTES from 'constants/routes';
+import { useGetDeploymentsData } from 'hooks/CustomDomain/useGetDeploymentsData';
+import history from 'lib/history';
+import { Globe, Link2 } from 'lucide-react';
+import Card from 'periscope/components/Card/Card';
+import { useEffect, useState } from 'react';
+
+function DataSourceInfo({
+ dataSentToSigNoz,
+ isLoading,
+}: {
+ dataSentToSigNoz: boolean;
+ isLoading: boolean;
+}): JSX.Element {
+ const notSendingData = !dataSentToSigNoz;
+
+ const {
+ data: deploymentsData,
+ isError: isErrorDeploymentsData,
+ } = useGetDeploymentsData();
+
+ const [region, setRegion] = useState('');
+ const [url, setUrl] = useState('');
+
+ useEffect(() => {
+ if (deploymentsData) {
+ switch (deploymentsData?.data.data.cluster.region.name) {
+ case 'in':
+ setRegion('India');
+ break;
+ case 'us':
+ setRegion('United States');
+ break;
+ case 'eu':
+ setRegion('Europe');
+ break;
+ default:
+ setRegion(deploymentsData?.data.data.cluster.region.name);
+ break;
+ }
+
+ setUrl(
+ `${deploymentsData?.data.data.name}.${deploymentsData?.data.data.cluster.region.dns}`,
+ );
+ }
+ }, [deploymentsData]);
+
+ const renderNotSendingData = (): JSX.Element => (
+ <>
+
+ Hello there, Welcome to your SigNoz workspace
+
+
+
+ You’re not sending any data yet.
+ SigNoz is so much better with your data ⎯ start by sending your telemetry
+ data to SigNoz.
+
+
+
+
+
+
+
+
+ Your workspace is ready
+
+
+
}
+ role="button"
+ tabIndex={0}
+ onClick={(): void => {
+ logEvent('Homepage: Connect dataSource clicked', {});
+ history.push(ROUTES.GET_STARTED);
+ }}
+ onKeyDown={(e): void => {
+ if (e.key === 'Enter') {
+ logEvent('Homepage: Connect dataSource clicked', {});
+ history.push(ROUTES.GET_STARTED);
+ }
+ }}
+ >
+ Connect Data Source
+
+
+
+ {!isErrorDeploymentsData && deploymentsData && (
+
+
+
+
+ {region}
+
+
+
+
+
+
+ {url}
+
+
+ default
+
+
+
+
+ )}
+
+
+
+ >
+ );
+
+ const renderDataReceived = (): JSX.Element => (
+ <>
+
+ Hello there, Welcome to your SigNoz workspace
+
+
+ {!isErrorDeploymentsData && deploymentsData && (
+
+
+
+
+
+
+
+ {region}
+
+
+
+
+
+
+ {url}
+
+
+ default
+
+
+
+
+
+
+
+ )}
+ >
+ );
+
+ return (
+
+
+
+
+
+
+
+ {isLoading && (
+ <>
+
+
+ >
+ )}
+
+ {!isLoading && dataSentToSigNoz && renderDataReceived()}
+
+ {!isLoading && notSendingData && renderNotSendingData()}
+
+ );
+}
+
+export default DataSourceInfo;
diff --git a/frontend/src/container/Home/Home.styles.scss b/frontend/src/container/Home/Home.styles.scss
new file mode 100644
index 0000000000..c86e4a96ea
--- /dev/null
+++ b/frontend/src/container/Home/Home.styles.scss
@@ -0,0 +1,1059 @@
+.home-container {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ overflow-y: auto;
+ height: 100%;
+ width: 100%;
+
+ background: rgba(11, 12, 14, 0.9);
+
+ &::-webkit-scrollbar {
+ width: 0.3rem;
+ height: 0.3rem;
+ }
+
+ &::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: var(--bg-slate-500);
+ }
+
+ &::-webkit-scrollbar-thumb:hover {
+ background: var(--bg-slate-500);
+ }
+
+ .home-header-left {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+
+ color: var(--Vanilla-100, #fff);
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 24px; /* 142.857% */
+ }
+
+ .home-header-right {
+ .welcome-checklist-btn {
+ color: var(--Vanilla-100, #fff);
+
+ /* Bifrost (Ancient)/Content/sm */
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ line-height: 20px; /* 142.857% */
+ letter-spacing: -0.07px;
+ }
+ }
+
+ .sticky-header {
+ position: sticky;
+ top: 0;
+ z-index: 100;
+ background-color: var(--bg-ink-100);
+ border-bottom: 1px solid var(--bg-ink-300);
+ }
+}
+
+.hello-wave-container {
+ .hello-wave-img-container {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 8px;
+ border-radius: 4px;
+ background: var(--Ink-300, #16181d);
+ }
+}
+
+.home-content {
+ padding: 1rem;
+ display: flex;
+ flex-direction: row;
+ gap: 1rem;
+
+ .home-left-content {
+ width: 50%;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ .home-right-content {
+ width: 50%;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+
+ position: relative;
+
+ .checklist-card {
+ .checklist-container {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ gap: 1rem;
+ }
+
+ .checklist-items-container {
+ width: 60%;
+ padding: 1rem;
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+
+ .steps-progress-container {
+ width: 100%;
+ margin-left: -1rem;
+ }
+ }
+
+ .checklist-container-right-img {
+ position: relative;
+ width: 30%;
+ display: flex;
+ align-items: center;
+
+ .checklist-img-bg-container {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+
+ .checklist-img-bg {
+ position: absolute;
+ top: 0;
+ right: 8px;
+ }
+ }
+
+ .checklist-img-container {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+
+ .checklist-img {
+ padding: 1rem;
+ }
+ }
+ }
+
+ .periscope-card-footer {
+ padding: 0px !important;
+ }
+
+ .checklist-footer-container {
+ text-align: center;
+
+ .ant-btn.ant-btn-link {
+ color: var(--Vanilla-400, #c0c1c3) !important;
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 24px; /* 150% */
+ letter-spacing: 0.12px;
+
+ padding: 0px;
+ }
+ }
+ }
+ }
+}
+
+.welcome-container {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.welcome-title {
+ color: #fff;
+ font-family: Inter;
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 28px; /* 155.556% */
+ letter-spacing: -0.09px;
+}
+
+.welcome-description {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 24px; /* 171.429% */
+}
+
+.workspace-ready-container {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+
+ .workspace-ready-header {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+
+ .ant-btn.periscope-btn.secondary {
+ border-radius: 2px;
+ border: 1px solid var(--Slate-200, #2c3140);
+ background: var(--Ink-200, #23262e);
+ }
+ }
+
+ .workspace-ready-title {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+ }
+
+ .workspace-details {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 16px;
+
+ .ant-typography {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-variant-numeric: lining-nums tabular-nums slashed-zero;
+ font-feature-settings: 'dlig' on, 'salt' on;
+ font-family: Inter;
+ font-size: 11px !important;
+ font-style: normal;
+ }
+
+ .workspace-region {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+ }
+
+ .workspace-url {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+
+ .workspace-url-text {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+
+ .workspace-url-tag {
+ font-size: 10px;
+ font-weight: 400;
+ line-height: 18px; /* 150% */
+ letter-spacing: 0.12px;
+
+ border-radius: 3px;
+
+ border: 1px solid var(--Slate-400, #1d212d);
+ background: var(--Ink-400, #121317);
+ color: var(--Vanilla-400, #c0c1c3);
+ }
+ }
+ }
+
+ .workspace-timezone {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+ }
+ }
+}
+
+.divider {
+ width: 100%;
+
+ svg {
+ width: 100%;
+ }
+}
+
+.active-ingestions-container {
+ display: flex;
+ flex-direction: column;
+
+ .active-ingestion-card {
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ gap: 8px;
+
+ &:not(:last-child) {
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+ border-bottom: 0px;
+ }
+
+ &:not(:first-child) {
+ border-top-left-radius: 0px;
+ border-top-right-radius: 0px;
+ }
+
+ .active-ingestion-card-content-container {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ gap: 8px;
+ }
+
+ .active-ingestion-card-content {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+
+ padding: 8px !important;
+ font-weight: 400;
+
+ gap: 8px;
+ }
+
+ .active-ingestion-card-actions {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+
+ padding: 8px 16px !important;
+
+ font-size: 11px;
+ font-weight: 400;
+ line-height: 18px; /* 150% */
+ letter-spacing: 0.12px;
+
+ border-left: 1px solid var(--Slate-400, #1d212d);
+ padding-left: 8px;
+
+ width: 200px;
+
+ cursor: pointer;
+
+ &:hover {
+ background-color: var(--bg-ink-300);
+ }
+ }
+
+ .periscope-card-content {
+ padding: 0px !important;
+ }
+ }
+}
+
+.explorers-container {
+ display: flex;
+ flex-direction: column;
+
+ .explorer-card:not(:last-child) {
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+ border-bottom: 0px;
+ }
+
+ .explorer-card:not(:first-child) {
+ border-top-left-radius: 0px;
+ border-top-right-radius: 0px;
+ }
+
+ .section-container {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+
+ .section-content {
+ display: flex;
+ flex-direction: row;
+ gap: 14px;
+
+ .section-icon {
+ display: flex;
+ flex-direction: row;
+ gap: 14px;
+ margin-top: 3px;
+ }
+
+ .section-title {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 166.667% */
+ letter-spacing: -0.06px;
+
+ .title {
+ color: var(--Vanilla-100, #fff);
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 142.857% */
+ letter-spacing: -0.07px;
+ }
+ }
+ }
+
+ .section-actions {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+
+ width: 150px;
+ justify-content: flex-end;
+
+ .ant-btn {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 18px; /* 150% */
+ letter-spacing: 0.12px;
+
+ padding: 8px;
+
+ justify-content: flex-start;
+
+ &:hover {
+ background-color: var(--bg-ink-300) !important;
+ }
+ }
+
+ .periscope-btn.secondary {
+ border-radius: 2px;
+ border: 1px solid var(--Slate-400, #1d212d);
+ background: var(--Ink-300, #16181d);
+ }
+ }
+ }
+}
+
+.home-data-card {
+ .home-data-card-header {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+ height: 32px;
+
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 20px; /* 142.857% */
+ letter-spacing: -0.07px;
+ }
+
+ .saved-views-header {
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+
+ .saved-views-header-actions {
+ display: flex;
+ flex-direction: row;
+ gap: 8px;
+
+ .views-tabs {
+ .tab {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+
+ font-size: 11px;
+
+ border-radius: 2px;
+ border: 1px solid var(--Slate-400, #1d212d);
+ background: var(--Ink-400, #121317);
+ box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1);
+
+ &.selected {
+ background: var(--Ink-300, #16181d);
+ }
+ }
+ }
+ }
+ }
+
+ .services-header {
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+
+ .services-header-actions {
+ display: flex;
+ flex-direction: row;
+ gap: 8px;
+
+ .ant-select {
+ width: 150px;
+
+ .ant-select-selector {
+ background-color: transparent !important;
+ border: none !important;
+ }
+ }
+ }
+ }
+
+ .home-data-item-container {
+ height: 250px;
+ overflow: auto;
+
+ &::-webkit-scrollbar {
+ width: 0.2rem;
+ height: 0.2rem;
+ }
+
+ &::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: var(--bg-ink-100);
+ }
+
+ &::-webkit-scrollbar-thumb:hover {
+ background: var(--bg-ink-100);
+ }
+
+ .home-data-item {
+ padding: 12px;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+
+ cursor: pointer;
+
+ .home-data-item-name-container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+ }
+
+ .home-data-item-name {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 20px; /* 142.857% */
+ letter-spacing: -0.07px;
+ }
+
+ &:nth-child(odd) {
+ background: rgba(255, 255, 255, 0.01);
+ }
+ }
+
+ .home-data-item-tag {
+ display: flex;
+
+ .ant-tag {
+ display: flex;
+ padding: 2px 12px;
+ justify-content: center;
+ align-items: center;
+ gap: 4px;
+ border-radius: 20px;
+ border: 1px solid rgba(173, 127, 88, 0.2);
+ background: rgba(173, 127, 88, 0.1);
+
+ color: var(--Sienna-400, #bd9979);
+ text-align: center;
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ line-height: 20px; /* 142.857% */
+ letter-spacing: -0.07px;
+ }
+
+ .firing-tag {
+ color: var(--bg-sakura-500);
+ background: rgba(255, 113, 113, 0.1);
+ }
+ }
+
+ &.services-list-container {
+ height: 268px !important;
+ overflow: hidden;
+
+ .ant-table-row {
+ cursor: pointer;
+ }
+ }
+
+ .services-list {
+ overflow-y: auto;
+ }
+ }
+
+ .periscope-card-header {
+ padding: 4px 12px !important;
+ }
+
+ .periscope-card-content {
+ padding: 0px !important;
+ }
+
+ .periscope-card-footer {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-end;
+ gap: 8px;
+
+ padding: 4px 12px !important;
+
+ border-radius: 0px 0px 6px 6px;
+ border: 1px solid var(--Slate-400, #1d212d);
+ background: var(--Ink-300, #16181d);
+ box-shadow: 0px -8px 6px 0px rgba(0, 0, 0, 0.1);
+
+ .home-data-card-footer {
+ display: flex;
+ justify-content: flex-end;
+
+ .learn-more-link {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 142.857% */
+ letter-spacing: -0.07px;
+
+ &:hover {
+ color: var(--Robin-400, #7190f9);
+ }
+ }
+ }
+ }
+
+ &.loading-card {
+ .periscope-card-content {
+ padding: 16px !important;
+ min-height: 320px;
+ }
+ }
+
+ &.error-card {
+ .periscope-card-content {
+ padding: 16px !important;
+ min-height: 320px;
+ }
+ }
+}
+
+.empty-state-container {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ gap: 12px;
+
+ height: 100%;
+ width: 100%;
+
+ height: 400px;
+
+ border-radius: 6px;
+ border: 1px dashed var(--Slate-300, #242834);
+
+ .empty-state-content-container {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ }
+
+ .empty-state-content {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ }
+
+ .empty-state-icon {
+ width: 36px;
+ height: 36px;
+ }
+
+ .empty-title {
+ color: var(--Vanilla-100, #fff);
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 18px; /* 128.571% */
+ letter-spacing: -0.07px;
+ }
+
+ .empty-description {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 18px; /* 128.571% */
+ letter-spacing: -0.07px;
+ }
+
+ .empty-actions-container {
+ display: flex;
+ flex-direction: row;
+ gap: 12px;
+
+ .ant-btn.periscope-btn.secondary {
+ display: flex;
+ height: 32px;
+ padding: 8px 16px;
+ justify-content: center;
+ align-items: center;
+ gap: 8px;
+
+ border-radius: 1.484px;
+ border: 1px solid var(--Slate-400, #1d212d);
+ background: var(--Ink-300, #16181d);
+
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 17.812px; /* 150% */
+ }
+ }
+}
+
+.learn-more-link {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 4px;
+
+ color: var(--Robin-400, #7190f9);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 18px; /* 128.571% */
+ letter-spacing: -0.07px;
+}
+
+.welcome-checklist-popover {
+ padding: 1rem 1.5rem;
+ background-color: var(--bg-ink-400);
+ border-radius: 2px;
+ border: 1px solid var(--Slate-400, #1d212d);
+ background: var(--Ink-400, #121317);
+ color: var(--bg-vanilla-100);
+
+ .ant-popover-inner {
+ background-color: transparent !important;
+ box-shadow: none !important;
+ }
+
+ .home-checklist-container {
+ background-color: transparent !important;
+ width: 400px;
+ }
+}
+
+.home-services-container {
+ .ant-table-thead {
+ .ant-table-cell {
+ background-color: transparent !important;
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 18px; /* 150% */
+ letter-spacing: 0.6px;
+ text-transform: uppercase;
+ padding: 12px !important;
+
+ border-bottom: none !important;
+
+ &::before {
+ content: none !important;
+ }
+ }
+ }
+
+ .ant-table-row {
+ .ant-table-cell {
+ padding: 12px !important;
+ border-bottom: none !important;
+ }
+
+ &:nth-child(odd) {
+ background: rgba(255, 255, 255, 0.01);
+ }
+ }
+}
+
+.lightMode {
+ .home-container {
+ background: rgba(255, 255, 255, 0.9);
+
+ &::-webkit-scrollbar-thumb {
+ background: var(--bg-slate-500);
+ }
+
+ &::-webkit-scrollbar-thumb:hover {
+ background: var(--bg-slate-500);
+ }
+
+ .home-header-left {
+ color: var(--bg-ink-300);
+ }
+
+ .home-header-right {
+ .welcome-checklist-btn {
+ color: var(--bg-ink-300);
+ }
+ }
+
+ .sticky-header {
+ background-color: var(--bg-vanilla-100);
+ border-bottom: 1px solid var(--bg-vanilla-300);
+ }
+ }
+
+ .hello-wave-container {
+ .hello-wave-img-container {
+ background: var(--bg-vanilla-300);
+ }
+ }
+
+ .home-content {
+ .home-right-content {
+ .checklist-card {
+ .checklist-footer-container {
+ .ant-btn.ant-btn-link {
+ color: var(--bg-ink-300) !important;
+ }
+ }
+ }
+ }
+ }
+
+ .welcome-title {
+ color: var(--bg-slate-300);
+ }
+
+ .welcome-description {
+ color: var(--bg-slate-400);
+ }
+
+ .workspace-ready-container {
+ .workspace-ready-header {
+ .ant-btn.periscope-btn.secondary {
+ border: 1px solid var(--bg-vanilla-300);
+ background: var(--bg-vanilla-200);
+ }
+ }
+
+ .workspace-details {
+ .ant-typography {
+ color: var(--bg-slate-400);
+ }
+ }
+ }
+
+ .active-ingestions-container {
+ .active-ingestion-card {
+ .active-ingestion-card-actions {
+ border-left: 1px solid var(--bg-vanilla-300);
+
+ &:hover {
+ background-color: var(--bg-vanilla-100);
+ }
+ }
+ }
+ }
+
+ .explorers-container {
+ .section-container {
+ .section-content {
+ .section-title {
+ color: var(--bg-slate-300);
+
+ .title {
+ color: var(--bg-slate-300);
+ }
+ }
+ }
+
+ .section-actions {
+ .ant-btn {
+ color: var(--bg-slate-300);
+
+ &:hover {
+ background-color: var(--bg-vanilla-100) !important;
+ }
+ }
+
+ .periscope-btn.secondary {
+ border-radius: 2px;
+ border: 1px solid var(--bg-vanilla-300);
+ background: var(--bg-vanilla-100);
+ }
+ }
+ }
+ }
+
+ .home-data-card {
+ .home-data-card-header {
+ color: var(--bg-ink-300);
+ }
+
+ .saved-views-header {
+ .saved-views-header-actions {
+ .views-tabs {
+ .tab {
+ border: 1px solid var(--bg-vanilla-300);
+ background: var(--bg-vanilla-100);
+ box-shadow: 0px 0px 8px 0px rgba(255, 255, 255, 0.1);
+
+ &.selected {
+ background: var(--bg-vanilla-100);
+ }
+ }
+ }
+ }
+ }
+
+ .home-data-item-container {
+ .home-data-item {
+ .home-data-item-name {
+ color: var(--bg-ink-300);
+ }
+
+ &:nth-child(odd) {
+ background: rgba(255, 255, 255, 0.01);
+ }
+ }
+
+ .home-data-item-tag {
+ display: flex;
+
+ .ant-tag {
+ border: 1px solid rgba(173, 127, 88, 0.2);
+ background: rgba(173, 127, 88, 0.1);
+
+ color: var(--bg-sienna-400);
+ }
+
+ .firing-tag {
+ color: var(--bg-sakura-500);
+ background: rgba(255, 113, 113, 0.1);
+ }
+ }
+ }
+
+ .periscope-card-footer {
+ border: 1px solid var(--bg-vanilla-300);
+ background: var(--bg-vanilla-100);
+ box-shadow: 0px -8px 6px 0px rgba(255, 255, 255, 0.1);
+
+ .home-data-card-footer {
+ .learn-more-link {
+ color: var(--bg-ink-300);
+
+ &:hover {
+ color: var(--bg-robin-400);
+ }
+ }
+ }
+ }
+ }
+
+ .empty-state-container {
+ border: 1px dashed var(--bg-vanilla-300);
+
+ .empty-title {
+ color: var(--bg-ink-300);
+ }
+
+ .empty-description {
+ color: var(--bg-ink-400);
+ }
+
+ .empty-actions-container {
+ .ant-btn.periscope-btn.secondary {
+ border: 1px solid var(--bg-vanilla-300);
+ background: var(--bg-vanilla-100);
+
+ color: var(--bg-ink-300);
+ }
+ }
+ }
+
+ .welcome-checklist-popover {
+ padding: 1rem 1.5rem;
+ background-color: var(--bg-vanilla-100);
+ border-radius: 2px;
+ border: 1px solid var(--bg-vanilla-300);
+ color: var(--bg-ink-300);
+
+ .ant-popover-inner {
+ background-color: transparent !important;
+ box-shadow: none !important;
+ }
+
+ .home-checklist-container {
+ background-color: transparent !important;
+ width: 400px;
+ }
+ }
+
+ .home-services-container {
+ .ant-table-thead {
+ .ant-table-cell {
+ background-color: transparent !important;
+ color: var(--bg-ink-300);
+
+ border-bottom: none !important;
+
+ &::before {
+ content: none !important;
+ }
+ }
+ }
+
+ .ant-table-row {
+ &:nth-child(odd) {
+ background: rgba(0, 0, 0, 0.01);
+ }
+ }
+ }
+}
diff --git a/frontend/src/container/Home/Home.tsx b/frontend/src/container/Home/Home.tsx
new file mode 100644
index 0000000000..18d896dcfe
--- /dev/null
+++ b/frontend/src/container/Home/Home.tsx
@@ -0,0 +1,721 @@
+/* eslint-disable sonarjs/no-duplicate-string */
+import './Home.styles.scss';
+
+import { Color } from '@signozhq/design-tokens';
+import { Button, Popover } from 'antd';
+import logEvent from 'api/common/logEvent';
+import { HostListPayload } from 'api/infraMonitoring/getHostLists';
+import { K8sPodsListPayload } from 'api/infraMonitoring/getK8sPodsList';
+import getAllUserPreferences from 'api/preferences/getAllUserPreference';
+import updateUserPreferenceAPI from 'api/preferences/updateUserPreference';
+import Header from 'components/Header/Header';
+import { DEFAULT_ENTITY_VERSION } from 'constants/app';
+import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder';
+import { REACT_QUERY_KEY } from 'constants/reactQueryKeys';
+import ROUTES from 'constants/routes';
+import { getHostListsQuery } from 'container/InfraMonitoringHosts/utils';
+import { useGetHostList } from 'hooks/infraMonitoring/useGetHostList';
+import { useGetK8sPodsList } from 'hooks/infraMonitoring/useGetK8sPodsList';
+import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange';
+import history from 'lib/history';
+import cloneDeep from 'lodash-es/cloneDeep';
+import { CompassIcon, DotIcon, HomeIcon, Plus, Wrench } from 'lucide-react';
+import { AnimatePresence } from 'motion/react';
+import * as motion from 'motion/react-client';
+import Card from 'periscope/components/Card/Card';
+import { useAppContext } from 'providers/App/App';
+import { useCallback, useEffect, useMemo, useState } from 'react';
+import { useMutation, useQuery } from 'react-query';
+import { DataSource } from 'types/common/queryBuilder';
+import { UserPreference } from 'types/reducer/app';
+import { USER_ROLES } from 'types/roles';
+import { popupContainer } from 'utils/selectPopupContainer';
+
+import AlertRules from './AlertRules/AlertRules';
+import { defaultChecklistItemsState } from './constants';
+import Dashboards from './Dashboards/Dashboards';
+import DataSourceInfo from './DataSourceInfo/DataSourceInfo';
+import HomeChecklist, { ChecklistItem } from './HomeChecklist/HomeChecklist';
+import SavedViews from './SavedViews/SavedViews';
+import Services from './Services/Services';
+import StepsProgress from './StepsProgress/StepsProgress';
+
+const homeInterval = 30 * 60 * 1000;
+
+// eslint-disable-next-line sonarjs/cognitive-complexity
+export default function Home(): JSX.Element {
+ const { user } = useAppContext();
+
+ const [startTime, setStartTime] = useState(null);
+ const [endTime, setEndTime] = useState(null);
+ const [updatingUserPreferences, setUpdatingUserPreferences] = useState(false);
+ const [loadingUserPreferences, setLoadingUserPreferences] = useState(true);
+
+ const [checklistItems, setChecklistItems] = useState(
+ defaultChecklistItemsState,
+ );
+
+ const [isWelcomeChecklistSkipped, setIsWelcomeChecklistSkipped] = useState(
+ false,
+ );
+
+ useEffect(() => {
+ const now = new Date();
+ const startTime = new Date(now.getTime() - homeInterval);
+ const endTime = now;
+
+ setStartTime(startTime.getTime());
+ setEndTime(endTime.getTime());
+ }, []);
+
+ // Detect Logs
+ const { data: logsData, isLoading: isLogsLoading } = useGetQueryRange(
+ {
+ query: initialQueriesMap[DataSource.LOGS],
+ graphType: PANEL_TYPES.TABLE,
+ selectedTime: 'GLOBAL_TIME',
+ globalSelectedInterval: '30m',
+ params: {
+ dataSource: DataSource.LOGS,
+ },
+ },
+ DEFAULT_ENTITY_VERSION,
+ {
+ queryKey: [
+ REACT_QUERY_KEY.GET_QUERY_RANGE,
+ '30m',
+ endTime || Date.now(),
+ startTime || Date.now(),
+ initialQueriesMap[DataSource.LOGS],
+ ],
+ enabled: !!startTime && !!endTime,
+ },
+ );
+
+ // Detect Traces
+ const { data: tracesData, isLoading: isTracesLoading } = useGetQueryRange(
+ {
+ query: initialQueriesMap[DataSource.TRACES],
+ graphType: PANEL_TYPES.TABLE,
+ selectedTime: 'GLOBAL_TIME',
+ globalSelectedInterval: '30m',
+ params: {
+ dataSource: DataSource.TRACES,
+ },
+ },
+ DEFAULT_ENTITY_VERSION,
+ {
+ queryKey: [
+ REACT_QUERY_KEY.GET_QUERY_RANGE,
+ '30m',
+ endTime || Date.now(),
+ startTime || Date.now(),
+ initialQueriesMap[DataSource.TRACES],
+ ],
+ enabled: !!startTime && !!endTime,
+ },
+ );
+
+ // Detect Infra Metrics - Hosts
+ const query = useMemo(() => {
+ const baseQuery = getHostListsQuery();
+
+ let queryStartTime = startTime;
+ let queryEndTime = endTime;
+
+ if (!startTime || !endTime) {
+ const now = new Date();
+ const startTime = new Date(now.getTime() - homeInterval);
+ const endTime = now;
+
+ queryStartTime = startTime.getTime();
+ queryEndTime = endTime.getTime();
+ }
+
+ return {
+ ...baseQuery,
+ limit: 10,
+ offset: 0,
+ filters: {
+ items: [],
+ op: 'AND',
+ },
+ start: queryStartTime,
+ end: queryEndTime,
+ };
+ }, [startTime, endTime]);
+
+ const { data: hostData } = useGetHostList(query as HostListPayload, {
+ queryKey: ['hostList', query],
+ enabled: !!query,
+ });
+
+ const { data: k8sPodsData } = useGetK8sPodsList(query as K8sPodsListPayload, {
+ queryKey: ['K8sPodsList', query],
+ enabled: !!query,
+ });
+
+ const [isLogsIngestionActive, setIsLogsIngestionActive] = useState(false);
+ const [isTracesIngestionActive, setIsTracesIngestionActive] = useState(false);
+ const [isMetricsIngestionActive, setIsMetricsIngestionActive] = useState(
+ false,
+ );
+
+ const processUserPreferences = (userPreferences: UserPreference[]): void => {
+ const checklistSkipped = userPreferences?.find(
+ (preference) => preference.key === 'WELCOME_CHECKLIST_DO_LATER',
+ )?.value;
+
+ const updatedChecklistItems = cloneDeep(checklistItems);
+
+ const newChecklistItems = updatedChecklistItems.map((item) => {
+ const newItem = { ...item };
+ newItem.isSkipped =
+ userPreferences?.find(
+ (preference) => preference.key === item.skippedPreferenceKey,
+ )?.value || false;
+ return newItem;
+ });
+
+ setChecklistItems(newChecklistItems);
+
+ setIsWelcomeChecklistSkipped(checklistSkipped || false);
+ };
+
+ // Fetch User Preferences
+ const { refetch: refetchUserPreferences } = useQuery({
+ queryFn: () => getAllUserPreferences(),
+ queryKey: ['getUserPreferences'],
+ enabled: true,
+ refetchOnWindowFocus: false,
+ onSuccess: (response) => {
+ if (response.payload && response.payload.data) {
+ processUserPreferences(response.payload.data);
+ }
+
+ setLoadingUserPreferences(false);
+ setUpdatingUserPreferences(false);
+ },
+ onError: () => {
+ setUpdatingUserPreferences(false);
+ setLoadingUserPreferences(false);
+ },
+ });
+
+ const { mutate: updateUserPreference } = useMutation(updateUserPreferenceAPI, {
+ onSuccess: () => {
+ setUpdatingUserPreferences(false);
+ refetchUserPreferences();
+ },
+ onError: () => {
+ setUpdatingUserPreferences(false);
+ },
+ });
+
+ const handleWillDoThisLater = (): void => {
+ logEvent('Welcome Checklist: Will do this later clicked', {});
+ setUpdatingUserPreferences(true);
+
+ updateUserPreference({
+ preferenceID: 'WELCOME_CHECKLIST_DO_LATER',
+ value: true,
+ });
+ };
+
+ const handleSkipChecklistItem = (item: ChecklistItem): void => {
+ if (item.skippedPreferenceKey) {
+ setUpdatingUserPreferences(true);
+
+ updateUserPreference({
+ preferenceID: item.skippedPreferenceKey,
+ value: true,
+ });
+ }
+ };
+
+ const renderWelcomeChecklistModal = (): JSX.Element => (
+
+
+
+ );
+
+ const handleUpdateChecklistDoneItem = useCallback((itemKey: string): void => {
+ setChecklistItems((prevItems) =>
+ prevItems.map((item) =>
+ item.id === itemKey ? { ...item, completed: true } : item,
+ ),
+ );
+ }, []);
+
+ useEffect(() => {
+ const logsDataTotal = parseInt(
+ logsData?.payload?.data?.newResult?.data?.result?.[0]?.series?.[0]
+ ?.values?.[0]?.value || '0',
+ 10,
+ );
+
+ if (logsDataTotal > 0) {
+ setIsLogsIngestionActive(true);
+ handleUpdateChecklistDoneItem('SEND_LOGS');
+ handleUpdateChecklistDoneItem('ADD_DATA_SOURCE');
+ }
+ }, [logsData, handleUpdateChecklistDoneItem]);
+
+ useEffect(() => {
+ const tracesDataTotal = parseInt(
+ tracesData?.payload?.data?.newResult?.data?.result?.[0]?.series?.[0]
+ ?.values?.[0]?.value || '0',
+ 10,
+ );
+
+ if (tracesDataTotal > 0) {
+ setIsTracesIngestionActive(true);
+ handleUpdateChecklistDoneItem('SEND_TRACES');
+ handleUpdateChecklistDoneItem('ADD_DATA_SOURCE');
+ }
+ }, [tracesData, handleUpdateChecklistDoneItem]);
+
+ useEffect(() => {
+ const hostDataTotal = hostData?.payload?.data?.total ?? 0;
+ const k8sPodsDataTotal = k8sPodsData?.payload?.data?.total ?? 0;
+
+ if (hostDataTotal > 0 || k8sPodsDataTotal > 0) {
+ setIsMetricsIngestionActive(true);
+ handleUpdateChecklistDoneItem('ADD_DATA_SOURCE');
+ handleUpdateChecklistDoneItem('SEND_INFRA_METRICS');
+ }
+ }, [hostData, k8sPodsData, handleUpdateChecklistDoneItem]);
+
+ useEffect(() => {
+ logEvent('Homepage: Visited', {});
+ }, []);
+
+ return (
+
+
+
+ }
+ rightComponent={
+
+ {isWelcomeChecklistSkipped && (
+
{
+ if (visible) {
+ logEvent('Welcome Checklist: Expanded', {});
+ } else {
+ logEvent('Welcome Checklist: Minimized', {});
+ }
+ }}
+ content={renderWelcomeChecklistModal()}
+ getPopupContainer={popupContainer}
+ rootClassName="welcome-checklist-popover"
+ >
+
+
+ Welcome checklist
+
+
+ )}
+
+ }
+ />
+
+
+
+
+
+
+
+
+
+
+
+ {isLogsIngestionActive && (
+
+
+
+
+
+
+
+
+
+ Logs ingestion is active
+
+
+
+
{
+ // eslint-disable-next-line sonarjs/no-duplicate-string
+ logEvent('Homepage: Ingestion Active Explore clicked', {
+ source: 'Logs',
+ });
+ history.push(ROUTES.LOGS_EXPLORER);
+ }}
+ onKeyDown={(e): void => {
+ if (e.key === 'Enter') {
+ logEvent('Homepage: Ingestion Active Explore clicked', {
+ source: 'Logs',
+ });
+ history.push(ROUTES.LOGS_EXPLORER);
+ }
+ }}
+ >
+
+ Explore Logs
+
+
+
+
+ )}
+
+ {isTracesIngestionActive && (
+
+
+
+
+
+
+
+
+
+ Traces ingestion is active
+
+
+
+
{
+ logEvent('Homepage: Ingestion Active Explore clicked', {
+ source: 'Traces',
+ });
+ history.push(ROUTES.TRACES_EXPLORER);
+ }}
+ onKeyDown={(e): void => {
+ if (e.key === 'Enter') {
+ logEvent('Homepage: Ingestion Active Explore clicked', {
+ source: 'Traces',
+ });
+ history.push(ROUTES.TRACES_EXPLORER);
+ }
+ }}
+ >
+
+ Explore Traces
+
+
+
+
+ )}
+
+ {isMetricsIngestionActive && (
+
+
+
+
+
+
+
+
+
+ Metrics ingestion is active
+
+
+
+
{
+ logEvent('Homepage: Ingestion Active Explore clicked', {
+ source: 'Metrics',
+ });
+ history.push(ROUTES.INFRASTRUCTURE_MONITORING_HOSTS);
+ }}
+ onKeyDown={(e): void => {
+ if (e.key === 'Enter') {
+ logEvent('Homepage: Ingestion Active Explore clicked', {
+ source: 'Metrics',
+ });
+ history.push(ROUTES.INFRASTRUCTURE_MONITORING_HOSTS);
+ }
+ }}
+ >
+
+ Explore Infra Metrics
+
+
+
+
+ )}
+
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+
+
+
+
+
+
+
+
+
+
Filter and save views with the Explorer
+
+
+ Explore your data, and save useful views for everyone in the team.
+
+
+
+
+
+ }
+ onClick={(): void => {
+ logEvent('Homepage: Explore clicked', {
+ source: 'Logs',
+ });
+ history.push(ROUTES.LOGS_EXPLORER);
+ }}
+ >
+ Open Logs Explorer
+
+
+ }
+ onClick={(): void => {
+ logEvent('Homepage: Explore clicked', {
+ source: 'Traces',
+ });
+ history.push(ROUTES.TRACES_EXPLORER);
+ }}
+ >
+ Open Traces Explorer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Create a dashboard
+
+
+ Create a dashboard to visualize your data.
+
+
+
+
+
+ }
+ onClick={(): void => {
+ logEvent('Homepage: Explore clicked', {
+ source: 'Dashboards',
+ });
+ history.push(ROUTES.ALL_DASHBOARD);
+ }}
+ >
+ Create dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Add an alert
+
+
+ Create bespoke alerting rules to suit your needs.
+
+
+
+
+
+ }
+ onClick={(): void => {
+ logEvent('Homepage: Explore clicked', {
+ source: 'Alerts',
+ });
+ history.push(ROUTES.ALERTS_NEW);
+ }}
+ >
+ Create an alert
+
+
+
+
+
+
+ )}
+
+ {(isLogsIngestionActive ||
+ isTracesIngestionActive ||
+ isMetricsIngestionActive) && (
+ <>
+
+
+ >
+ )}
+
+
+
+ {!isWelcomeChecklistSkipped && !loadingUserPreferences && (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ I'll do this later
+
+
+
+
+
+ )}
+
+ {(isLogsIngestionActive ||
+ isTracesIngestionActive ||
+ isMetricsIngestionActive) && (
+ <>
+
+
+ >
+ )}
+
+
+
+ );
+}
diff --git a/frontend/src/container/Home/HomeChecklist/HomeChecklist.styles.scss b/frontend/src/container/Home/HomeChecklist/HomeChecklist.styles.scss
new file mode 100644
index 0000000000..c0508abbe9
--- /dev/null
+++ b/frontend/src/container/Home/HomeChecklist/HomeChecklist.styles.scss
@@ -0,0 +1,381 @@
+.home-checklist-container {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+
+ .completed-checklist-container {
+ flex: 1;
+
+ .completed-checklist-title {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 18px; /* 163.636% */
+ letter-spacing: 0.88px;
+ text-transform: uppercase;
+ margin-left: -1rem;
+
+ margin-bottom: 16px;
+ }
+
+ .completed-checklist-item {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+
+ padding-left: 16px;
+ margin-bottom: 8px;
+
+ position: relative;
+
+ &:before {
+ position: absolute;
+ left: -18px;
+ top: 2px;
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background-color: var(--bg-ink-400);
+ border: 1px solid var(--bg-slate-400);
+ color: var(--bg-ink-400);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: bold;
+
+ background-color: var(--bg-forest-400);
+ content: '✓';
+ font-size: 16px;
+ font-weight: 300;
+ }
+
+ &:not(:last-child):after {
+ content: '';
+ position: absolute;
+ left: -9px;
+ top: 24px;
+ bottom: 0px;
+ width: 1px;
+ height: 100%;
+ background: linear-gradient(
+ to bottom,
+ var(--bg-forest-400) 0%,
+ var(--bg-forest-400) 50%,
+ transparent 50%,
+ transparent 100%
+ );
+ background-size: 2px 10px;
+ }
+
+ .completed-checklist-item-title {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 24px; /* 171.429% */
+ letter-spacing: -0.07px;
+ }
+
+ .completed-checklist-item-description {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 142.857% */
+ }
+ }
+ }
+
+ .whats-next-checklist-container {
+ flex: 1;
+
+ .whats-next-checklist-title {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 11px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 18px; /* 163.636% */
+ letter-spacing: 0.88px;
+ text-transform: uppercase;
+ margin-left: -1rem;
+
+ margin-bottom: 16px;
+ }
+
+ .whats-next-checklist-items-container {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ .whats-next-checklist-item {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ padding-left: 16px;
+
+ position: relative;
+
+ &:before {
+ content: '';
+ position: absolute;
+ left: -18px;
+ top: 2px;
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background-color: var(--bg-ink-400);
+ border: 1px dashed var(--bg-slate-100);
+ color: var(--bg-ink-400);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: bold;
+ }
+
+ &.active {
+ &:before {
+ background-color: #4568dc;
+ content: '';
+ display: inline-block;
+ background: url('/public/Icons/status-inprogress-pill.svg') no-repeat
+ center;
+ background-size: contain;
+ border: none !important;
+
+ color: #fff;
+ font-size: 16px;
+ border: 1px dashed white;
+ border-radius: 50%;
+ }
+ }
+
+ &.skipped {
+ &:before {
+ background-color: var(--bg-amber-400);
+ content: '';
+ display: inline-block;
+ background: url('/public/Icons/status-skipped-pill.svg') no-repeat center;
+ background-size: contain;
+ border: none;
+
+ color: var(--bg-ink-400);
+ font-size: 16px;
+ border-radius: 50%;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ }
+
+ &:not(:last-child):after {
+ content: '';
+ position: absolute;
+ left: -9px;
+ top: 24px;
+ bottom: 0px;
+ width: 1px;
+ height: 100%;
+ background: linear-gradient(
+ to bottom,
+ var(--bg-slate-100) 0%,
+ var(--bg-slate-100) 50%,
+ transparent 50%,
+ transparent 100%
+ );
+ background-size: 2px 10px;
+ }
+
+ &.active {
+ &:not(:last-child):after {
+ content: '';
+ position: absolute;
+ left: -9px;
+ top: 24px;
+ bottom: 0px;
+ width: 1px;
+ height: 100%;
+ background: linear-gradient(
+ to bottom,
+ #4568dc 0%,
+ #4568dc 50%,
+ transparent 50%,
+ transparent 100%
+ );
+ background-size: 2px 10px;
+ }
+ }
+
+ &.skipped {
+ &:not(:last-child):after {
+ content: '';
+ position: absolute;
+ left: -9px;
+ top: 24px;
+ bottom: 0px;
+ width: 1px;
+ height: 100%;
+ background: linear-gradient(
+ to bottom,
+ var(--bg-amber-400) 0%,
+ var(--bg-amber-400) 50%,
+ transparent 50%,
+ transparent 100%
+ );
+ background-size: 2px 10px;
+ }
+ }
+
+ .whats-next-checklist-item-title {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 13px;
+ font-style: normal;
+ line-height: 24px; /* 171.429% */
+ letter-spacing: -0.07px;
+
+ cursor: pointer;
+ }
+
+ .whats-next-checklist-item-description {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 142.857% */
+ }
+
+ .whats-next-checklist-item-content {
+ display: none;
+ flex-direction: column;
+ gap: 0.5rem;
+ }
+
+ &:hover {
+ .whats-next-checklist-item-content {
+ display: flex;
+ }
+ }
+
+ &:hover {
+ .whats-next-checklist-item-title {
+ color: var(--Vanilla-100, #fff) !important;
+ }
+ }
+
+ .active {
+ .whats-next-checklist-item-content {
+ display: flex;
+ }
+ }
+
+ &.active {
+ .whats-next-checklist-item-title {
+ color: var(--Vanilla-100, #fff) !important;
+ }
+ }
+
+ .whats-next-checklist-item-action-buttons {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ gap: 0.5rem;
+
+ .whats-next-checklist-item-action-buttons-container {
+ display: flex;
+ flex-direction: row;
+ gap: 0.5rem;
+ }
+
+ .periscope-btn.secondary {
+ border-radius: 2px;
+ border: 1px solid var(--Slate-200, #2c3140);
+ background: var(--Ink-200, #23262e);
+ box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1);
+ }
+
+ .skip-btn {
+ &:hover {
+ color: var(--bg-amber-400);
+ }
+ }
+ }
+ }
+ }
+}
+
+.lightMode {
+ .home-checklist-container {
+ .completed-checklist-container {
+ .completed-checklist-title {
+ color: var(--bg-ink-300);
+ }
+
+ .completed-checklist-item {
+ &:before {
+ border: 1px solid var(--bg-vanilla-300);
+ color: var(--bg-ink-300);
+ background-color: var(--bg-forest-400);
+ }
+
+ .completed-checklist-item-title {
+ color: var(--bg-ink-300);
+ }
+
+ .completed-checklist-item-description {
+ color: var(--bg-ink-300);
+ }
+ }
+ }
+
+ .whats-next-checklist-container {
+ .whats-next-checklist-title {
+ color: var(--bg-ink-300);
+ }
+
+ .whats-next-checklist-item {
+ &:before {
+ background-color: var(--bg-vanilla-100);
+ border: 1px dashed var(--bg-vanilla-300);
+ color: var(--bg-ink-300);
+ }
+
+ .whats-next-checklist-item-title {
+ color: var(--bg-ink-300);
+ }
+
+ .whats-next-checklist-item-description {
+ color: var(--bg-ink-300);
+ }
+
+ &:hover {
+ .whats-next-checklist-item-title {
+ color: var(--bg-ink-300) !important;
+ }
+ }
+
+ &.active {
+ .whats-next-checklist-item-title {
+ color: var(--bg-ink-300) !important;
+ }
+ }
+
+ .whats-next-checklist-item-action-buttons {
+ .periscope-btn.secondary {
+ border-radius: 2px;
+ border: 1px solid var(--bg-vanilla-300);
+ background: var(--bg-vanilla-100);
+ box-shadow: 0px 0px 8px 0px rgba(255, 255, 255, 0.1);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/frontend/src/container/Home/HomeChecklist/HomeChecklist.tsx b/frontend/src/container/Home/HomeChecklist/HomeChecklist.tsx
new file mode 100644
index 0000000000..84148b0d0f
--- /dev/null
+++ b/frontend/src/container/Home/HomeChecklist/HomeChecklist.tsx
@@ -0,0 +1,144 @@
+import './HomeChecklist.styles.scss';
+
+import { Button } from 'antd';
+import logEvent from 'api/common/logEvent';
+import { ArrowRight, ArrowRightToLine, BookOpenText } from 'lucide-react';
+import { useAppContext } from 'providers/App/App';
+import { useEffect, useState } from 'react';
+import { Link } from 'react-router-dom';
+import { USER_ROLES } from 'types/roles';
+
+export type ChecklistItem = {
+ id: string;
+ title: string;
+ description: string;
+ completed: boolean;
+ isSkipped: boolean;
+ skippedPreferenceKey?: string;
+ toRoute?: string;
+ docsLink?: string;
+};
+
+function HomeChecklist({
+ checklistItems,
+ onSkip,
+ isLoading,
+}: {
+ checklistItems: ChecklistItem[];
+ onSkip: (item: ChecklistItem) => void;
+ isLoading: boolean;
+}): JSX.Element {
+ const { user } = useAppContext();
+
+ const [completedChecklistItems, setCompletedChecklistItems] = useState<
+ ChecklistItem[]
+ >([]);
+
+ const [whatsNextChecklistItems, setWhatsNextChecklistItems] = useState<
+ ChecklistItem[]
+ >([]);
+
+ useEffect(() => {
+ setCompletedChecklistItems(checklistItems.filter((item) => item.completed));
+ setWhatsNextChecklistItems(checklistItems.filter((item) => !item.completed));
+ }, [checklistItems]);
+
+ return (
+
+
+
Completed
+
+ {completedChecklistItems.map((item) => (
+
+ ))}
+
+
+ {whatsNextChecklistItems.length > 0 && (
+
+
What's Next
+
+
+ {whatsNextChecklistItems.map((item, index) => (
+
+
{item.title}
+
+
+
+ {item.description}
+
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+
+
+
{
+ logEvent('Welcome Checklist: Get started clicked', {
+ step: item.id,
+ });
+ }}
+ >
+ Get Started
+
+
+
+ {item.docsLink && (
+
{
+ logEvent('Welcome Checklist: Docs clicked', {
+ step: item.id,
+ });
+
+ window?.open(item.docsLink, '_blank');
+ }}
+ >
+
+
+ )}
+
+
+ {!item.isSkipped && (
+
+
{
+ logEvent('Welcome Checklist: Skip clicked', {
+ step: item.id,
+ });
+ onSkip(item);
+ }}
+ disabled={isLoading}
+ loading={isLoading}
+ icon={ }
+ >
+ Skip for now
+
+
+ )}
+
+ )}
+
+
+ ))}
+
+
+ )}
+
+ );
+}
+
+export default HomeChecklist;
diff --git a/frontend/src/container/Home/SavedViews/SavedViews.tsx b/frontend/src/container/Home/SavedViews/SavedViews.tsx
new file mode 100644
index 0000000000..f2dd154419
--- /dev/null
+++ b/frontend/src/container/Home/SavedViews/SavedViews.tsx
@@ -0,0 +1,339 @@
+import { Button, Skeleton, Tag } from 'antd';
+import logEvent from 'api/common/logEvent';
+import { getViewDetailsUsingViewKey } from 'components/ExplorerCard/utils';
+import ROUTES from 'constants/routes';
+import { useGetAllViews } from 'hooks/saveViews/useGetAllViews';
+import { useHandleExplorerTabChange } from 'hooks/useHandleExplorerTabChange';
+import {
+ ArrowRight,
+ ArrowUpRight,
+ CompassIcon,
+ DraftingCompass,
+} from 'lucide-react';
+import { SOURCEPAGE_VS_ROUTES } from 'pages/SaveView/constants';
+import Card from 'periscope/components/Card/Card';
+import { useAppContext } from 'providers/App/App';
+import { useEffect, useMemo, useState } from 'react';
+import { Link } from 'react-router-dom';
+import { ViewProps } from 'types/api/saveViews/types';
+import { DataSource } from 'types/common/queryBuilder';
+import { USER_ROLES } from 'types/roles';
+
+export default function SavedViews({
+ onUpdateChecklistDoneItem,
+ loadingUserPreferences,
+}: {
+ onUpdateChecklistDoneItem: (itemKey: string) => void;
+ loadingUserPreferences: boolean;
+}): JSX.Element {
+ const { user } = useAppContext();
+ const [selectedEntity, setSelectedEntity] = useState
('logs');
+ const [selectedEntityViews, setSelectedEntityViews] = useState([]);
+
+ const {
+ data: logsViewsData,
+ isLoading: logsViewsLoading,
+ isError: logsViewsError,
+ } = useGetAllViews(DataSource.LOGS);
+
+ const {
+ data: tracesViewsData,
+ isLoading: tracesViewsLoading,
+ isError: tracesViewsError,
+ } = useGetAllViews(DataSource.TRACES);
+
+ const logsViews = useMemo(() => [...(logsViewsData?.data.data || [])], [
+ logsViewsData,
+ ]);
+
+ const tracesViews = useMemo(() => [...(tracesViewsData?.data.data || [])], [
+ tracesViewsData,
+ ]);
+
+ useEffect(() => {
+ setSelectedEntityViews(selectedEntity === 'logs' ? logsViews : tracesViews);
+ }, [selectedEntity, logsViews, tracesViews]);
+
+ const hasTracesViews = tracesViews.length > 0;
+ const hasLogsViews = logsViews.length > 0;
+
+ const hasSavedViews = hasTracesViews || hasLogsViews;
+
+ const { handleExplorerTabChange } = useHandleExplorerTabChange();
+
+ const handleRedirectQuery = (view: ViewProps): void => {
+ logEvent('Homepage: Saved view clicked', {
+ viewId: view.uuid,
+ viewName: view.name,
+ entity: selectedEntity,
+ });
+
+ const currentViewDetails = getViewDetailsUsingViewKey(
+ view.uuid,
+ selectedEntity === 'logs' ? logsViews : tracesViews,
+ );
+ if (!currentViewDetails) return;
+ const { query, name, uuid, panelType: currentPanelType } = currentViewDetails;
+
+ if (selectedEntity) {
+ handleExplorerTabChange(
+ currentPanelType,
+ {
+ query,
+ name,
+ uuid,
+ },
+ SOURCEPAGE_VS_ROUTES[selectedEntity],
+ );
+ }
+ };
+
+ useEffect(() => {
+ if (hasSavedViews && !loadingUserPreferences) {
+ onUpdateChecklistDoneItem('SETUP_SAVED_VIEWS');
+ }
+ }, [hasSavedViews, onUpdateChecklistDoneItem, loadingUserPreferences]);
+
+ const emptyStateCard = (): JSX.Element => (
+
+
+
+
+
+
You have not saved any views yet.
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+ Explore your data and save them as views.
+
+ )}
+
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+
+
{
+ logEvent('Homepage: Get Started clicked', {
+ source: 'Saved Views',
+ entity: selectedEntity,
+ });
+ }}
+ >
+ Get Started
+
+
+
+
{
+ logEvent('Homepage: Learn more clicked', {
+ source: 'Saved Views',
+ entity: selectedEntity,
+ });
+
+ window.open(
+ 'https://signoz.io/docs/product-features/saved-view/',
+ '_blank',
+ 'noopener noreferrer',
+ );
+ }}
+ >
+ Learn more
+
+
+ )}
+
+
+ );
+
+ const renderSavedViews = (): JSX.Element => (
+
+
+ {selectedEntityViews.slice(0, 5).map((view) => (
+
handleRedirectQuery(view)}
+ onKeyDown={(e): void => {
+ if (e.key === 'Enter') {
+ handleRedirectQuery(view);
+ }
+ }}
+ >
+
+
+
+
+ {view.name}
+
+
+
+
+ {view.tags?.map((tag: string) => {
+ if (tag === '') {
+ return null;
+ }
+
+ return (
+
+ {tag}
+
+ );
+ })}
+
+
+
handleRedirectQuery(view)}
+ >
+
+
+
+ ))}
+
+ {selectedEntityViews.length === 0 && (
+
+
+ No saved views found.
+
+
+ )}
+
+ {selectedEntity === 'logs' && logsViewsError && (
+
+
+ Oops, something went wrong while loading your saved views.
+
+
+ )}
+
+ {selectedEntity === 'traces' && tracesViewsError && (
+
+
+ Oops, something went wrong while loading your saved views.
+
+
+ )}
+
+
+ );
+
+ const handleTabChange = (tab: string): void => {
+ logEvent('Homepage: Saved views switched', {
+ tab,
+ });
+ setSelectedEntityViews(tab === 'logs' ? logsViews : tracesViews);
+ setSelectedEntity(tab);
+ };
+
+ if (logsViewsLoading || tracesViewsLoading) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ if (logsViewsError || tracesViewsError) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ return (
+
+ {hasSavedViews && (
+
+
+ Saved Views
+
+
+ handleTabChange('logs')}
+ >
+
+ Logs
+
+ handleTabChange('traces')}
+ >
+ Traces
+
+
+
+
+
+ )}
+
+
+ {selectedEntityViews.length > 0 ? renderSavedViews() : emptyStateCard()}
+
+
+ {selectedEntityViews.length > 0 && (
+
+
+
+
{
+ logEvent('Homepage: All saved views clicked', {
+ entity: selectedEntity,
+ });
+ }}
+ >
+ All Views
+
+
+
+
+ )}
+
+ );
+}
diff --git a/frontend/src/container/Home/Services/ServiceMetrics.tsx b/frontend/src/container/Home/Services/ServiceMetrics.tsx
new file mode 100644
index 0000000000..15318244ad
--- /dev/null
+++ b/frontend/src/container/Home/Services/ServiceMetrics.tsx
@@ -0,0 +1,339 @@
+import { Button, Select, Skeleton, Table } from 'antd';
+import logEvent from 'api/common/logEvent';
+import { ENTITY_VERSION_V4 } from 'constants/app';
+import ROUTES from 'constants/routes';
+import {
+ getQueryRangeRequestData,
+ getServiceListFromQuery,
+} from 'container/ServiceApplication/utils';
+import { useGetQueriesRange } from 'hooks/queryBuilder/useGetQueriesRange';
+import useGetTopLevelOperations from 'hooks/useGetTopLevelOperations';
+import useResourceAttribute from 'hooks/useResourceAttribute';
+import { convertRawQueriesToTraceSelectedTags } from 'hooks/useResourceAttribute/utils';
+import { useSafeNavigate } from 'hooks/useSafeNavigate';
+import { ArrowRight, ArrowUpRight } from 'lucide-react';
+import Card from 'periscope/components/Card/Card';
+import { useAppContext } from 'providers/App/App';
+import { IUser } from 'providers/App/types';
+import { memo, useCallback, useEffect, useMemo, useState } from 'react';
+import { QueryKey } from 'react-query';
+import { useSelector } from 'react-redux';
+import { Link } from 'react-router-dom';
+import { AppState } from 'store/reducers';
+import { ServicesList } from 'types/api/metrics/getService';
+import { GlobalReducer } from 'types/reducer/globalTime';
+import { Tags } from 'types/reducer/trace';
+import { USER_ROLES } from 'types/roles';
+
+import { columns, TIME_PICKER_OPTIONS } from './constants';
+
+const homeInterval = 30 * 60 * 1000;
+
+// Extracted EmptyState component
+const EmptyState = memo(
+ ({ user }: { user: IUser }): JSX.Element => (
+
+
+
+
+
You are not sending traces yet.
+
+ Start sending traces to see your services.
+
+
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+
+
{
+ logEvent('Homepage: Get Started clicked', {
+ source: 'Service Metrics',
+ });
+ }}
+ >
+ Get Started
+
+
+
{
+ logEvent('Homepage: Learn more clicked', {
+ source: 'Service Metrics',
+ });
+ window.open(
+ 'https://signoz.io/docs/instrumentation/overview/',
+ '_blank',
+ );
+ }}
+ >
+ Learn more
+
+
+ )}
+
+
+ ),
+);
+EmptyState.displayName = 'EmptyState';
+
+// Extracted ServicesList component
+const ServicesListTable = memo(
+ ({
+ services,
+ onRowClick,
+ }: {
+ services: ServicesList[];
+ onRowClick: (record: ServicesList) => void;
+ }): JSX.Element => (
+
+
+
+ columns={columns}
+ dataSource={services}
+ pagination={false}
+ className="services-table"
+ onRow={(record): { onClick: () => void } => ({
+ onClick: (): void => onRowClick(record),
+ })}
+ />
+
+
+ ),
+);
+ServicesListTable.displayName = 'ServicesListTable';
+
+function ServiceMetrics({
+ onUpdateChecklistDoneItem,
+ loadingUserPreferences,
+}: {
+ onUpdateChecklistDoneItem: (itemKey: string) => void;
+ loadingUserPreferences: boolean;
+}): JSX.Element {
+ const { selectedTime: globalSelectedInterval } = useSelector<
+ AppState,
+ GlobalReducer
+ >((state) => state.globalTime);
+
+ const { user } = useAppContext();
+
+ const [timeRange, setTimeRange] = useState(() => {
+ const now = new Date().getTime();
+ return {
+ startTime: now - homeInterval,
+ endTime: now,
+ selectedInterval: homeInterval,
+ };
+ });
+
+ const { queries } = useResourceAttribute();
+ const { safeNavigate } = useSafeNavigate();
+
+ const selectedTags = useMemo(
+ () => (convertRawQueriesToTraceSelectedTags(queries) as Tags[]) || [],
+ [queries],
+ );
+
+ const [isError, setIsError] = useState(false);
+
+ const queryKey: QueryKey = useMemo(
+ () => [
+ timeRange.startTime,
+ timeRange.endTime,
+ selectedTags,
+ globalSelectedInterval,
+ ],
+ [
+ timeRange.startTime,
+ timeRange.endTime,
+ selectedTags,
+ globalSelectedInterval,
+ ],
+ );
+
+ const {
+ data,
+ isLoading: isLoadingTopLevelOperations,
+ isError: isErrorTopLevelOperations,
+ } = useGetTopLevelOperations(queryKey, {
+ start: timeRange.startTime * 1e6,
+ end: timeRange.endTime * 1e6,
+ });
+
+ const handleTimeIntervalChange = useCallback((value: number): void => {
+ const timeInterval = TIME_PICKER_OPTIONS.find(
+ (option) => option.value === value,
+ );
+
+ logEvent('Homepage: Services time interval updated', {
+ updatedTimeInterval: timeInterval?.label,
+ });
+
+ const now = new Date();
+ setTimeRange({
+ startTime: now.getTime() - value,
+ endTime: now.getTime(),
+ selectedInterval: value,
+ });
+ }, []);
+
+ const topLevelOperations = useMemo(() => Object.entries(data || {}), [data]);
+
+ const queryRangeRequestData = useMemo(
+ () =>
+ getQueryRangeRequestData({
+ topLevelOperations,
+ minTime: timeRange.startTime * 1e6,
+ maxTime: timeRange.endTime * 1e6,
+ globalSelectedInterval,
+ }),
+ [
+ globalSelectedInterval,
+ timeRange.endTime,
+ timeRange.startTime,
+ topLevelOperations,
+ ],
+ );
+
+ const dataQueries = useGetQueriesRange(
+ queryRangeRequestData,
+ ENTITY_VERSION_V4,
+ {
+ queryKey: useMemo(
+ () => [
+ `GetMetricsQueryRange-home-${globalSelectedInterval}`,
+ timeRange.endTime,
+ timeRange.startTime,
+ globalSelectedInterval,
+ ],
+ [globalSelectedInterval, timeRange.endTime, timeRange.startTime],
+ ),
+ keepPreviousData: true,
+ enabled: true,
+ refetchOnMount: false,
+ onError: () => {
+ setIsError(true);
+ },
+ },
+ );
+
+ const isLoading = useMemo(() => dataQueries.some((query) => query.isLoading), [
+ dataQueries,
+ ]);
+
+ const services: ServicesList[] = useMemo(
+ () =>
+ getServiceListFromQuery({
+ queries: dataQueries,
+ topLevelOperations,
+ isLoading,
+ }),
+ [dataQueries, topLevelOperations, isLoading],
+ );
+
+ const sortedServices = useMemo(
+ () =>
+ services?.sort((a, b) => {
+ const aUpdateAt = new Date(a.p99).getTime();
+ const bUpdateAt = new Date(b.p99).getTime();
+ return bUpdateAt - aUpdateAt;
+ }) || [],
+ [services],
+ );
+
+ const servicesExist = sortedServices.length > 0;
+ const top5Services = useMemo(() => sortedServices.slice(0, 5), [
+ sortedServices,
+ ]);
+
+ useEffect(() => {
+ if (!loadingUserPreferences && servicesExist) {
+ onUpdateChecklistDoneItem('SETUP_SERVICES');
+ }
+ }, [onUpdateChecklistDoneItem, loadingUserPreferences, servicesExist]);
+
+ const handleRowClick = useCallback(
+ (record: ServicesList) => {
+ logEvent('Homepage: Service clicked', {
+ serviceName: record.serviceName,
+ });
+ safeNavigate(`${ROUTES.APPLICATION}/${record.serviceName}`);
+ },
+ [safeNavigate],
+ );
+
+ if (isLoadingTopLevelOperations || isLoading) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ if (isErrorTopLevelOperations || isError) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ return (
+
+ {servicesExist && (
+
+
+ {' '}
+ Services
+
+
+
+
+
+ )}
+
+ {servicesExist ? (
+
+ ) : (
+
+ )}
+
+
+ {servicesExist && (
+
+
+
+
{
+ logEvent('Homepage: All Services clicked', {});
+ }}
+ >
+ All Services
+
+
+
+
+ )}
+
+ );
+}
+
+export default memo(ServiceMetrics);
diff --git a/frontend/src/container/Home/Services/ServiceTraces.tsx b/frontend/src/container/Home/Services/ServiceTraces.tsx
new file mode 100644
index 0000000000..5cd7724ec5
--- /dev/null
+++ b/frontend/src/container/Home/Services/ServiceTraces.tsx
@@ -0,0 +1,237 @@
+import { Button, Select, Skeleton, Table } from 'antd';
+import logEvent from 'api/common/logEvent';
+import ROUTES from 'constants/routes';
+import { useQueryService } from 'hooks/useQueryService';
+import { useSafeNavigate } from 'hooks/useSafeNavigate';
+import { ArrowRight, ArrowUpRight } from 'lucide-react';
+import Card from 'periscope/components/Card/Card';
+import { useAppContext } from 'providers/App/App';
+import { useCallback, useEffect, useMemo, useState } from 'react';
+import { useSelector } from 'react-redux';
+import { Link } from 'react-router-dom';
+import { AppState } from 'store/reducers';
+import { ServicesList } from 'types/api/metrics/getService';
+import { GlobalReducer } from 'types/reducer/globalTime';
+import { USER_ROLES } from 'types/roles';
+
+import { columns, TIME_PICKER_OPTIONS } from './constants';
+
+const homeInterval = 30 * 60 * 1000;
+
+export default function ServiceTraces({
+ onUpdateChecklistDoneItem,
+ loadingUserPreferences,
+}: {
+ onUpdateChecklistDoneItem: (itemKey: string) => void;
+ loadingUserPreferences: boolean;
+}): JSX.Element {
+ const { selectedTime } = useSelector(
+ (state) => state.globalTime,
+ );
+
+ const { user } = useAppContext();
+
+ const now = new Date().getTime();
+ const [timeRange, setTimeRange] = useState({
+ startTime: now - homeInterval,
+ endTime: now,
+ selectedInterval: homeInterval,
+ });
+
+ const { safeNavigate } = useSafeNavigate();
+
+ // Fetch Services
+ const {
+ data: services,
+ isLoading: isServicesLoading,
+ isFetching: isServicesFetching,
+ isError: isServicesError,
+ } = useQueryService({
+ minTime: timeRange.startTime * 1e6,
+ maxTime: timeRange.endTime * 1e6,
+ selectedTime,
+ selectedTags: [],
+ options: {
+ enabled: true,
+ },
+ });
+
+ const sortedServices = useMemo(
+ () => services?.sort((a, b) => b.p99 - a.p99) || [],
+ [services],
+ );
+
+ const servicesExist = useMemo(() => sortedServices.length > 0, [
+ sortedServices,
+ ]);
+ const top5Services = useMemo(() => sortedServices.slice(0, 5), [
+ sortedServices,
+ ]);
+
+ useEffect(() => {
+ if (servicesExist && !loadingUserPreferences) {
+ onUpdateChecklistDoneItem('SETUP_SERVICES');
+ }
+ }, [servicesExist, onUpdateChecklistDoneItem, loadingUserPreferences]);
+
+ const handleTimeIntervalChange = useCallback((value: number): void => {
+ const now = new Date();
+
+ const timeInterval = TIME_PICKER_OPTIONS.find(
+ (option) => option.value === value,
+ );
+
+ logEvent('Homepage: Services time interval updated', {
+ updatedTimeInterval: timeInterval?.label,
+ });
+
+ setTimeRange({
+ startTime: now.getTime() - value,
+ endTime: now.getTime(),
+ selectedInterval: value,
+ });
+ }, []);
+
+ const emptyStateCard = useMemo(
+ () => (
+
+
+
+
+
+
You are not sending traces yet.
+
+
+ Start sending traces to see your services.
+
+
+
+ {user?.role !== USER_ROLES.VIEWER && (
+
+
+
{
+ logEvent('Homepage: Get Started clicked', {
+ source: 'Service Traces',
+ });
+ }}
+ >
+ Get Started
+
+
+
+
{
+ logEvent('Homepage: Learn more clicked', {
+ source: 'Service Traces',
+ });
+ window.open(
+ 'https://signoz.io/docs/instrumentation/overview/',
+ '_blank',
+ );
+ }}
+ >
+ Learn more
+
+
+ )}
+
+
+ ),
+ [user?.role],
+ );
+
+ const renderDashboardsList = useCallback(
+ () => (
+
+
+
+ columns={columns}
+ dataSource={top5Services}
+ pagination={false}
+ className="services-table"
+ onRow={(record): { onClick: () => void } => ({
+ onClick: (): void => {
+ logEvent('Homepage: Service clicked', {
+ serviceName: record.serviceName,
+ });
+
+ safeNavigate(`${ROUTES.APPLICATION}/${record.serviceName}`);
+ },
+ })}
+ />
+
+
+ ),
+ [top5Services, safeNavigate],
+ );
+
+ if (isServicesLoading || isServicesFetching) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ if (isServicesError) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ return (
+
+ {servicesExist && (
+
+
+
+ )}
+
+ {servicesExist ? renderDashboardsList() : emptyStateCard}
+
+
+ {servicesExist && (
+
+
+
+
{
+ logEvent('Homepage: All Services clicked', {});
+ }}
+ >
+ All Services
+
+
+
+
+ )}
+
+ );
+}
diff --git a/frontend/src/container/Home/Services/Services.tsx b/frontend/src/container/Home/Services/Services.tsx
new file mode 100644
index 0000000000..f3e0490586
--- /dev/null
+++ b/frontend/src/container/Home/Services/Services.tsx
@@ -0,0 +1,40 @@
+import * as Sentry from '@sentry/react';
+import { FeatureKeys } from 'constants/features';
+import ErrorBoundaryFallback from 'pages/ErrorBoundaryFallback/ErrorBoundaryFallback';
+import { useAppContext } from 'providers/App/App';
+
+import ServiceMetrics from './ServiceMetrics';
+import ServiceTraces from './ServiceTraces';
+
+function Services({
+ onUpdateChecklistDoneItem,
+ loadingUserPreferences,
+}: {
+ onUpdateChecklistDoneItem: (itemKey: string) => void;
+ loadingUserPreferences: boolean;
+}): JSX.Element {
+ const { featureFlags } = useAppContext();
+ const isSpanMetricEnabled =
+ featureFlags?.find((flag) => flag.name === FeatureKeys.USE_SPAN_METRICS)
+ ?.active || false;
+
+ return (
+ }>
+
+ {isSpanMetricEnabled ? (
+
+ ) : (
+
+ )}
+
+
+ );
+}
+
+export default Services;
diff --git a/frontend/src/container/Home/Services/constants.ts b/frontend/src/container/Home/Services/constants.ts
new file mode 100644
index 0000000000..8eec85696e
--- /dev/null
+++ b/frontend/src/container/Home/Services/constants.ts
@@ -0,0 +1,80 @@
+import { TableProps } from 'antd';
+import { ServicesList } from 'types/api/metrics/getService';
+
+export const columns: TableProps['columns'] = [
+ {
+ title: 'APPLICATION',
+ dataIndex: 'serviceName',
+ key: 'serviceName',
+ },
+ {
+ title: 'P99 LATENCY (in ms)',
+ dataIndex: 'p99',
+ key: 'p99',
+ render: (value: number): string => (value / 1000000).toFixed(2),
+ },
+ {
+ title: 'ERROR RATE (% of total)',
+ dataIndex: 'errorRate',
+ key: 'errorRate',
+
+ render: (value: number): string => value.toFixed(2),
+ },
+ {
+ title: 'OPS / SEC',
+ dataIndex: 'callRate',
+ key: 'callRate',
+ render: (value: number): string => value.toFixed(2),
+ },
+];
+
+export enum TimeIntervalsEnum {
+ LAST_5_MINUTES = 60 * 5 * 1000, // 300000
+ LAST_15_MINUTES = 60 * 15 * 1000, // 900000
+ LAST_30_MINUTES = 60 * 30 * 1000, // 1800000
+ LAST_1_HOUR = 60 * 60 * 1000, // 3600000
+ LAST_6_HOURS = 60 * 60 * 6 * 1000, // 21600000
+ LAST_1_DAY = 60 * 60 * 24 * 1000, // 86400000
+ LAST_3_DAYS = 60 * 60 * 24 * 3 * 1000, // 259200000
+ LAST_7_DAYS = 60 * 60 * 24 * 7 * 1000, // 604800000
+ LAST_30_DAYS = 60 * 60 * 24 * 30 * 1000, // 2592000000
+}
+
+export const TIME_PICKER_OPTIONS = [
+ {
+ value: TimeIntervalsEnum.LAST_5_MINUTES,
+ label: 'Last 5 minutes',
+ },
+ {
+ value: TimeIntervalsEnum.LAST_15_MINUTES,
+ label: 'Last 15 minutes',
+ },
+ {
+ value: TimeIntervalsEnum.LAST_30_MINUTES,
+ label: 'Last 30 minutes',
+ },
+ {
+ value: TimeIntervalsEnum.LAST_1_HOUR,
+ label: 'Last 1 hour',
+ },
+ {
+ value: TimeIntervalsEnum.LAST_6_HOURS,
+ label: 'Last 6 hours',
+ },
+ {
+ value: TimeIntervalsEnum.LAST_1_DAY,
+ label: 'Last 1 day',
+ },
+ {
+ value: TimeIntervalsEnum.LAST_3_DAYS,
+ label: 'Last 3 days',
+ },
+ {
+ value: TimeIntervalsEnum.LAST_7_DAYS,
+ label: 'Last 1 week',
+ },
+ {
+ value: TimeIntervalsEnum.LAST_30_DAYS,
+ label: 'Last 1 month',
+ },
+];
diff --git a/frontend/src/container/Home/StepsProgress/StepsProgress.styles.scss b/frontend/src/container/Home/StepsProgress/StepsProgress.styles.scss
new file mode 100644
index 0000000000..dc14c278fe
--- /dev/null
+++ b/frontend/src/container/Home/StepsProgress/StepsProgress.styles.scss
@@ -0,0 +1,55 @@
+.steps-progress-container {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.steps-progress-title {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.steps-progress-title-text {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 142.857% */
+ letter-spacing: -0.07px;
+}
+
+.steps-progress-count {
+ color: var(--Vanilla-400, #c0c1c3);
+ font-family: Inter;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 142.857% */
+ letter-spacing: -0.07px;
+}
+
+.steps-progress-progress {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+
+ width: 100% !important;
+
+ .ant-progress-steps-outer {
+ width: 100% !important;
+ }
+}
+
+.lightMode {
+ .steps-progress-title-text {
+ color: var(--bg-ink-300);
+ }
+
+ .steps-progress-count {
+ color: var(--bg-ink-300);
+ }
+}
diff --git a/frontend/src/container/Home/StepsProgress/StepsProgress.tsx b/frontend/src/container/Home/StepsProgress/StepsProgress.tsx
new file mode 100644
index 0000000000..f341943c34
--- /dev/null
+++ b/frontend/src/container/Home/StepsProgress/StepsProgress.tsx
@@ -0,0 +1,45 @@
+import './StepsProgress.styles.scss';
+
+import { Progress } from 'antd';
+
+import { ChecklistItem } from '../HomeChecklist/HomeChecklist';
+
+function StepsProgress({
+ checklistItems,
+}: {
+ checklistItems: ChecklistItem[];
+}): JSX.Element {
+ const completedChecklistItems = checklistItems.filter(
+ (item) => item.completed,
+ );
+
+ const totalChecklistItems = checklistItems.length;
+
+ const progress = Math.round(
+ (completedChecklistItems.length / totalChecklistItems) * 100,
+ );
+
+ return (
+
+
+
+ Build your observability base
+
+
+ Step {completedChecklistItems.length} / {totalChecklistItems}
+
+
+
+
+
+ );
+}
+
+export default StepsProgress;
diff --git a/frontend/src/container/Home/constants.ts b/frontend/src/container/Home/constants.ts
new file mode 100644
index 0000000000..baeef91f71
--- /dev/null
+++ b/frontend/src/container/Home/constants.ts
@@ -0,0 +1,112 @@
+import ROUTES from 'constants/routes';
+
+import { ChecklistItem } from './HomeChecklist/HomeChecklist';
+
+export const checkListStepToPreferenceKeyMap = {
+ WILL_DO_LATER: 'WELCOME_CHECKLIST_DO_LATER',
+ SEND_LOGS: 'WELCOME_CHECKLIST_SEND_LOGS_SKIPPED',
+ SEND_TRACES: 'WELCOME_CHECKLIST_SEND_TRACES_SKIPPED',
+ SEND_INFRA_METRICS: 'WELCOME_CHECKLIST_SEND_INFRA_METRICS_SKIPPED',
+ SETUP_DASHBOARDS: 'WELCOME_CHECKLIST_SETUP_DASHBOARDS_SKIPPED',
+ SETUP_ALERTS: 'WELCOME_CHECKLIST_SETUP_ALERTS_SKIPPED',
+ SETUP_SAVED_VIEWS: 'WELCOME_CHECKLIST_SETUP_SAVED_VIEW_SKIPPED',
+ SETUP_WORKSPACE: 'WELCOME_CHECKLIST_SETUP_WORKSPACE_SKIPPED',
+ ADD_DATA_SOURCE: 'WELCOME_CHECKLIST_ADD_DATA_SOURCE_SKIPPED',
+};
+
+export const DOCS_LINKS = {
+ SEND_LOGS: 'https://signoz.io/docs/userguide/logs/',
+ SEND_TRACES: 'https://signoz.io/docs/userguide/traces/',
+ SEND_INFRA_METRICS:
+ 'https://signoz.io/docs/infrastructure-monitoring/overview/',
+ SETUP_ALERTS: 'https://signoz.io/docs/userguide/alerts-management/',
+ SETUP_SAVED_VIEWS:
+ 'https://signoz.io/docs/product-features/saved-view/#step-2-save-your-view',
+ SETUP_DASHBOARDS: 'https://signoz.io/docs/userguide/manage-dashboards/',
+};
+
+export const defaultChecklistItemsState: ChecklistItem[] = [
+ {
+ id: 'SETUP_WORKSPACE',
+ title: 'Set up your workspace',
+ description: '',
+ completed: true,
+ isSkipped: false,
+ skippedPreferenceKey: checkListStepToPreferenceKeyMap.SETUP_WORKSPACE,
+ },
+ {
+ id: 'ADD_DATA_SOURCE',
+ title: 'Add your first data source',
+ description: '',
+ completed: false,
+ isSkipped: false,
+ skippedPreferenceKey: checkListStepToPreferenceKeyMap.ADD_DATA_SOURCE,
+ toRoute: ROUTES.GET_STARTED,
+ },
+ {
+ id: 'SEND_LOGS',
+ title: 'Send your logs',
+ description:
+ 'Send your logs to SigNoz to get more visibility into how your resources interact.',
+ completed: false,
+ isSkipped: false,
+ skippedPreferenceKey: checkListStepToPreferenceKeyMap.SEND_LOGS,
+ toRoute: ROUTES.GET_STARTED,
+ docsLink: DOCS_LINKS.SEND_LOGS,
+ },
+ {
+ id: 'SEND_TRACES',
+ title: 'Send your traces',
+ description:
+ 'Send your traces to SigNoz to get more visibility into how your resources interact.',
+ completed: false,
+ isSkipped: false,
+ skippedPreferenceKey: checkListStepToPreferenceKeyMap.SEND_TRACES,
+ toRoute: ROUTES.GET_STARTED,
+ docsLink: DOCS_LINKS.SEND_TRACES,
+ },
+ {
+ id: 'SEND_INFRA_METRICS',
+ title: 'Send your infra metrics',
+ description:
+ 'Send your infra metrics to SigNoz to get more visibility into your infrastructure.',
+ completed: false,
+ isSkipped: false,
+ skippedPreferenceKey: checkListStepToPreferenceKeyMap.SEND_INFRA_METRICS,
+ toRoute: ROUTES.GET_STARTED,
+ docsLink: DOCS_LINKS.SEND_INFRA_METRICS,
+ },
+ {
+ id: 'SETUP_ALERTS',
+ title: 'Setup Alerts',
+ description:
+ 'Setup alerts to get notified when your resources are not performing as expected.',
+ completed: false,
+ isSkipped: false,
+ skippedPreferenceKey: checkListStepToPreferenceKeyMap.SETUP_ALERTS,
+ toRoute: ROUTES.ALERTS_NEW,
+ docsLink: DOCS_LINKS.SETUP_ALERTS,
+ },
+ {
+ id: 'SETUP_SAVED_VIEWS',
+ title: 'Setup Saved Views',
+ description:
+ 'Save your views to get a quick overview of your data and share it with your team.',
+ completed: false,
+ isSkipped: false,
+ skippedPreferenceKey: checkListStepToPreferenceKeyMap.SETUP_SAVED_VIEWS,
+ toRoute: ROUTES.LOGS_EXPLORER,
+ docsLink: DOCS_LINKS.SETUP_SAVED_VIEWS,
+ },
+ {
+ id: 'SETUP_DASHBOARDS',
+ title: 'Setup Dashboards',
+ description:
+ 'Create dashboards to visualize your data and share it with your team.',
+ completed: false,
+ isSkipped: false,
+ skippedPreferenceKey: checkListStepToPreferenceKeyMap.SETUP_DASHBOARDS,
+ toRoute: ROUTES.ALL_DASHBOARD,
+ docsLink: DOCS_LINKS.SETUP_DASHBOARDS,
+ },
+];
diff --git a/frontend/src/container/Home/index.tsx b/frontend/src/container/Home/index.tsx
new file mode 100644
index 0000000000..fbe3fed6bf
--- /dev/null
+++ b/frontend/src/container/Home/index.tsx
@@ -0,0 +1,3 @@
+import Home from './Home';
+
+export default Home;
diff --git a/frontend/src/container/OnboardingContainer/common/ModuleStepsContainer/ModuleStepsContainer.tsx b/frontend/src/container/OnboardingContainer/common/ModuleStepsContainer/ModuleStepsContainer.tsx
index f9efa061f7..c44b483082 100644
--- a/frontend/src/container/OnboardingContainer/common/ModuleStepsContainer/ModuleStepsContainer.tsx
+++ b/frontend/src/container/OnboardingContainer/common/ModuleStepsContainer/ModuleStepsContainer.tsx
@@ -380,7 +380,7 @@ export default function ModuleStepsContainer({
};
const handleLogoClick = (): void => {
- history.push('/');
+ history.push('/home');
};
return (
diff --git a/frontend/src/container/OnboardingV2Container/AddDataSource/AddDataSource.tsx b/frontend/src/container/OnboardingV2Container/AddDataSource/AddDataSource.tsx
index cd3febae06..d336928f95 100644
--- a/frontend/src/container/OnboardingV2Container/AddDataSource/AddDataSource.tsx
+++ b/frontend/src/container/OnboardingV2Container/AddDataSource/AddDataSource.tsx
@@ -426,7 +426,7 @@ function OnboardingAddDataSource(): JSX.Element {
},
);
- history.push(ROUTES.APPLICATION);
+ history.push(ROUTES.HOME);
}}
/>
Get Started (2/4)
diff --git a/frontend/src/container/ServiceApplication/ServiceMetrics/ServiceMetricTable.tsx b/frontend/src/container/ServiceApplication/ServiceMetrics/ServiceMetricTable.tsx
index 9541ee0936..85049ea692 100644
--- a/frontend/src/container/ServiceApplication/ServiceMetrics/ServiceMetricTable.tsx
+++ b/frontend/src/container/ServiceApplication/ServiceMetrics/ServiceMetricTable.tsx
@@ -114,6 +114,7 @@ function ServiceMetricTable({
loading={isLoading}
dataSource={services}
rowKey="serviceName"
+ className="service-metrics-table"
/>
>
);
diff --git a/frontend/src/container/ServiceApplication/ServiceTraces/ServiceTracesTable.tsx b/frontend/src/container/ServiceApplication/ServiceTraces/ServiceTracesTable.tsx
index fcc4c78933..32cb805651 100644
--- a/frontend/src/container/ServiceApplication/ServiceTraces/ServiceTracesTable.tsx
+++ b/frontend/src/container/ServiceApplication/ServiceTraces/ServiceTracesTable.tsx
@@ -71,6 +71,7 @@ function ServiceTraceTable({
loading={loading}
dataSource={services}
rowKey="serviceName"
+ className="service-traces-table"
/>
>
);
diff --git a/frontend/src/container/SideNav/SideNav.tsx b/frontend/src/container/SideNav/SideNav.tsx
index 8c1305c970..9f71c2f810 100644
--- a/frontend/src/container/SideNav/SideNav.tsx
+++ b/frontend/src/container/SideNav/SideNav.tsx
@@ -352,7 +352,7 @@ function SideNav(): JSX.Element {
// eslint-disable-next-line react/no-unknown-property
onClick={(event: MouseEvent): void => {
// Current home page
- onClickHandler(ROUTES.APPLICATION, event);
+ onClickHandler(ROUTES.HOME, event);
}}
>
@@ -366,7 +366,7 @@ function SideNav(): JSX.Element {
- {isCloudUserVal && (
+ {isCloudUserVal && user?.role !== USER_ROLES.VIEWER && (
= {
[ROUTES.INFRASTRUCTURE_MONITORING_KUBERNETES]: [
QueryParams.resourceAttributes,
],
+ [ROUTES.HOME]: [QueryParams.resourceAttributes],
};
diff --git a/frontend/src/container/SideNav/menuItems.tsx b/frontend/src/container/SideNav/menuItems.tsx
index 145982c2f0..af3acc7f6f 100644
--- a/frontend/src/container/SideNav/menuItems.tsx
+++ b/frontend/src/container/SideNav/menuItems.tsx
@@ -8,6 +8,7 @@ import {
Cloudy,
DraftingCompass,
FileKey2,
+ Home,
Layers2,
LayoutGrid,
ListMinus,
@@ -36,6 +37,12 @@ export const getStartedV3MenuItem = {
icon: ,
};
+export const homeMenuItem = {
+ key: ROUTES.HOME,
+ label: 'Home',
+ icon: ,
+};
+
export const inviteMemberMenuItem = {
key: `${ROUTES.ORG_SETTINGS}#invite-team-members`,
label: 'Invite Team Member',
@@ -73,6 +80,11 @@ export const trySignozCloudMenuItem: SidebarItem = {
};
const menuItems: SidebarItem[] = [
+ {
+ key: ROUTES.HOME,
+ label: 'Home',
+ icon: ,
+ },
{
key: ROUTES.APPLICATION,
label: 'Services',
diff --git a/frontend/src/container/TopNav/Breadcrumbs/index.tsx b/frontend/src/container/TopNav/Breadcrumbs/index.tsx
index 8ac91a539b..b6d6fd1bf8 100644
--- a/frontend/src/container/TopNav/Breadcrumbs/index.tsx
+++ b/frontend/src/container/TopNav/Breadcrumbs/index.tsx
@@ -4,6 +4,7 @@ import { Link, RouteComponentProps, withRouter } from 'react-router-dom';
const breadcrumbNameMap: Record = {
[ROUTES.APPLICATION]: 'Services',
+ [ROUTES.HOME]: 'Home',
[ROUTES.TRACE]: 'Traces',
[ROUTES.TRACES_EXPLORER]: 'Traces Explorer',
[ROUTES.SERVICE_MAP]: 'Service Map',
@@ -57,7 +58,7 @@ function ShowBreadcrumbs(props: RouteComponentProps): JSX.Element {
const breadcrumbItems = [
- Home
+ Home
,
].concat(extraBreadcrumbItems);
diff --git a/frontend/src/container/TopNav/DateTimeSelection/config.ts b/frontend/src/container/TopNav/DateTimeSelection/config.ts
index eda6ab99b3..dbab491b0c 100644
--- a/frontend/src/container/TopNav/DateTimeSelection/config.ts
+++ b/frontend/src/container/TopNav/DateTimeSelection/config.ts
@@ -102,6 +102,7 @@ export const getOptions = (routes: string): Option[] => {
export const routesToHideBreadCrumbs = [ROUTES.SUPPORT, ROUTES.ALL_DASHBOARD];
export const routesToSkip = [
+ ROUTES.HOME,
ROUTES.SETTINGS,
ROUTES.LIST_ALL_ALERT,
ROUTES.TRACE_DETAIL,
diff --git a/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts b/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts
index 3eafb58754..42ca5551a2 100644
--- a/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts
+++ b/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts
@@ -175,6 +175,7 @@ export const getOptions = (routes: string): Option[] => {
export const routesToHideBreadCrumbs = [ROUTES.SUPPORT, ROUTES.ALL_DASHBOARD];
export const routesToSkip = [
+ ROUTES.HOME,
ROUTES.SETTINGS,
ROUTES.LIST_ALL_ALERT,
ROUTES.TRACE_DETAIL,
diff --git a/frontend/src/pages/HomePage/HomePage.tsx b/frontend/src/pages/HomePage/HomePage.tsx
new file mode 100644
index 0000000000..e3c1ac623f
--- /dev/null
+++ b/frontend/src/pages/HomePage/HomePage.tsx
@@ -0,0 +1,7 @@
+import Home from 'container/Home';
+
+function HomePage(): JSX.Element {
+ return ;
+}
+
+export default HomePage;
diff --git a/frontend/src/pages/HomePage/index.tsx b/frontend/src/pages/HomePage/index.tsx
new file mode 100644
index 0000000000..d91fb083d2
--- /dev/null
+++ b/frontend/src/pages/HomePage/index.tsx
@@ -0,0 +1,3 @@
+import HomePage from './HomePage';
+
+export default HomePage;
diff --git a/frontend/src/periscope.scss b/frontend/src/periscope.scss
index 70201c5628..075e73730b 100644
--- a/frontend/src/periscope.scss
+++ b/frontend/src/periscope.scss
@@ -36,6 +36,15 @@
&:disabled {
opacity: 0.5;
}
+
+ &.link {
+ color: var(--bg-vanilla-400);
+ border: none;
+ box-shadow: none;
+ background: transparent;
+ font-size: 11px;
+ font-weight: 400;
+ }
}
.periscope-tab {
diff --git a/frontend/src/periscope/components/Card/Card.styles.scss b/frontend/src/periscope/components/Card/Card.styles.scss
new file mode 100644
index 0000000000..9e346abd25
--- /dev/null
+++ b/frontend/src/periscope/components/Card/Card.styles.scss
@@ -0,0 +1,89 @@
+.periscope-card {
+ border-radius: 4px;
+ border: 1px solid var(--bg-slate-400, #1d212d);
+ background: var(--bg-ink-400, #121317);
+ color: var(--bg-vanilla-100);
+
+ .periscope-card-header {
+ padding: 12px;
+ width: 100%;
+ border-bottom: 1px solid var(--bg-slate-400, #1d212d);
+
+ display: flex;
+ align-items: center;
+ flex-direction: row;
+ gap: 1rem;
+ }
+
+ .periscope-card-content {
+ padding: 12px;
+ width: 100%;
+ }
+
+ .periscope-card-footer {
+ border-top: 1px solid var(--bg-slate-400, #1d212d);
+ padding: 12px;
+ width: 100%;
+ }
+
+ &.small {
+ .periscope-card-header {
+ padding: 8px;
+ }
+
+ .periscope-card-content {
+ padding: 8px;
+ }
+
+ .periscope-card-footer {
+ padding: 8px;
+ }
+ }
+
+ &.medium {
+ .periscope-card-header {
+ padding: 12px;
+ }
+
+ .periscope-card-content {
+ padding: 12px;
+ }
+
+ .periscope-card-footer {
+ padding: 12px;
+ }
+ }
+
+ &.large {
+ .periscope-card-header {
+ padding: 16px;
+ }
+
+ .periscope-card-content {
+ padding: 16px;
+ }
+
+ .periscope-card-footer {
+ padding: 16px;
+ }
+ }
+}
+
+.lightMode {
+ .periscope-card {
+ border: 1px solid var(--bg-vanilla-300);
+
+ border-radius: 4px;
+
+ background: var(--bg-vanilla-100);
+ color: var(--bg-ink-300);
+
+ .periscope-card-header {
+ border-bottom: 1px solid var(--bg-vanilla-300);
+ }
+
+ .periscope-card-footer {
+ border-top: 1px solid var(--bg-vanilla-300);
+ }
+ }
+}
diff --git a/frontend/src/periscope/components/Card/Card.tsx b/frontend/src/periscope/components/Card/Card.tsx
new file mode 100644
index 0000000000..0f2af6a7bb
--- /dev/null
+++ b/frontend/src/periscope/components/Card/Card.tsx
@@ -0,0 +1,37 @@
+import './Card.styles.scss';
+
+import cx from 'classnames';
+import { ReactNode } from 'react';
+
+type CardProps = {
+ children: ReactNode;
+ className?: string;
+ size?: 'small' | 'medium' | 'large';
+};
+
+function Card({ children, className, size }: CardProps): JSX.Element {
+ return {children}
;
+}
+
+function CardHeader({ children }: { children: ReactNode }): JSX.Element {
+ return {children}
;
+}
+
+function CardContent({ children }: { children: ReactNode }): JSX.Element {
+ return {children}
;
+}
+
+function CardFooter({ children }: { children: ReactNode }): JSX.Element {
+ return {children}
;
+}
+
+Card.Header = CardHeader;
+Card.Content = CardContent;
+Card.Footer = CardFooter;
+
+Card.defaultProps = {
+ className: '',
+ size: 'medium',
+};
+
+export default Card;
diff --git a/frontend/src/types/api/preferences/userOrgPreferences.ts b/frontend/src/types/api/preferences/userOrgPreferences.ts
index ab9292596f..f1384c5e75 100644
--- a/frontend/src/types/api/preferences/userOrgPreferences.ts
+++ b/frontend/src/types/api/preferences/userOrgPreferences.ts
@@ -1,4 +1,4 @@
-import { OrgPreference } from 'types/reducer/app';
+import { OrgPreference, UserPreference } from 'types/reducer/app';
export interface GetOrgPreferenceResponseProps {
status: string;
@@ -17,7 +17,7 @@ export interface GetAllOrgPreferencesResponseProps {
export interface GetAllUserPreferencesResponseProps {
status: string;
- data: Record;
+ data: UserPreference[];
}
export interface UpdateOrgPreferenceProps {
diff --git a/frontend/src/types/reducer/app.ts b/frontend/src/types/reducer/app.ts
index 56b6237152..8fa8acf4e5 100644
--- a/frontend/src/types/reducer/app.ts
+++ b/frontend/src/types/reducer/app.ts
@@ -22,6 +22,18 @@ export interface OrgPreference {
value: boolean;
}
+export interface UserPreference {
+ key: string;
+ name: string;
+ description: string;
+ valueType: string;
+ defaultValue: boolean;
+ allowedValues: any[];
+ isDiscreteValues: boolean;
+ allowedScopes: string[];
+ value: boolean;
+}
+
export default interface AppReducer {
currentVersion: string;
latestVersion: string;
diff --git a/frontend/src/utils/permission/index.ts b/frontend/src/utils/permission/index.ts
index 61b607c251..b0f30b4442 100644
--- a/frontend/src/utils/permission/index.ts
+++ b/frontend/src/utils/permission/index.ts
@@ -45,6 +45,7 @@ export const componentPermission: Record = {
};
export const routePermission: Record = {
+ HOME: ['ADMIN', 'EDITOR', 'VIEWER'],
ALERTS_NEW: ['ADMIN', 'EDITOR'],
ORG_SETTINGS: ['ADMIN'],
MY_SETTINGS: ['ADMIN', 'EDITOR', 'VIEWER'],
@@ -85,9 +86,9 @@ export const routePermission: Record = {
LOGS_INDEX_FIELDS: ['ADMIN', 'EDITOR', 'VIEWER'],
LOGS_PIPELINES: ['ADMIN', 'EDITOR', 'VIEWER'],
TRACE_EXPLORER: ['ADMIN', 'EDITOR', 'VIEWER'],
- GET_STARTED: ['ADMIN', 'EDITOR', 'VIEWER'],
+ GET_STARTED: ['ADMIN', 'EDITOR'],
ONBOARDING: ['ADMIN'],
- GET_STARTED_WITH_CLOUD: ['ADMIN', 'EDITOR', 'VIEWER'],
+ GET_STARTED_WITH_CLOUD: ['ADMIN', 'EDITOR'],
GET_STARTED_APPLICATION_MONITORING: ['ADMIN', 'EDITOR', 'VIEWER'],
GET_STARTED_INFRASTRUCTURE_MONITORING: ['ADMIN', 'EDITOR', 'VIEWER'],
GET_STARTED_LOGS_MANAGEMENT: ['ADMIN', 'EDITOR', 'VIEWER'],
diff --git a/frontend/tests/traces/utils.ts b/frontend/tests/traces/utils.ts
index 1f1a7eefc1..28f76b0e58 100644
--- a/frontend/tests/traces/utils.ts
+++ b/frontend/tests/traces/utils.ts
@@ -1,12 +1,12 @@
import { Page } from '@playwright/test';
-import attributeKeyServiceNameSuccessResponse from '../fixtures/api/traces/attributeKeysServiceName200.json';
-import attributeKeyNameSuccessResponse from '../fixtures/api/traces/attributeKeysName200.json';
import attributeKeyDurationNanoSuccessResponse from '../fixtures/api/traces/attributeKeysDurationNano200.json';
-import attributeKeyResponseStatusCodeSuccessResponse from '../fixtures/api/traces/attributeKeysResponseStatusCode200.json';
import attributeKeyHttpMethodSuccessResponse from '../fixtures/api/traces/attributeKeysHttpMethod200.json';
-import traceExplorerViewsSuccessResponse from '../fixtures/api/traces/traceExplorerViews200.json';
+import attributeKeyNameSuccessResponse from '../fixtures/api/traces/attributeKeysName200.json';
+import attributeKeyResponseStatusCodeSuccessResponse from '../fixtures/api/traces/attributeKeysResponseStatusCode200.json';
+import attributeKeyServiceNameSuccessResponse from '../fixtures/api/traces/attributeKeysServiceName200.json';
import traceExplorerViewsPostSuccessResponse from '../fixtures/api/traces/traceExplorerViewPost200.json';
+import traceExplorerViewsSuccessResponse from '../fixtures/api/traces/traceExplorerViews200.json';
import { JsonApplicationType } from '../fixtures/constant';
export const queryRangeApiEndpoint = 'query_range';
diff --git a/frontend/webpack.config.js b/frontend/webpack.config.js
index 43645ab893..8331a2d4e4 100644
--- a/frontend/webpack.config.js
+++ b/frontend/webpack.config.js
@@ -119,10 +119,23 @@ const config = {
],
},
{
- test: /\.(jpe?g|png|gif|svg)$/i,
+ test: /\.(png|jpe?g|gif|svg)$/i,
use: [
- 'file-loader?hash=sha512&digest=hex&name=img/[chunkhash].[ext]',
- 'image-webpack-loader?bypassOnDebug&optipng.optimizationLevel=7&gifsicle.interlaced=false',
+ {
+ loader: 'file-loader',
+ },
+ {
+ loader: 'image-webpack-loader',
+ options: {
+ bypassOnDebug: true,
+ optipng: {
+ optimizationLevel: 7,
+ },
+ gifsicle: {
+ interlaced: false,
+ },
+ },
+ },
],
},
{
diff --git a/frontend/webpack.config.prod.js b/frontend/webpack.config.prod.js
index 5a86c8ffda..f9121c16f7 100644
--- a/frontend/webpack.config.prod.js
+++ b/frontend/webpack.config.prod.js
@@ -144,12 +144,26 @@ const config = {
],
},
{
- test: /\.(jpe?g|png|gif|svg)$/i,
+ test: /\.(png|jpe?g|gif|svg)$/i,
use: [
- 'file-loader?hash=sha512&digest=hex&name=img/[chunkhash].[ext]',
- 'image-webpack-loader?bypassOnDebug&optipng.optimizationLevel=7&gifsicle.interlaced=false',
+ {
+ loader: 'file-loader',
+ },
+ {
+ loader: 'image-webpack-loader',
+ options: {
+ bypassOnDebug: true,
+ optipng: {
+ optimizationLevel: 7,
+ },
+ gifsicle: {
+ interlaced: false,
+ },
+ },
+ },
],
},
+
{
test: /\.(ttf|eot|woff|woff2)$/,
use: ['file-loader'],
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 168e769bb3..cfd14b8df3 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -3669,6 +3669,11 @@
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==
+"@sindresorhus/is@^0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+ integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
+
"@sinonjs/commons@^1.7.0":
version "1.8.6"
resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz"
@@ -4055,6 +4060,14 @@
resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613"
integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==
+"@types/glob@^7.1.1":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+ integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3":
version "4.1.6"
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae"
@@ -4209,6 +4222,11 @@
dependencies:
mini-css-extract-plugin "*"
+"@types/minimatch@*":
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
+ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
+
"@types/minimist@^1.2.0":
version "1.2.2"
resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz"
@@ -5306,6 +5324,18 @@ anymatch@^3.0.3, anymatch@~3.1.2:
normalize-path "^3.0.0"
picomatch "^2.0.4"
+arch@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
+ integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
+
+archive-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70"
+ integrity sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==
+ dependencies:
+ file-type "^4.2.0"
+
arg@^4.1.0:
version "4.1.3"
resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz"
@@ -5991,11 +6021,67 @@ big.js@^5.2.2:
resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz"
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+bin-build@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861"
+ integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==
+ dependencies:
+ decompress "^4.0.0"
+ download "^6.2.2"
+ execa "^0.7.0"
+ p-map-series "^1.0.0"
+ tempfile "^2.0.0"
+
+bin-check@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49"
+ integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==
+ dependencies:
+ execa "^0.7.0"
+ executable "^4.1.0"
+
+bin-version-check@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71"
+ integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==
+ dependencies:
+ bin-version "^3.0.0"
+ semver "^5.6.0"
+ semver-truncate "^1.1.2"
+
+bin-version@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839"
+ integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==
+ dependencies:
+ execa "^1.0.0"
+ find-versions "^3.0.0"
+
+bin-wrapper@^4.0.0, bin-wrapper@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605"
+ integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==
+ dependencies:
+ bin-check "^4.1.0"
+ bin-version-check "^4.0.0"
+ download "^7.1.0"
+ import-lazy "^3.1.0"
+ os-filter-obj "^2.0.0"
+ pify "^4.0.1"
+
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+bl@^1.0.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
+ integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
+ dependencies:
+ readable-stream "^2.3.5"
+ safe-buffer "^5.1.1"
+
bl@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
@@ -6103,11 +6189,34 @@ bser@2.1.1:
dependencies:
node-int64 "^0.4.0"
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
buffer-equal@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz"
integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==
+
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
@@ -6118,7 +6227,7 @@ buffer-to-arraybuffer@^0.0.5:
resolved "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz"
integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==
-buffer@^5.5.0:
+buffer@^5.2.1, buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -6144,6 +6253,19 @@ bytes@3.1.2:
resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"
integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+cacheable-request@^2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+ integrity sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==
+ dependencies:
+ clone-response "1.0.2"
+ get-stream "3.0.0"
+ http-cache-semantics "3.8.1"
+ keyv "3.0.0"
+ lowercase-keys "1.0.0"
+ normalize-url "2.0.1"
+ responselike "1.0.2"
+
call-bind@^1.0.0, call-bind@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
@@ -6236,6 +6358,16 @@ cardboard-vr-display@^1.0.19:
nosleep.js "^0.7.0"
webvr-polyfill-dpdb "^1.0.17"
+caw@^2.0.0, caw@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95"
+ integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==
+ dependencies:
+ get-proxy "^2.0.0"
+ isurl "^1.0.0-alpha5"
+ tunnel-agent "^0.6.0"
+ url-to-options "^1.0.1"
+
ccount@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5"
@@ -6440,6 +6572,13 @@ clone-deep@^4.0.1:
kind-of "^6.0.2"
shallow-clone "^3.0.0"
+clone-response@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==
+ dependencies:
+ mimic-response "^1.0.0"
+
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
@@ -6541,7 +6680,7 @@ comma-separated-tokens@^2.0.0:
resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee"
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
-commander@2, commander@^2.20.0, commander@^2.20.3:
+commander@2, commander@^2.20.0, commander@^2.20.3, commander@^2.8.1:
version "2.20.3"
resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -6620,6 +6759,14 @@ concat-map@0.0.1:
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+config-chain@^1.1.11:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
+ integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
confusing-browser-globals@^1.0.10:
version "1.0.11"
resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz"
@@ -6630,7 +6777,7 @@ connect-history-api-fallback@^2.0.0:
resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz"
integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==
-content-disposition@0.5.4:
+content-disposition@0.5.4, content-disposition@^0.5.2:
version "0.5.4"
resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz"
integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
@@ -6807,7 +6954,7 @@ cross-fetch@3.1.5:
dependencies:
node-fetch "2.6.7"
-cross-spawn@7.0.5, cross-spawn@^6.0.5, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-spawn@7.0.5, cross-spawn@^5.0.1, cross-spawn@^6.0.0, cross-spawn@^6.0.5, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.5.tgz#910aac880ff5243da96b728bc6521a5f6c2f2f82"
integrity sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==
@@ -6906,7 +7053,7 @@ css-to-react-native@^3.0.0:
css-color-keywords "^1.0.0"
postcss-value-parser "^4.0.2"
-css-tree@^1.1.2:
+css-tree@^1.1.2, css-tree@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
@@ -7003,6 +7150,13 @@ cssnano@^6.0.1:
cssnano-preset-default "^6.0.1"
lilconfig "^2.1.0"
+csso@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+ integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+ dependencies:
+ css-tree "^1.1.2"
+
csso@^5.0.5:
version "5.0.5"
resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6"
@@ -7042,6 +7196,14 @@ custom-event-polyfill@^1.0.6:
resolved "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz"
integrity sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==
+cwebp-bin@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/cwebp-bin/-/cwebp-bin-7.0.1.tgz#cb1303bf43f645ba5b2ece342773c4a93574d4f4"
+ integrity sha512-Ko5ADY74/dbfd8xG0+f+MUP9UKjCe1TG4ehpW0E5y4YlPdwDJlGrSzSR4/Yonxpm9QmZE1RratkIxFlKeyo3FA==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.1"
+
"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3":
version "3.2.3"
resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz"
@@ -7313,13 +7475,66 @@ decode-uri-component@^0.2.0:
resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
-decompress-response@^3.3.0:
+decompress-response@^3.2.0, decompress-response@^3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz"
integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==
dependencies:
mimic-response "^1.0.0"
+decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
+ integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
+ dependencies:
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+ tar-stream "^1.5.2"
+
+decompress-tarbz2@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
+ integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
+ dependencies:
+ decompress-tar "^4.1.0"
+ file-type "^6.1.0"
+ is-stream "^1.1.0"
+ seek-bzip "^1.0.5"
+ unbzip2-stream "^1.0.9"
+
+decompress-targz@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
+ integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
+ dependencies:
+ decompress-tar "^4.1.1"
+ file-type "^5.2.0"
+ is-stream "^1.1.0"
+
+decompress-unzip@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
+ integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==
+ dependencies:
+ file-type "^3.8.0"
+ get-stream "^2.2.0"
+ pify "^2.3.0"
+ yauzl "^2.4.2"
+
+decompress@^4.0.0, decompress@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118"
+ integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==
+ dependencies:
+ decompress-tar "^4.0.0"
+ decompress-tarbz2 "^4.0.0"
+ decompress-targz "^4.0.0"
+ decompress-unzip "^4.0.1"
+ graceful-fs "^4.1.10"
+ make-dir "^1.0.0"
+ pify "^2.3.0"
+ strip-dirs "^2.0.0"
+
dedent@^0.7.0:
version "0.7.0"
resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz"
@@ -7634,11 +7849,51 @@ dotenv@^16.3.1:
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
+download@^6.2.2:
+ version "6.2.5"
+ resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714"
+ integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==
+ dependencies:
+ caw "^2.0.0"
+ content-disposition "^0.5.2"
+ decompress "^4.0.0"
+ ext-name "^5.0.0"
+ file-type "5.2.0"
+ filenamify "^2.0.0"
+ get-stream "^3.0.0"
+ got "^7.0.0"
+ make-dir "^1.0.0"
+ p-event "^1.0.0"
+ pify "^3.0.0"
+
+download@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233"
+ integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==
+ dependencies:
+ archive-type "^4.0.0"
+ caw "^2.0.1"
+ content-disposition "^0.5.2"
+ decompress "^4.2.0"
+ ext-name "^5.0.0"
+ file-type "^8.1.0"
+ filenamify "^2.0.0"
+ get-stream "^3.0.0"
+ got "^8.3.1"
+ make-dir "^1.2.0"
+ p-event "^2.1.0"
+ pify "^3.0.0"
+
dtype@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz"
integrity sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==
+duplexer3@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e"
+ integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==
+
duplexer@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
@@ -7699,6 +7954,13 @@ encodeurl@~2.0.0:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
enhanced-resolve@^5.17.1, enhanced-resolve@^5.7.0:
version "5.17.1"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15"
@@ -7902,7 +8164,7 @@ escape-html@~1.0.3:
resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
-escape-string-regexp@^1.0.5:
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
@@ -8302,6 +8564,58 @@ events@^3.2.0, events@^3.3.0:
resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+exec-buffer@^3.0.0, exec-buffer@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
+ integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==
+ dependencies:
+ execa "^0.7.0"
+ p-finally "^1.0.0"
+ pify "^3.0.0"
+ rimraf "^2.5.4"
+ tempfile "^2.0.0"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
+ integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
+ dependencies:
+ cross-spawn "^7.0.0"
+ get-stream "^5.0.0"
+ human-signals "^1.1.1"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.0"
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+ strip-final-newline "^2.0.0"
+
execa@^5.0.0, execa@^5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
@@ -8317,6 +8631,13 @@ execa@^5.0.0, execa@^5.1.1:
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
+executable@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
+ integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==
+ dependencies:
+ pify "^2.2.0"
+
exit@^0.1.2:
version "0.1.2"
resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
@@ -8380,6 +8701,21 @@ express@^4.17.3:
utils-merge "1.0.1"
vary "~1.1.2"
+ext-list@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
+ integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==
+ dependencies:
+ mime-db "^1.28.0"
+
+ext-name@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6"
+ integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==
+ dependencies:
+ ext-list "^2.0.0"
+ sort-keys-length "^1.0.0"
+
extend@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
@@ -8404,6 +8740,17 @@ fast-diff@^1.1.2:
resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+fast-glob@^3.0.3:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
+ integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.8"
+
fast-glob@^3.2.5, fast-glob@^3.2.9:
version "3.2.12"
resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz"
@@ -8435,6 +8782,13 @@ fast-shallow-equal@^1.0.0:
resolved "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz"
integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==
+fast-xml-parser@^4.1.3:
+ version "4.5.3"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz#c54d6b35aa0f23dc1ea60b6c884340c006dc6efb"
+ integrity sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==
+ dependencies:
+ strnum "^1.1.1"
+
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"
@@ -8478,6 +8832,13 @@ fb-watchman@^2.0.0:
dependencies:
bser "2.1.1"
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
+ dependencies:
+ pend "~1.2.0"
+
fflate@^0.4.8:
version "0.4.8"
resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae"
@@ -8510,6 +8871,55 @@ file-saver@^2.0.2:
resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38"
integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==
+file-type@5.2.0, file-type@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
+ integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==
+
+file-type@^10.4.0, file-type@^10.5.0:
+ version "10.11.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890"
+ integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==
+
+file-type@^12.0.0:
+ version "12.4.2"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-12.4.2.tgz#a344ea5664a1d01447ee7fb1b635f72feb6169d9"
+ integrity sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==
+
+file-type@^3.8.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+ integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==
+
+file-type@^4.2.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
+ integrity sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==
+
+file-type@^6.1.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
+ integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
+
+file-type@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c"
+ integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==
+
+filename-reserved-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
+ integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==
+
+filenamify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9"
+ integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==
+ dependencies:
+ filename-reserved-regex "^2.0.0"
+ strip-outer "^1.0.0"
+ trim-repeated "^1.0.0"
+
fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
@@ -8562,6 +8972,13 @@ find-up@^6.3.0:
locate-path "^7.1.0"
path-exists "^5.0.0"
+find-versions@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e"
+ integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==
+ dependencies:
+ semver-regex "^2.0.0"
+
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz"
@@ -8664,16 +9081,38 @@ fraction.js@^4.3.7:
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
+framer-motion@^12.4.13:
+ version "12.4.13"
+ resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-12.4.13.tgz#1efd954f95e6a54685b660929c00f5a61e35256a"
+ integrity sha512-JHSXIdL7WOTCSEb2UUurHURV85pWTn6UIg+iWLBhH5SFndbjni8CEQcxwsBwOs3RHZ83TkE4xoxb9cHsFPY9yQ==
+ dependencies:
+ motion-dom "^12.4.11"
+ motion-utils "^12.4.10"
+ tslib "^2.4.0"
+
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+from2@^2.1.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
fromentries@^1.3.2:
version "1.3.2"
resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz"
integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
fs-extra@^10.0.0:
version "10.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz"
@@ -8791,6 +9230,40 @@ get-package-type@^0.1.0:
resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz"
integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+get-proxy@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93"
+ integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==
+ dependencies:
+ npm-conf "^1.1.0"
+
+get-stream@3.0.0, get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+ integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==
+
+get-stream@^2.2.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+ integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
+get-stream@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
get-stream@^6.0.0:
version "6.0.1"
resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"
@@ -8804,6 +9277,15 @@ get-symbol-description@^1.0.0:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
+gifsicle@^5.0.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.3.0.tgz#499713c6f1e89ebbc3630da3a74fdb4697913b4e"
+ integrity sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+ execa "^5.0.0"
+
git-raw-commits@^2.0.0:
version "2.0.11"
resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz"
@@ -8893,6 +9375,20 @@ globalthis@^1.0.3:
dependencies:
define-properties "^1.1.3"
+globby@^10.0.0:
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+ integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.0.3"
+ glob "^7.1.3"
+ ignore "^5.1.1"
+ merge2 "^1.2.3"
+ slash "^3.0.0"
+
globby@^11.0.3, globby@^11.1.0:
version "11.1.0"
resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
@@ -8912,7 +9408,50 @@ gopd@^1.0.1:
dependencies:
get-intrinsic "^1.1.3"
-graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
+got@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+ integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+ dependencies:
+ decompress-response "^3.2.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-plain-obj "^1.1.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ p-cancelable "^0.3.0"
+ p-timeout "^1.1.1"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ url-parse-lax "^1.0.0"
+ url-to-options "^1.0.1"
+
+got@^8.3.1:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937"
+ integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==
+ dependencies:
+ "@sindresorhus/is" "^0.7.0"
+ cacheable-request "^2.1.1"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ into-stream "^3.1.0"
+ is-retry-allowed "^1.1.0"
+ isurl "^1.0.0-alpha5"
+ lowercase-keys "^1.0.0"
+ mimic-response "^1.0.0"
+ p-cancelable "^0.4.0"
+ p-timeout "^2.0.1"
+ pify "^3.0.0"
+ safe-buffer "^5.1.1"
+ timed-out "^4.0.1"
+ url-parse-lax "^3.0.0"
+ url-to-options "^1.0.1"
+
+graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
version "4.2.11"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -8973,11 +9512,23 @@ has-proto@^1.0.1:
resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz"
integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+has-symbol-support-x@^1.4.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+ integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
has-symbols@^1.0.2, has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+has-to-string-tag-x@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+ integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+ dependencies:
+ has-symbol-support-x "^1.4.1"
+
has-tostringtag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
@@ -9361,6 +9912,11 @@ htmlparser2@^6.1.0:
domutils "^2.5.2"
entities "^2.0.0"
+http-cache-semantics@3.8.1:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+ integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
+
http-deceiver@^1.2.7:
version "1.2.7"
resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
@@ -9430,6 +9986,11 @@ https-proxy-agent@^5.0.0:
agent-base "6"
debug "4"
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
human-signals@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
@@ -9505,6 +10066,91 @@ image-size@~0.5.0:
resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz"
integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
+image-webpack-loader@8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/image-webpack-loader/-/image-webpack-loader-8.1.0.tgz#cd97172e1e7304ef5eb898344fc25bbb650fc7d7"
+ integrity sha512-bxzMIBNu42KGo6Bc9YMB0QEUt+XuVTl2ZSX3oGAlbsqYOkxkT4TEWvVsnwUkCRCYISJrMCEc/s0y8OYrmEfUOg==
+ dependencies:
+ imagemin "^7.0.1"
+ loader-utils "^2.0.0"
+ object-assign "^4.1.1"
+ schema-utils "^2.7.1"
+ optionalDependencies:
+ imagemin-gifsicle "^7.0.0"
+ imagemin-mozjpeg "^9.0.0"
+ imagemin-optipng "^8.0.0"
+ imagemin-pngquant "^9.0.2"
+ imagemin-svgo "^9.0.0"
+ imagemin-webp "^7.0.0"
+
+imagemin-gifsicle@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz#1a7ab136a144c4678657ba3b6c412f80805d26b0"
+ integrity sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==
+ dependencies:
+ execa "^1.0.0"
+ gifsicle "^5.0.0"
+ is-gif "^3.0.0"
+
+imagemin-mozjpeg@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-9.0.0.tgz#d1af26d0b43d75a41c211051c1910da59d9d2324"
+ integrity sha512-TwOjTzYqCFRgROTWpVSt5UTT0JeCuzF1jswPLKALDd89+PmrJ2PdMMYeDLYZ1fs9cTovI9GJd68mRSnuVt691w==
+ dependencies:
+ execa "^4.0.0"
+ is-jpg "^2.0.0"
+ mozjpeg "^7.0.0"
+
+imagemin-optipng@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-8.0.0.tgz#b88e5cf6da25cc8479e07cdf38c3ae0479df7ef2"
+ integrity sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A==
+ dependencies:
+ exec-buffer "^3.0.0"
+ is-png "^2.0.0"
+ optipng-bin "^7.0.0"
+
+imagemin-pngquant@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-9.0.2.tgz#38155702b0cc4f60f671ba7c2b086ea3805d9567"
+ integrity sha512-cj//bKo8+Frd/DM8l6Pg9pws1pnDUjgb7ae++sUX1kUVdv2nrngPykhiUOgFeE0LGY/LmUbCf4egCHC4YUcZSg==
+ dependencies:
+ execa "^4.0.0"
+ is-png "^2.0.0"
+ is-stream "^2.0.0"
+ ow "^0.17.0"
+ pngquant-bin "^6.0.0"
+
+imagemin-svgo@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-9.0.0.tgz#749370804608917a67d4ff590f07a87756aec006"
+ integrity sha512-uNgXpKHd99C0WODkrJ8OO/3zW3qjgS4pW7hcuII0RcHN3tnKxDjJWcitdVC/TZyfIqSricU8WfrHn26bdSW62g==
+ dependencies:
+ is-svg "^4.2.1"
+ svgo "^2.1.0"
+
+imagemin-webp@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/imagemin-webp/-/imagemin-webp-7.0.0.tgz#df000ec927855d74d4cfafec8558ac418c88d2a9"
+ integrity sha512-JoYjvHNgBLgrQAkeCO7T5iNc8XVpiBmMPZmiXMhalC7K6gwY/3DCEUfNxVPOmNJ+NIJlJFvzcMR9RBxIE74Xxw==
+ dependencies:
+ cwebp-bin "^7.0.1"
+ exec-buffer "^3.2.0"
+ is-cwebp-readable "^3.0.0"
+
+imagemin@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-7.0.1.tgz#f6441ca647197632e23db7d971fffbd530c87dbf"
+ integrity sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==
+ dependencies:
+ file-type "^12.0.0"
+ globby "^10.0.0"
+ graceful-fs "^4.2.2"
+ junk "^3.1.0"
+ make-dir "^3.0.0"
+ p-pipe "^3.0.0"
+ replace-ext "^1.0.0"
+
immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
@@ -9523,6 +10169,11 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
parent-module "^1.0.0"
resolve-from "^4.0.0"
+import-lazy@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc"
+ integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==
+
import-local@^3.0.2:
version "3.1.0"
resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz"
@@ -9629,6 +10280,14 @@ interpret@^2.2.0:
resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+into-stream@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+ integrity sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==
+ dependencies:
+ from2 "^2.1.1"
+ p-is-promise "^1.1.0"
+
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
@@ -9757,6 +10416,13 @@ is-core-module@^2.13.0:
dependencies:
has "^1.0.3"
+is-cwebp-readable@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-cwebp-readable/-/is-cwebp-readable-3.0.0.tgz#0554aaa400977a2fc4de366d8c0244f13cde58cb"
+ integrity sha512-bpELc7/Q1/U5MWHn4NdHI44R3jxk0h9ew9ljzabiRl70/UIjL/ZAqRMb52F5+eke/VC8yTiv4Ewryo1fPWidvA==
+ dependencies:
+ file-type "^10.5.0"
+
is-date-object@^1.0.1, is-date-object@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz"
@@ -9811,6 +10477,13 @@ is-generator-function@^1.0.7:
dependencies:
has-tostringtag "^1.0.0"
+is-gif@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-3.0.0.tgz#c4be60b26a301d695bb833b20d9b5d66c6cf83b1"
+ integrity sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==
+ dependencies:
+ file-type "^10.4.0"
+
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
@@ -9833,11 +10506,21 @@ is-interactive@^1.0.0:
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+is-jpg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97"
+ integrity sha512-ODlO0ruzhkzD3sdynIainVP5eoOFNN85rxA1+cwwnPe4dKyX0r5+hxNO5XpCrxlHcmb9vkOit9mhRD2JVuimHg==
+
is-map@^2.0.1, is-map@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz"
integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+is-natural-number@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
+ integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==
+
is-negative-zero@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz"
@@ -9870,7 +10553,12 @@ is-obj@^2.0.0:
resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
-is-plain-obj@^1.1.0:
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
@@ -9892,6 +10580,11 @@ is-plain-object@^5.0.0:
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+is-png@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d"
+ integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==
+
is-potential-custom-element-name@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz"
@@ -9912,6 +10605,11 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
+is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+ integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
is-set@^2.0.1, is-set@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz"
@@ -9924,6 +10622,11 @@ is-shared-array-buffer@^1.0.2:
dependencies:
call-bind "^1.0.2"
+is-stream@^1.0.0, is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==
+
is-stream@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz"
@@ -9936,6 +10639,13 @@ is-string@^1.0.5, is-string@^1.0.7:
dependencies:
has-tostringtag "^1.0.0"
+is-svg@^4.2.1:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-4.4.0.tgz#34db20a38146be5f2b3060154da33d11e6f74b7c"
+ integrity sha512-v+AgVwiK5DsGtT9ng+m4mClp6zDAmwrW8nZi6Gg15qzvBnRWWdfWA1TGaXyCDnWq5g5asofIgMVl3PjKxvk1ug==
+ dependencies:
+ fast-xml-parser "^4.1.3"
+
is-symbol@^1.0.2, is-symbol@^1.0.3:
version "1.0.4"
resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz"
@@ -10077,6 +10787,14 @@ istanbul-reports@^3.1.3:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
+isurl@^1.0.0-alpha5:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+ integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+ dependencies:
+ has-to-string-tag-x "^1.2.0"
+ is-object "^1.0.1"
+
jerrypick@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.1.tgz"
@@ -10668,6 +11386,11 @@ jsesc@~0.5.0:
resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==
+
json-parse-better-errors@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
@@ -10749,6 +11472,11 @@ jszip@^3.2.2:
readable-stream "~2.3.6"
setimmediate "^1.0.5"
+junk@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
+ integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
+
kapsule@1, kapsule@^1.14:
version "1.14.2"
resolved "https://registry.npmjs.org/kapsule/-/kapsule-1.14.2.tgz"
@@ -10756,6 +11484,13 @@ kapsule@1, kapsule@^1.14:
dependencies:
lodash-es "4"
+keyv@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+ integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==
+ dependencies:
+ json-buffer "3.0.0"
+
kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
@@ -11084,6 +11819,16 @@ lower-case@^2.0.2:
dependencies:
tslib "^2.0.3"
+lowercase-keys@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+ integrity sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==
+
+lowercase-keys@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
lowlight@^1.17.0:
version "1.20.0"
resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888"
@@ -11128,6 +11873,13 @@ magic-string@0.30.8:
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
+make-dir@^1.0.0, make-dir@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+ dependencies:
+ pify "^3.0.0"
+
make-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz"
@@ -11473,7 +12225,7 @@ merge-stream@^2.0.0:
resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.3.0, merge2@^1.4.1:
+merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -11900,6 +12652,11 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+mime-db@^1.28.0:
+ version "1.53.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447"
+ integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==
+
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
@@ -12015,6 +12772,34 @@ moment@^2.29.4:
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
+motion-dom@^12.4.11:
+ version "12.4.11"
+ resolved "https://registry.yarnpkg.com/motion-dom/-/motion-dom-12.4.11.tgz#0419c8686cda4d523f08249deeb8fa6683a9b9d3"
+ integrity sha512-wstlyV3pktgFjqsjbXMo1NX9hQD9XTVqxQNvfc+FREAgxr3GVzgWIEKvbyyNlki3J1jmmh+et9X3aCKeqFPcxA==
+ dependencies:
+ motion-utils "^12.4.10"
+
+motion-utils@^12.4.10:
+ version "12.4.10"
+ resolved "https://registry.yarnpkg.com/motion-utils/-/motion-utils-12.4.10.tgz#3d93acea5454419eaaad8d5e5425cb71cbfa1e7f"
+ integrity sha512-NPwZd94V013SwRf++jMrk2+HEBgPkeIE2RiOzhAuuQlqxMJPkKt/LXVh6Upl+iN8oarSGD2dlY5/bqgsYXDABA==
+
+motion@12.4.13:
+ version "12.4.13"
+ resolved "https://registry.yarnpkg.com/motion/-/motion-12.4.13.tgz#4c9f990ca0eace167c0bd76034a199e82ba9c676"
+ integrity sha512-8ehpE6Sd8ack6jLLzweW6RwCBQoASf+yVu8aUPFNKHsJIVejJaBPGsMiswcpfzHeCusZ/ztNIKbgoEn7ruJaOw==
+ dependencies:
+ framer-motion "^12.4.13"
+ tslib "^2.4.0"
+
+mozjpeg@^7.0.0:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-7.1.1.tgz#dfb61953536e66fcabd4ae795e7a312d42a51f18"
+ integrity sha512-iIDxWvzhWvLC9mcRJ1uSkiKaj4drF58oCqK2bITm5c2Jt6cJ8qQjSSru2PCaysG+hLIinryj8mgz5ZJzOYTv1A==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+
mri@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
@@ -12255,6 +13040,15 @@ normalize-range@^0.1.2:
resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz"
integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
+normalize-url@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+ integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==
+ dependencies:
+ prepend-http "^2.0.0"
+ query-string "^5.0.1"
+ sort-keys "^2.0.0"
+
nosleep.js@^0.7.0:
version "0.7.0"
resolved "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.7.0.tgz"
@@ -12265,6 +13059,14 @@ not@^0.1.0:
resolved "https://registry.yarnpkg.com/not/-/not-0.1.0.tgz#c9691c1746c55dcfbe54cbd8bd4ff041bc2b519d"
integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==
+npm-conf@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
+ integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
+ dependencies:
+ config-chain "^1.1.11"
+ pify "^3.0.0"
+
npm-run-all@latest:
version "4.1.5"
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
@@ -12280,7 +13082,14 @@ npm-run-all@latest:
shell-quote "^1.6.1"
string.prototype.padend "^3.0.0"
-npm-run-path@^4.0.1:
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==
+ dependencies:
+ path-key "^2.0.0"
+
+npm-run-path@^4.0.0, npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
@@ -12435,7 +13244,7 @@ on-headers@~1.0.2:
resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz"
integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
-once@^1.3.0, once@^1.3.1:
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
@@ -12494,6 +13303,14 @@ optionator@^0.9.1:
type-check "^0.4.0"
word-wrap "^1.2.3"
+optipng-bin@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-7.0.1.tgz#beb8e55a52f8a26f885ee57ab44fcf62397d6972"
+ integrity sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.0"
+
ora@^5.4.1:
version "5.4.1"
resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
@@ -12509,6 +13326,13 @@ ora@^5.4.1:
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
+os-filter-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16"
+ integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==
+ dependencies:
+ arch "^2.1.0"
+
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@@ -12529,6 +13353,47 @@ overlayscrollbars@^2.8.1:
resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-2.9.2.tgz#056020a3811742b58b754fab6f775d49bd109be9"
integrity sha512-iDT84r39i7oWP72diZN2mbJUsn/taCq568aQaIrc84S87PunBT7qtsVltAF2esk7ORTRjQDnfjVYoqqTzgs8QA==
+ow@^0.17.0:
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/ow/-/ow-0.17.0.tgz#4f938999fed6264c9048cd6254356e0f1e7f688c"
+ integrity sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==
+ dependencies:
+ type-fest "^0.11.0"
+
+p-cancelable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+ integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
+ integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==
+
+p-event@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085"
+ integrity sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==
+ dependencies:
+ p-timeout "^1.1.1"
+
+p-event@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6"
+ integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==
+ dependencies:
+ p-timeout "^2.0.1"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
+
+p-is-promise@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+ integrity sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==
+
p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
@@ -12571,6 +13436,13 @@ p-locate@^6.0.0:
dependencies:
p-limit "^4.0.0"
+p-map-series@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
+ integrity sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==
+ dependencies:
+ p-reduce "^1.0.0"
+
p-map@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz"
@@ -12578,6 +13450,16 @@ p-map@^4.0.0:
dependencies:
aggregate-error "^3.0.0"
+p-pipe@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e"
+ integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==
+
+p-reduce@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+ integrity sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==
+
p-retry@^4.5.0:
version "4.6.2"
resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz"
@@ -12586,6 +13468,20 @@ p-retry@^4.5.0:
"@types/retry" "0.12.0"
retry "^0.13.1"
+p-timeout@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+ integrity sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==
+ dependencies:
+ p-finally "^1.0.0"
+
+p-timeout@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+ integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==
+ dependencies:
+ p-finally "^1.0.0"
+
p-try@^2.0.0:
version "2.2.0"
resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
@@ -12745,6 +13641,11 @@ path-is-absolute@^1.0.0:
resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
+
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
@@ -12800,6 +13701,11 @@ pbf@3.2.1:
ieee754 "^1.1.12"
resolve-protobuf-schema "^2.1.0"
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
+
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -12841,6 +13747,11 @@ pidtree@^0.5.0:
resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz"
integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==
+pify@^2.2.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
@@ -12851,6 +13762,18 @@ pify@^4.0.1:
resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==
+
pirates@^4.0.4:
version "4.0.5"
resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz"
@@ -12875,6 +13798,15 @@ playwright-core@1.33.0:
resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.33.0.tgz"
integrity sha512-aizyPE1Cj62vAECdph1iaMILpT0WUDCq3E6rW6I+dleSbBoGbktvJtzS6VHkZ4DKNEOG9qJpiom/ZxO+S15LAw==
+pngquant-bin@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-6.0.1.tgz#2b5789ca219eeb4d8509ab1ae082092801b7f07e"
+ integrity sha512-Q3PUyolfktf+hYio6wsg3SanQzEU/v8aICg/WpzxXcuCMRb7H2Q81okfpcEztbMvw25ILjd3a87doj2N9kvbpQ==
+ dependencies:
+ bin-build "^3.0.0"
+ bin-wrapper "^4.0.1"
+ execa "^4.0.0"
+
polished@4:
version "4.2.2"
resolved "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz"
@@ -13186,6 +14118,16 @@ prelude-ls@~1.1.2:
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
+prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==
+
present@0.0.6:
version "0.0.6"
resolved "https://registry.npmjs.org/present/-/present-0.0.6.tgz"
@@ -13298,6 +14240,11 @@ property-information@^6.0.0:
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3"
integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+ integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
+
protocol-buffers-schema@^3.3.1:
version "3.6.0"
resolved "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz"
@@ -13326,6 +14273,14 @@ psl@^1.1.33:
resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+pump@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+ integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
punycode@^2.1.0, punycode@^2.1.1:
version "2.3.0"
resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz"
@@ -14220,7 +15175,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stre
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-readable-stream@^2.0.1, readable-stream@~2.3.6:
+readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6:
version "2.3.8"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
@@ -14548,6 +15503,11 @@ renderkid@^3.0.0:
lodash "^4.17.21"
strip-ansi "^6.0.1"
+replace-ext@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a"
+ integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==
+
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
@@ -14632,6 +15592,13 @@ resolve@^2.0.0-next.4:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
+responselike@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==
+ dependencies:
+ lowercase-keys "^1.0.0"
+
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
@@ -14662,6 +15629,13 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
+rimraf@^2.5.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
robust-predicates@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771"
@@ -14720,7 +15694,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
+safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -14774,7 +15748,7 @@ scheduler@^0.23.0:
dependencies:
loose-envify "^1.1.0"
-schema-utils@^2.7.0:
+schema-utils@^2.7.0, schema-utils@^2.7.1:
version "2.7.1"
resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz"
integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
@@ -14814,6 +15788,13 @@ scroll-into-view-if-needed@^3.1.0:
dependencies:
compute-scroll-into-view "^3.0.2"
+seek-bzip@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4"
+ integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==
+ dependencies:
+ commander "^2.8.1"
+
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
@@ -14826,7 +15807,19 @@ selfsigned@^2.1.1:
dependencies:
node-forge "^1"
-"semver@2 || 3 || 4 || 5", semver@7.3.7, semver@7.5.4, semver@7.x, semver@^5.6.0, semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7:
+semver-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
+ integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
+
+semver-truncate@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
+ integrity sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==
+ dependencies:
+ semver "^5.3.0"
+
+"semver@2 || 3 || 4 || 5", semver@7.3.7, semver@7.5.4, semver@7.x, semver@^5.3.0, semver@^5.6.0, semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7:
version "7.5.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
@@ -14974,7 +15967,7 @@ side-channel@^1.0.6:
get-intrinsic "^1.2.4"
object-inspect "^1.13.1"
-signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
+signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
@@ -15064,6 +16057,27 @@ sort-desc@^0.1.1:
resolved "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz"
integrity sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==
+sort-keys-length@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
+ integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==
+ dependencies:
+ sort-keys "^1.0.0"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+sort-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+ integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==
+ dependencies:
+ is-plain-obj "^1.0.0"
+
sort-object@^0.3.2:
version "0.3.2"
resolved "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz"
@@ -15186,6 +16200,11 @@ sprintf-js@~1.0.2:
resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
stack-generator@^2.0.5:
version "2.0.10"
resolved "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz"
@@ -15405,6 +16424,18 @@ strip-bom@^4.0.0:
resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz"
integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+strip-dirs@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
+ integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
+ dependencies:
+ is-natural-number "^4.0.1"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==
+
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
@@ -15422,6 +16453,18 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+strip-outer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
+ integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
+ dependencies:
+ escape-string-regexp "^1.0.2"
+
+strnum@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4"
+ integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==
+
style-loader@1.3.0:
version "1.3.0"
resolved "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz"
@@ -15546,6 +16589,19 @@ svg-path-properties@^1.0.4:
resolved "https://registry.yarnpkg.com/svg-path-properties/-/svg-path-properties-1.3.0.tgz#7f47e61dcac380c9f4d04f642df7e69b127274fa"
integrity sha512-R1+z37FrqyS3UXDhajNfvMxKI0smuVdedqOo4YbAQUfGqA86B9mGvr2IEXrwjjvGzCtdIKy/ad9N8m6YclaKAw==
+svgo@^2.1.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"
+ integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
+ dependencies:
+ "@trysound/sax" "0.2.0"
+ commander "^7.2.0"
+ css-select "^4.1.3"
+ css-tree "^1.1.3"
+ csso "^4.2.0"
+ picocolors "^1.0.0"
+ stable "^0.1.8"
+
svgo@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.0.2.tgz#5e99eeea42c68ee0dc46aa16da093838c262fe0a"
@@ -15584,6 +16640,32 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0:
resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+tar-stream@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
+ integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
+ dependencies:
+ bl "^1.0.0"
+ buffer-alloc "^1.2.0"
+ end-of-stream "^1.0.0"
+ fs-constants "^1.0.0"
+ readable-stream "^2.3.0"
+ to-buffer "^1.1.1"
+ xtend "^4.0.0"
+
+temp-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+ integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==
+
+tempfile@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
+ integrity sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==
+ dependencies:
+ temp-dir "^1.0.0"
+ uuid "^3.0.1"
+
terminal-link@^2.0.0:
version "2.1.1"
resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz"
@@ -15728,7 +16810,7 @@ thunky@^1.0.2:
resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz"
integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
-timed-out@^4.0.1:
+timed-out@^4.0.0, timed-out@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz"
integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==
@@ -15765,6 +16847,11 @@ tmpl@1.0.5:
resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz"
integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+to-buffer@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+ integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
@@ -15831,6 +16918,13 @@ trim-newlines@^3.0.0:
resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz"
integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
+trim-repeated@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
+ integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==
+ dependencies:
+ escape-string-regexp "^1.0.2"
+
trough@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876"
@@ -15922,6 +17016,11 @@ tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0:
resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz"
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
+tslib@^2.4.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz"
@@ -15929,6 +17028,13 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+ dependencies:
+ safe-buffer "^5.0.1"
+
tween-functions@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/tween-functions/-/tween-functions-1.2.0.tgz#1ae3a50e7c60bb3def774eac707acbca73bbc3ff"
@@ -15965,6 +17071,11 @@ type-detect@4.0.8:
resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+type-fest@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
+ integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
+
type-fest@^0.18.0:
version "0.18.1"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz"
@@ -16086,6 +17197,14 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
+unbzip2-stream@^1.0.9:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
+ integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
+ dependencies:
+ buffer "^5.2.1"
+ through "^2.3.8"
+
unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz"
@@ -16280,6 +17399,20 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ integrity sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==
+ dependencies:
+ prepend-http "^2.0.0"
+
url-parse@^1.5.3:
version "1.5.10"
resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz"
@@ -16293,6 +17426,11 @@ url-set-query@^1.0.0:
resolved "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz"
integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==
+url-to-options@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+ integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==
+
use-isomorphic-layout-effect@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz"
@@ -16334,6 +17472,11 @@ utils-merge@1.0.1:
resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+uuid@^3.0.1:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
@@ -17024,6 +18167,14 @@ yargs@^17.0.0, yargs@^17.3.1:
y18n "^5.0.5"
yargs-parser "^21.1.1"
+yauzl@^2.4.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"
+
yn@3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"