Added metrics bar and date range to sessions.

This commit is contained in:
Mike Cao 2024-08-07 00:10:25 -07:00
parent 36663bd52d
commit b9068c0050
44 changed files with 859 additions and 739 deletions

View File

@ -68,7 +68,7 @@
"@dicebear/collection": "^9.2.1", "@dicebear/collection": "^9.2.1",
"@dicebear/core": "^9.2.1", "@dicebear/core": "^9.2.1",
"@fontsource/inter": "^4.5.15", "@fontsource/inter": "^4.5.15",
"@prisma/client": "5.16.2", "@prisma/client": "5.17.0",
"@prisma/extension-read-replicas": "^0.3.0", "@prisma/extension-read-replicas": "^0.3.0",
"@react-spring/web": "^9.7.3", "@react-spring/web": "^9.7.3",
"@tanstack/react-query": "^5.28.6", "@tanstack/react-query": "^5.28.6",
@ -104,9 +104,9 @@
"next-basics": "^0.39.0", "next-basics": "^0.39.0",
"node-fetch": "^3.2.8", "node-fetch": "^3.2.8",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"prisma": "5.16.2", "prisma": "5.17.0",
"react": "^18.2.0", "react": "^18.2.0",
"react-basics": "^0.123.0", "react-basics": "^0.124.0",
"react-beautiful-dnd": "^13.1.0", "react-beautiful-dnd": "^13.1.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-error-boundary": "^4.0.4", "react-error-boundary": "^4.0.4",

File diff suppressed because it is too large Load Diff

View File

@ -74,7 +74,7 @@
"label.analytics": [ "label.analytics": [
{ {
"type": 0, "type": 0,
"value": "Analytics" "value": "Analysen"
} }
], ],
"label.average": [ "label.average": [
@ -152,7 +152,7 @@
"label.compare": [ "label.compare": [
{ {
"type": 0, "type": 0,
"value": "Vergleich" "value": "Vergleichen"
} }
], ],
"label.confirm": [ "label.confirm": [
@ -368,7 +368,7 @@
"label.dropoff": [ "label.dropoff": [
{ {
"type": 0, "type": 0,
"value": "Dropoff" "value": "Absprung"
} }
], ],
"label.edit": [ "label.edit": [
@ -398,13 +398,13 @@
"label.end-step": [ "label.end-step": [
{ {
"type": 0, "type": 0,
"value": "Schritt beenden" "value": "Schlussschritt"
} }
], ],
"label.entry": [ "label.entry": [
{ {
"type": 0, "type": 0,
"value": "Entry URL" "value": "Eintrags-URL"
} }
], ],
"label.event": [ "label.event": [
@ -428,7 +428,7 @@
"label.exit": [ "label.exit": [
{ {
"type": 0, "type": 0,
"value": "Exit URL" "value": "Ausgangs-URL"
} }
], ],
"label.false": [ "label.false": [
@ -482,7 +482,7 @@
"label.funnel-description": [ "label.funnel-description": [
{ {
"type": 0, "type": 0,
"value": "Verstehe die Konversions- und Dropoffrate von Nutzern." "value": "Verstehe die Konversions- und Abbruchrate der Nutzer."
} }
], ],
"label.goal": [ "label.goal": [
@ -500,7 +500,7 @@
"label.goals-description": [ "label.goals-description": [
{ {
"type": 0, "type": 0,
"value": "Verfolgen Sie Ihre Ziele für Aufrufe und Events." "value": "Verfolgen Sie Ihre Ziele für Seitenaufrufe und Ereignisse."
} }
], ],
"label.greater-than": [ "label.greater-than": [
@ -530,13 +530,13 @@
"label.insights": [ "label.insights": [
{ {
"type": 0, "type": 0,
"value": "Insights" "value": "Einblicke"
} }
], ],
"label.insights-description": [ "label.insights-description": [
{ {
"type": 0, "type": 0,
"value": "Tauchen Sie tiefer in Ihre Daten mit Filtern und Segmenten ein." "value": "Vertiefen Sie Ihre Daten mit Hilfe von Segmenten und Filtern."
} }
], ],
"label.is": [ "label.is": [
@ -578,13 +578,13 @@
"label.journey": [ "label.journey": [
{ {
"type": 0, "type": 0,
"value": "Journey" "value": "Reise"
} }
], ],
"label.journey-description": [ "label.journey-description": [
{ {
"type": 0, "type": 0,
"value": "Verstehen Sie, wie Nutzer Ihre Website navigieren." "value": "Verstehe, wie Nutzer auf der Webseite navigieren"
} }
], ],
"label.language": [ "label.language": [
@ -608,7 +608,7 @@
"label.last-days": [ "label.last-days": [
{ {
"type": 0, "type": 0,
"value": "Letzte " "value": "Letzten "
}, },
{ {
"type": 1, "type": 1,
@ -622,7 +622,7 @@
"label.last-hours": [ "label.last-hours": [
{ {
"type": 0, "type": 0,
"value": "Letzte " "value": "Letzten "
}, },
{ {
"type": 1, "type": 1,
@ -636,7 +636,7 @@
"label.last-months": [ "label.last-months": [
{ {
"type": 0, "type": 0,
"value": "Last " "value": "Letzten "
}, },
{ {
"type": 1, "type": 1,
@ -644,7 +644,7 @@
}, },
{ {
"type": 0, "type": 0,
"value": " months" "value": " Monate"
} }
], ],
"label.leave": [ "label.leave": [
@ -692,7 +692,7 @@
"label.manager": [ "label.manager": [
{ {
"type": 0, "type": 0,
"value": "Manager" "value": "Verwaltung"
} }
], ],
"label.max": [ "label.max": [
@ -734,13 +734,13 @@
"label.my-account": [ "label.my-account": [
{ {
"type": 0, "type": 0,
"value": "Mein Konto" "value": "Mein Account"
} }
], ],
"label.my-websites": [ "label.my-websites": [
{ {
"type": 0, "type": 0,
"value": "Meine Websites" "value": "Meine Webseiten"
} }
], ],
"label.name": [ "label.name": [
@ -874,13 +874,13 @@
"label.previous": [ "label.previous": [
{ {
"type": 0, "type": 0,
"value": "Vorherige" "value": "Vorheriges"
} }
], ],
"label.previous-period": [ "label.previous-period": [
{ {
"type": 0, "type": 0,
"value": "Vorheriger Zeitraum" "value": "Vorherige Periode"
} }
], ],
"label.previous-year": [ "label.previous-year": [
@ -898,7 +898,7 @@
"label.property": [ "label.property": [
{ {
"type": 0, "type": 0,
"value": "Besitz" "value": "Eigentum"
} }
], ],
"label.queries": [ "label.queries": [
@ -1000,13 +1000,13 @@
"label.retention": [ "label.retention": [
{ {
"type": 0, "type": 0,
"value": "Retention" "value": "Bewahrung"
} }
], ],
"label.retention-description": [ "label.retention-description": [
{ {
"type": 0, "type": 0,
"value": "Messen Sie die Presenz Ihrer Website, indem Sie tracken wie oft Nutzer zurückkehren." "value": "Messen Sie die Verweildauer auf Ihrer Website, indem Sie verfolgen, wie oft die Nutzer zurückkehren."
} }
], ],
"label.role": [ "label.role": [
@ -1060,7 +1060,7 @@
"label.select-website": [ "label.select-website": [
{ {
"type": 0, "type": 0,
"value": "Website auswählen" "value": "Webseite auswählen"
} }
], ],
"label.sessions": [ "label.sessions": [
@ -1090,7 +1090,7 @@
"label.start-step": [ "label.start-step": [
{ {
"type": 0, "type": 0,
"value": "Schritt starten" "value": "Startschritt"
} }
], ],
"label.steps": [ "label.steps": [
@ -1150,7 +1150,7 @@
"label.team-view-only": [ "label.team-view-only": [
{ {
"type": 0, "type": 0,
"value": "Team view only" "value": "Nur für Team sichtbar"
} }
], ],
"label.team-websites": [ "label.team-websites": [
@ -1324,7 +1324,7 @@
"label.utm-description": [ "label.utm-description": [
{ {
"type": 0, "type": 0,
"value": "Tracken Sie Ihre Kampagnen mit Hilfe von UTM Parametern." "value": "Tracke deine Kampagnen mit UTM parameterns."
} }
], ],
"label.value": [ "label.value": [
@ -1384,19 +1384,19 @@
"label.website": [ "label.website": [
{ {
"type": 0, "type": 0,
"value": "Website" "value": "Webseite"
} }
], ],
"label.website-id": [ "label.website-id": [
{ {
"type": 0, "type": 0,
"value": "Website ID" "value": "Webseiten-ID"
} }
], ],
"label.websites": [ "label.websites": [
{ {
"type": 0, "type": 0,
"value": "Websites" "value": "Webseiten"
} }
], ],
"label.window": [ "label.window": [
@ -1414,7 +1414,7 @@
"message.action-confirmation": [ "message.action-confirmation": [
{ {
"type": 0, "type": 0,
"value": "Tippen Sie " "value": "Schreibe "
}, },
{ {
"type": 1, "type": 1,
@ -1422,7 +1422,7 @@
}, },
{ {
"type": 0, "type": 0,
"value": " in das untenliegende Feld, um zu bestätigen." "value": " in die Box zur bestätigung."
} }
], ],
"message.active-users": [ "message.active-users": [
@ -1496,7 +1496,7 @@
"message.confirm-remove": [ "message.confirm-remove": [
{ {
"type": 0, "type": 0,
"value": "Sind Sie sicher, dass Sie " "value": "Sind Sie sicher, "
}, },
{ {
"type": 1, "type": 1,
@ -1504,7 +1504,7 @@
}, },
{ {
"type": 0, "type": 0,
"value": " entfernen möchten?" "value": " zu entfernen?"
} }
], ],
"message.confirm-reset": [ "message.confirm-reset": [
@ -1524,7 +1524,7 @@
"message.delete-team-warning": [ "message.delete-team-warning": [
{ {
"type": 0, "type": 0,
"value": "Alle zugehörigen Websiten werden ebenfalls gelöscht." "value": "Ein Team zu löschen, wird auch alle Team-Webseiten löschen."
} }
], ],
"message.delete-website-warning": [ "message.delete-website-warning": [
@ -1708,25 +1708,25 @@
"message.transfer-team-website-to-user": [ "message.transfer-team-website-to-user": [
{ {
"type": 0, "type": 0,
"value": "Möchten Sie diese Website auf Ihr Konto übertragen?" "value": "Diese Webseite zu deinem Account transferieren?"
} }
], ],
"message.transfer-user-website-to-team": [ "message.transfer-user-website-to-team": [
{ {
"type": 0, "type": 0,
"value": "Wählen Sie das Team, auf das die Website übertragen wird." "value": "Wähle ein Team aus, zu dem die Webseite transferiert werden soll."
} }
], ],
"message.transfer-website": [ "message.transfer-website": [
{ {
"type": 0, "type": 0,
"value": "Übertragen Sie den Besitz der Website auf Ihren Account oder ein anderes Team." "value": "Übertrage die Eigentümerrechte zu deinem Account oder einem anderen Team."
} }
], ],
"message.triggered-event": [ "message.triggered-event": [
{ {
"type": 0, "type": 0,
"value": "Event ausgelöst" "value": "Ausgelöstes Event"
} }
], ],
"message.user-deleted": [ "message.user-deleted": [
@ -1738,7 +1738,7 @@
"message.viewed-page": [ "message.viewed-page": [
{ {
"type": 0, "type": 0,
"value": "Seite besucht" "value": "Besuchte Seite"
} }
], ],
"message.visitor-log": [ "message.visitor-log": [
@ -1778,7 +1778,7 @@
"message.visitors-dropped-off": [ "message.visitors-dropped-off": [
{ {
"type": 0, "type": 0,
"value": "Besucher haben die Seite verlassen" "value": "Besucherverlust"
} }
] ]
} }

View File

@ -38,7 +38,7 @@
"label.add-step": [ "label.add-step": [
{ {
"type": 0, "type": 0,
"value": "Add step" "value": "Añadir paso"
} }
], ],
"label.add-website": [ "label.add-website": [
@ -152,7 +152,7 @@
"label.compare": [ "label.compare": [
{ {
"type": 0, "type": 0,
"value": "Compare" "value": "Comparar"
} }
], ],
"label.confirm": [ "label.confirm": [
@ -182,7 +182,7 @@
"label.count": [ "label.count": [
{ {
"type": 0, "type": 0,
"value": "Count" "value": "Contar"
} }
], ],
"label.countries": [ "label.countries": [
@ -230,13 +230,13 @@
"label.created-by": [ "label.created-by": [
{ {
"type": 0, "type": 0,
"value": "Created By" "value": "Creado por"
} }
], ],
"label.current": [ "label.current": [
{ {
"type": 0, "type": 0,
"value": "Current" "value": "Actual"
} }
], ],
"label.current-password": [ "label.current-password": [
@ -386,7 +386,7 @@
"label.edit-member": [ "label.edit-member": [
{ {
"type": 0, "type": 0,
"value": "Edit member" "value": "Editar miembro"
} }
], ],
"label.enable-share-url": [ "label.enable-share-url": [
@ -398,13 +398,13 @@
"label.end-step": [ "label.end-step": [
{ {
"type": 0, "type": 0,
"value": "End Step" "value": "Paso final"
} }
], ],
"label.entry": [ "label.entry": [
{ {
"type": 0, "type": 0,
"value": "Entry URL" "value": "URL de entrada"
} }
], ],
"label.event": [ "label.event": [
@ -428,7 +428,7 @@
"label.exit": [ "label.exit": [
{ {
"type": 0, "type": 0,
"value": "Exit URL" "value": "URL de salida"
} }
], ],
"label.false": [ "label.false": [
@ -476,7 +476,7 @@
"label.funnel": [ "label.funnel": [
{ {
"type": 0, "type": 0,
"value": "Funnel" "value": "Embudo"
} }
], ],
"label.funnel-description": [ "label.funnel-description": [
@ -488,19 +488,19 @@
"label.goal": [ "label.goal": [
{ {
"type": 0, "type": 0,
"value": "Goal" "value": "Objetivo"
} }
], ],
"label.goals": [ "label.goals": [
{ {
"type": 0, "type": 0,
"value": "Goals" "value": "Objetivos"
} }
], ],
"label.goals-description": [ "label.goals-description": [
{ {
"type": 0, "type": 0,
"value": "Track your goals for pageviews and events." "value": "Realice un seguimiento de sus objetivos de páginas vistas y eventos."
} }
], ],
"label.greater-than": [ "label.greater-than": [
@ -578,13 +578,13 @@
"label.journey": [ "label.journey": [
{ {
"type": 0, "type": 0,
"value": "Journey" "value": "Viaje"
} }
], ],
"label.journey-description": [ "label.journey-description": [
{ {
"type": 0, "type": 0,
"value": "Understand how users navigate through your website." "value": "Comprenda cómo los usuarios navegan por su sitio web."
} }
], ],
"label.language": [ "label.language": [
@ -636,7 +636,7 @@
"label.last-months": [ "label.last-months": [
{ {
"type": 0, "type": 0,
"value": "Last " "value": "Últimos "
}, },
{ {
"type": 1, "type": 1,
@ -644,7 +644,7 @@
}, },
{ {
"type": 0, "type": 0,
"value": " months" "value": " meses"
} }
], ],
"label.leave": [ "label.leave": [
@ -698,7 +698,7 @@
"label.max": [ "label.max": [
{ {
"type": 0, "type": 0,
"value": "Máx" "value": "Max"
} }
], ],
"label.member": [ "label.member": [
@ -716,7 +716,7 @@
"label.min": [ "label.min": [
{ {
"type": 0, "type": 0,
"value": "Mín" "value": "Min"
} }
], ],
"label.mobile": [ "label.mobile": [
@ -874,19 +874,19 @@
"label.previous": [ "label.previous": [
{ {
"type": 0, "type": 0,
"value": "Previous" "value": "Anterior"
} }
], ],
"label.previous-period": [ "label.previous-period": [
{ {
"type": 0, "type": 0,
"value": "Previous period" "value": "Periodo anterior"
} }
], ],
"label.previous-year": [ "label.previous-year": [
{ {
"type": 0, "type": 0,
"value": "Previous year" "value": "Año anterior"
} }
], ],
"label.profile": [ "label.profile": [
@ -898,7 +898,7 @@
"label.property": [ "label.property": [
{ {
"type": 0, "type": 0,
"value": "Property" "value": "Propiedad"
} }
], ],
"label.queries": [ "label.queries": [
@ -952,7 +952,7 @@
"label.region": [ "label.region": [
{ {
"type": 0, "type": 0,
"value": "Region" "value": "Región"
} }
], ],
"label.regions": [ "label.regions": [
@ -1042,7 +1042,7 @@
"label.select": [ "label.select": [
{ {
"type": 0, "type": 0,
"value": "Select" "value": "Seleccionar"
} }
], ],
"label.select-date": [ "label.select-date": [
@ -1090,13 +1090,13 @@
"label.start-step": [ "label.start-step": [
{ {
"type": 0, "type": 0,
"value": "Start Step" "value": "Paso inical"
} }
], ],
"label.steps": [ "label.steps": [
{ {
"type": 0, "type": 0,
"value": "Steps" "value": "Pasos"
} }
], ],
"label.sum": [ "label.sum": [
@ -1126,7 +1126,7 @@
"label.team-manager": [ "label.team-manager": [
{ {
"type": 0, "type": 0,
"value": "Team manager" "value": "Jefe de equipo"
} }
], ],
"label.team-member": [ "label.team-member": [
@ -1282,7 +1282,7 @@
"label.update": [ "label.update": [
{ {
"type": 0, "type": 0,
"value": "Update" "value": "Actualizar"
} }
], ],
"label.url": [ "label.url": [
@ -1324,7 +1324,7 @@
"label.utm-description": [ "label.utm-description": [
{ {
"type": 0, "type": 0,
"value": "Track your campaigns through UTM parameters." "value": "Realice un seguimiento de sus campañas a través de parámetros UTM."
} }
], ],
"label.value": [ "label.value": [
@ -1360,7 +1360,7 @@
"label.views-per-visit": [ "label.views-per-visit": [
{ {
"type": 0, "type": 0,
"value": "Views per visit" "value": "Vistas por visita"
} }
], ],
"label.visit-duration": [ "label.visit-duration": [
@ -1378,7 +1378,7 @@
"label.visits": [ "label.visits": [
{ {
"type": 0, "type": 0,
"value": "Visits" "value": "Visitas"
} }
], ],
"label.website": [ "label.website": [
@ -1462,7 +1462,7 @@
"message.collected-data": [ "message.collected-data": [
{ {
"type": 0, "type": 0,
"value": "Collected data" "value": "Datos obtenidos"
} }
], ],
"message.confirm-delete": [ "message.confirm-delete": [
@ -1726,7 +1726,7 @@
"message.transfer-user-website-to-team": [ "message.transfer-user-website-to-team": [
{ {
"type": 0, "type": 0,
"value": "Select the team to transfer this website to." "value": "Seleccione el equipo al que transferir este sitio web."
} }
], ],
"message.transfer-website": [ "message.transfer-website": [

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
import { GridColumn, GridTable, Icon, Icons, Text, useBreakpoint } from 'react-basics'; import { GridColumn, GridTable, Icon, Icons, Text } from 'react-basics';
import LinkButton from 'components/common/LinkButton'; import LinkButton from 'components/common/LinkButton';
import { useMessages, useLogin, useTeamUrl } from 'components/hooks'; import { useMessages, useLogin, useTeamUrl } from 'components/hooks';
import { REPORT_TYPES } from 'lib/constants'; import { REPORT_TYPES } from 'lib/constants';
@ -7,11 +7,10 @@ import ReportDeleteButton from './ReportDeleteButton';
export function ReportsTable({ data = [], showDomain }: { data: any[]; showDomain?: boolean }) { export function ReportsTable({ data = [], showDomain }: { data: any[]; showDomain?: boolean }) {
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { user } = useLogin(); const { user } = useLogin();
const breakpoint = useBreakpoint();
const { renderTeamUrl } = useTeamUrl(); const { renderTeamUrl } = useTeamUrl();
return ( return (
<GridTable data={data} cardMode={['xs', 'sm', 'md'].includes(breakpoint)}> <GridTable data={data}>
<GridColumn name="name" label={formatMessage(labels.name)} /> <GridColumn name="name" label={formatMessage(labels.name)} />
<GridColumn name="description" label={formatMessage(labels.description)} /> <GridColumn name="description" label={formatMessage(labels.description)} />
<GridColumn name="type" label={formatMessage(labels.type)}> <GridColumn name="type" label={formatMessage(labels.type)}>

View File

@ -4,6 +4,7 @@ import Magnet from 'assets/magnet.svg';
import Path from 'assets/path.svg'; import Path from 'assets/path.svg';
import Tag from 'assets/tag.svg'; import Tag from 'assets/tag.svg';
import Target from 'assets/target.svg'; import Target from 'assets/target.svg';
import Money from 'assets/money.svg';
import { useMessages, useTeamUrl } from 'components/hooks'; import { useMessages, useTeamUrl } from 'components/hooks';
import PageHeader from 'components/layout/PageHeader'; import PageHeader from 'components/layout/PageHeader';
import Link from 'next/link'; import Link from 'next/link';
@ -51,12 +52,12 @@ export function ReportTemplates({ showHeader = true }: { showHeader?: boolean })
url: renderTeamUrl('/reports/journey'), url: renderTeamUrl('/reports/journey'),
icon: <Path />, icon: <Path />,
}, },
// { {
// title: formatMessage(labels.revenue), title: formatMessage(labels.revenue),
// description: formatMessage(labels.revenueDescription), description: formatMessage(labels.revenueDescription),
// url: renderTeamUrl('/reports/revenue'), url: renderTeamUrl('/reports/revenue'),
// icon: <Path />, icon: <Money />,
// }, },
]; ];
return ( return (

View File

@ -4,7 +4,7 @@ import Report from '../[reportId]/Report';
import ReportHeader from '../[reportId]/ReportHeader'; import ReportHeader from '../[reportId]/ReportHeader';
import ReportMenu from '../[reportId]/ReportMenu'; import ReportMenu from '../[reportId]/ReportMenu';
import ReportBody from '../[reportId]/ReportBody'; import ReportBody from '../[reportId]/ReportBody';
import Target from 'assets/target.svg'; import Money from 'assets/money.svg';
import { REPORT_TYPES } from 'lib/constants'; import { REPORT_TYPES } from 'lib/constants';
const defaultParameters = { const defaultParameters = {
@ -15,12 +15,12 @@ const defaultParameters = {
export default function RevenueReport({ reportId }: { reportId?: string }) { export default function RevenueReport({ reportId }: { reportId?: string }) {
return ( return (
<Report reportId={reportId} defaultParameters={defaultParameters}> <Report reportId={reportId} defaultParameters={defaultParameters}>
<ReportHeader icon={<Target />} /> <ReportHeader icon={<Money />} />
<ReportMenu> <ReportMenu>
<RevenueParameters /> <RevenueParameters />
</ReportMenu> </ReportMenu>
<ReportBody> <ReportBody>
<RevenueChart /> <RevenueChart unit="day" />
</ReportBody> </ReportBody>
</Report> </Report>
); );

View File

@ -1,4 +1,4 @@
import { GridColumn, GridTable, Icon, Text, useBreakpoint } from 'react-basics'; import { GridColumn, GridTable, Icon, Text } from 'react-basics';
import { useMessages } from 'components/hooks'; import { useMessages } from 'components/hooks';
import Icons from 'components/icons'; import Icons from 'components/icons';
import { ROLES } from 'lib/constants'; import { ROLES } from 'lib/constants';
@ -13,10 +13,9 @@ export function TeamsTable({
showActions?: boolean; showActions?: boolean;
}) { }) {
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const breakpoint = useBreakpoint();
return ( return (
<GridTable data={data} cardMode={['xs', 'sm', 'md'].includes(breakpoint)}> <GridTable data={data}>
<GridColumn name="name" label={formatMessage(labels.name)} /> <GridColumn name="name" label={formatMessage(labels.name)} />
<GridColumn name="owner" label={formatMessage(labels.owner)}> <GridColumn name="owner" label={formatMessage(labels.owner)}>
{row => row.teamUser.find(({ role }) => role === ROLES.teamOwner)?.user?.username} {row => row.teamUser.find(({ role }) => role === ROLES.teamOwner)?.user?.username}

View File

@ -1,4 +1,4 @@
import { Text, Icon, Icons, GridTable, GridColumn, useBreakpoint } from 'react-basics'; import { Text, Icon, Icons, GridTable, GridColumn } from 'react-basics';
import { formatDistance } from 'date-fns'; import { formatDistance } from 'date-fns';
import { ROLES } from 'lib/constants'; import { ROLES } from 'lib/constants';
import { useMessages, useLocale } from 'components/hooks'; import { useMessages, useLocale } from 'components/hooks';
@ -14,10 +14,9 @@ export function UsersTable({
}) { }) {
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { dateLocale } = useLocale(); const { dateLocale } = useLocale();
const breakpoint = useBreakpoint();
return ( return (
<GridTable data={data} cardMode={['xs', 'sm', 'md'].includes(breakpoint)}> <GridTable data={data}>
<GridColumn name="username" label={formatMessage(labels.username)} style={{ minWidth: 0 }} /> <GridColumn name="username" label={formatMessage(labels.username)} style={{ minWidth: 0 }} />
<GridColumn name="role" label={formatMessage(labels.role)} width={'120px'}> <GridColumn name="role" label={formatMessage(labels.role)} width={'120px'}>
{row => {row =>

View File

@ -1,5 +1,5 @@
import { ReactNode } from 'react'; import { ReactNode } from 'react';
import { Text, Icon, Icons, GridTable, GridColumn, useBreakpoint } from 'react-basics'; import { Text, Icon, Icons, GridTable, GridColumn } from 'react-basics';
import { useMessages, useTeamUrl } from 'components/hooks'; import { useMessages, useTeamUrl } from 'components/hooks';
import LinkButton from 'components/common/LinkButton'; import LinkButton from 'components/common/LinkButton';
@ -20,7 +20,6 @@ export function WebsitesTable({
children, children,
}: WebsitesTableProps) { }: WebsitesTableProps) {
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const breakpoint = useBreakpoint();
const { renderTeamUrl } = useTeamUrl(); const { renderTeamUrl } = useTeamUrl();
if (!data?.length) { if (!data?.length) {
@ -28,7 +27,7 @@ export function WebsitesTable({
} }
return ( return (
<GridTable data={data} cardMode={['xs', 'sm', 'md'].includes(breakpoint)}> <GridTable data={data}>
<GridColumn name="name" label={formatMessage(labels.name)} /> <GridColumn name="name" label={formatMessage(labels.name)} />
<GridColumn name="domain" label={formatMessage(labels.domain)} /> <GridColumn name="domain" label={formatMessage(labels.domain)} />
{showActions && ( {showActions && (

View File

@ -1,4 +1,4 @@
import { GridColumn, GridTable, useBreakpoint } from 'react-basics'; import { GridColumn, GridTable } from 'react-basics';
import { useMessages, useLogin } from 'components/hooks'; import { useMessages, useLogin } from 'components/hooks';
import { ROLES } from 'lib/constants'; import { ROLES } from 'lib/constants';
import TeamMemberRemoveButton from './TeamMemberRemoveButton'; import TeamMemberRemoveButton from './TeamMemberRemoveButton';
@ -15,7 +15,6 @@ export function TeamMembersTable({
}) { }) {
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { user } = useLogin(); const { user } = useLogin();
const breakpoint = useBreakpoint();
const roles = { const roles = {
[ROLES.teamOwner]: formatMessage(labels.teamOwner), [ROLES.teamOwner]: formatMessage(labels.teamOwner),
@ -25,7 +24,7 @@ export function TeamMembersTable({
}; };
return ( return (
<GridTable data={data} cardMode={['xs', 'sm', 'md'].includes(breakpoint)}> <GridTable data={data}>
<GridColumn name="username" label={formatMessage(labels.username)}> <GridColumn name="username" label={formatMessage(labels.username)}>
{row => row?.user?.username} {row => row?.user?.username}
</GridColumn> </GridColumn>

View File

@ -1,4 +1,4 @@
import { GridColumn, GridTable, Icon, Text, useBreakpoint } from 'react-basics'; import { GridColumn, GridTable, Icon, Text } from 'react-basics';
import { useLogin, useMessages } from 'components/hooks'; import { useLogin, useMessages } from 'components/hooks';
import Icons from 'components/icons'; import Icons from 'components/icons';
import LinkButton from 'components/common/LinkButton'; import LinkButton from 'components/common/LinkButton';
@ -14,10 +14,9 @@ export function TeamWebsitesTable({
}) { }) {
const { user } = useLogin(); const { user } = useLogin();
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const breakpoint = useBreakpoint();
return ( return (
<GridTable data={data} cardMode={['xs', 'sm', 'md'].includes(breakpoint)}> <GridTable data={data}>
<GridColumn name="name" label={formatMessage(labels.name)} /> <GridColumn name="name" label={formatMessage(labels.name)} />
<GridColumn name="domain" label={formatMessage(labels.domain)} /> <GridColumn name="domain" label={formatMessage(labels.domain)} />
<GridColumn name="createdBy" label={formatMessage(labels.createdBy)}> <GridColumn name="createdBy" label={formatMessage(labels.createdBy)}>

View File

@ -52,7 +52,7 @@ export function WebsiteHeader({
}, },
{ {
label: formatMessage(labels.events), label: formatMessage(labels.events),
icon: <Icons.Nodes />, icon: <Icons.Bolt />,
path: '/events', path: '/events',
}, },
]; ];

View File

@ -1,12 +1,13 @@
import { GridTable, GridColumn } from 'react-basics'; import { GridTable, GridColumn, Icon } from 'react-basics';
import { useLocale, useMessages, useTeamUrl } from 'components/hooks'; import { useLocale, useMessages, useTeamUrl } from 'components/hooks';
import Empty from 'components/common/Empty'; import Empty from 'components/common/Empty';
import { formatDistance } from 'date-fns';
import Avatar from 'components/common/Avatar'; import Avatar from 'components/common/Avatar';
import Link from 'next/link'; import Link from 'next/link';
import Icons from 'components/icons';
import { formatDate } from 'lib/date';
export function EventsTable({ data = [] }) { export function EventsTable({ data = [] }) {
const { dateLocale } = useLocale(); const { locale } = useLocale();
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { renderTeamUrl } = useTeamUrl(); const { renderTeamUrl } = useTeamUrl();
@ -27,20 +28,15 @@ export function EventsTable({ data = [] }) {
{row => { {row => {
return ( return (
<> <>
<Icon>{row.eventName ? <Icons.Bolt /> : <Icons.Eye />}</Icon>
{formatMessage(row.eventName ? labels.triggeredEvent : labels.viewedPage)} {formatMessage(row.eventName ? labels.triggeredEvent : labels.viewedPage)}
<strong>{row.eventName}</strong> <strong>{row.eventName || row.urlPath}</strong>
</> </>
); );
}} }}
</GridColumn> </GridColumn>
<GridColumn name="urlPath" label={formatMessage(labels.path)} /> <GridColumn name="created" label={formatMessage(labels.created)} width={'300px'}>
<GridColumn name="created" label={formatMessage(labels.created)}> {row => formatDate(new Date(row.createdAt), 'PPPpp', locale)}
{row =>
formatDistance(new Date(row.createdAt), new Date(), {
addSuffix: true,
locale: dateLocale,
})
}
</GridColumn> </GridColumn>
</GridTable> </GridTable>
); );

View File

@ -1,5 +0,0 @@
export function SessionMetricsBar({ websiteId }: { websiteId: string }) {
return <h1>{websiteId}</h1>;
}
export default SessionMetricsBar;

View File

@ -0,0 +1,42 @@
import WebsiteDateFilter from 'components/input/WebsiteDateFilter';
import { Flexbox, Loading } from 'react-basics';
import MetricCard from 'components/metrics/MetricCard';
import { useMessages } from 'components/hooks';
import useWebsiteStats from 'components/hooks/queries/useWebsiteStats';
import { formatLongNumber } from 'lib/format';
export function SessionsMetricsBar({ websiteId }: { websiteId: string }) {
const { formatMessage, labels } = useMessages();
const { data, isLoading } = useWebsiteStats(websiteId);
return (
<Flexbox direction="row" justifyContent="space-between" style={{ height: 120 }}>
<Flexbox direction="row">
{isLoading && <Loading icon="dots" />}
{!isLoading && data && (
<>
<MetricCard
value={data.visitors.value}
label={formatMessage(labels.visitors)}
formatValue={formatLongNumber}
/>
<MetricCard
value={data.visits.value}
label={formatMessage(labels.visits)}
formatValue={formatLongNumber}
/>
<MetricCard
value={data.pageviews.value}
label={formatMessage(labels.views)}
formatValue={formatLongNumber}
/>
<MetricCard value={data?.countries?.value} label={formatMessage(labels.countries)} />
</>
)}
</Flexbox>
<WebsiteDateFilter websiteId={websiteId} />
</Flexbox>
);
}
export default SessionsMetricsBar;

View File

@ -1,11 +1,13 @@
'use client'; 'use client';
import WebsiteHeader from '../WebsiteHeader'; import WebsiteHeader from '../WebsiteHeader';
import SessionsDataTable from './SessionsDataTable'; import SessionsDataTable from './SessionsDataTable';
import SessionsMetricsBar from './SessionsMetricsBar';
export function SessionsPage({ websiteId }) { export function SessionsPage({ websiteId }) {
return ( return (
<> <>
<WebsiteHeader websiteId={websiteId} /> <WebsiteHeader websiteId={websiteId} />
<SessionsMetricsBar websiteId={websiteId} />
<SessionsDataTable websiteId={websiteId} /> <SessionsDataTable websiteId={websiteId} />
</> </>
); );

View File

@ -1,29 +1,33 @@
import Link from 'next/link'; import Link from 'next/link';
import { GridColumn, GridTable, useBreakpoint } from 'react-basics'; import { GridColumn, GridTable } from 'react-basics';
import { useFormat, useLocale, useMessages } from 'components/hooks'; import { useFormat, useLocale, useMessages } from 'components/hooks';
import Avatar from 'components/common/Avatar'; import Avatar from 'components/common/Avatar';
import styles from './SessionsTable.module.css'; import styles from './SessionsTable.module.css';
import { formatDate } from 'lib/date'; import { formatDate } from 'lib/date';
import TypeIcon from 'components/common/TypeIcon';
export function SessionsTable({ data = [] }: { data: any[]; showDomain?: boolean }) { export function SessionsTable({ data = [] }: { data: any[]; showDomain?: boolean }) {
const { locale } = useLocale(); const { locale } = useLocale();
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const breakpoint = useBreakpoint();
const { formatValue } = useFormat(); const { formatValue } = useFormat();
return ( return (
<GridTable data={data} cardMode={['xs', 'sm', 'md'].includes(breakpoint)}> <GridTable data={data}>
<GridColumn name="id" label="ID" width="300px"> <GridColumn name="id" label={formatMessage(labels.session)} width="100px">
{row => ( {row => (
<Link href={`sessions/${row.id}`} className={styles.link}> <Link href={`sessions/${row.id}`} className={styles.link}>
<Avatar key={row.id} seed={row.id} size={64} /> <Avatar key={row.id} seed={row.id} size={64} />
{row.id}
</Link> </Link>
)} )}
</GridColumn> </GridColumn>
<GridColumn name="visits" label={formatMessage(labels.visits)} width="100px" /> <GridColumn name="visits" label={formatMessage(labels.visits)} width="100px" />
<GridColumn name="views" label={formatMessage(labels.views)} width="100px" />
<GridColumn name="country" label={formatMessage(labels.country)}> <GridColumn name="country" label={formatMessage(labels.country)}>
{row => formatValue(row.country, 'country')} {row => (
<TypeIcon type="country" value={row.country}>
{formatValue(row.country, 'country')}
</TypeIcon>
)}
</GridColumn> </GridColumn>
<GridColumn name="city" label={formatMessage(labels.city)} /> <GridColumn name="city" label={formatMessage(labels.city)} />
<GridColumn name="browser" label={formatMessage(labels.browser)}> <GridColumn name="browser" label={formatMessage(labels.browser)}>

View File

@ -1 +1 @@
<svg height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g id="Pin"><path d="m32 0a24.0319 24.0319 0 0 0 -24 24c0 17.23 22.36 38.81 23.31 39.72a.99.99 0 0 0 1.38 0c.95-.91 23.31-22.49 23.31-39.72a24.0319 24.0319 0 0 0 -24-24zm0 35a11 11 0 1 1 11-11 11.0066 11.0066 0 0 1 -11 11z"/></g></svg> <svg height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><path d="M32 0A24.032 24.032 0 0 0 8 24c0 17.23 22.36 38.81 23.31 39.72a.99.99 0 0 0 1.38 0C33.64 62.81 56 41.23 56 24A24.032 24.032 0 0 0 32 0zm0 35a11 11 0 1 1 11-11 11.007 11.007 0 0 1-11 11z"/></svg>

Before

Width:  |  Height:  |  Size: 320 B

After

Width:  |  Height:  |  Size: 288 B

View File

@ -1,4 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 428 389.11"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 428 389.11"><circle cx="214.15" cy="181" r="171" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="20"/><path d="M413 134.11H15.29a15 15 0 0 0-15 15v15.3C.12 168 0 171.52 0 175.11c0 118.19 95.81 214 214 214 116.4 0 211.1-92.94 213.93-208.67 0-.44.07-.88.07-1.33v-30a15 15 0 0 0-15-15Z" fill="#fff"/></svg>
<circle cx="214.15" cy="181" r="171" fill="none" stroke="white" stroke-miterlimit="10" stroke-width="20"/>
<path d="M413 134.11H15.29a15 15 0 0 0-15 15v15.3C.12 168 0 171.52 0 175.11c0 118.19 95.81 214 214 214 116.4 0 211.1-92.94 213.93-208.67 0-.44.07-.88.07-1.33v-30a15 15 0 0 0-15-15Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 404 B

After

Width:  |  Height:  |  Size: 394 B

1
src/assets/money.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512" xml:space="preserve"><path d="M347 302c8.271 0 15 6.639 15 14.8h30c0-19.468-12.541-36.067-30-42.231V242h-30v32.58c-17.459 6.192-30 22.865-30 42.42 0 24.813 20.187 45 45 45 8.271 0 15 6.729 15 15s-6.729 15-15 15-15-6.729-15-15h-30c0 19.555 12.541 36.228 30 42.42v32.38h30v-32.38c17.459-6.192 30-22.865 30-42.42 0-24.813-20.187-45-45-45-8.271 0-15-6.729-15-15s6.729-15 15-15z"/><path d="M347 182c-5.057 0-10.058.242-15 .689V90c0-26.011-18.548-49.61-52.226-66.449C249.4 8.364 209.35 0 167 0 124.564 0 84.193 8.347 53.323 23.502 18.938 40.385 0 64 0 90v272c0 26 18.938 49.616 53.323 66.498C84.193 443.653 124.564 452 167 452c17.009 0 33.647-1.358 49.615-4.004C246.826 486.909 294.035 512 347 512c90.981 0 165-74.019 165-165s-74.019-165-165-165zM66.545 50.432C92.992 37.447 129.606 30 167 30c79.558 0 135 31.621 135 60s-55.442 60-135 60c-37.394 0-74.008-7.447-100.455-20.432C43.32 118.166 30 103.744 30 90s13.32-28.166 36.545-39.568zM30 142.265c6.724 5.137 14.512 9.907 23.323 14.233C84.193 171.653 124.564 180 167 180c42.35 0 82.4-8.364 112.774-23.551 8.359-4.18 15.783-8.776 22.226-13.722v45.51c-29.896 8.485-56.359 25.209-76.778 47.548C206.946 239.908 187.386 242 167 242c-37.394 0-74.008-7.447-100.455-20.432C43.32 210.166 30 195.744 30 182v-39.735zm0 92c6.724 5.137 14.512 9.907 23.323 14.233C84.193 263.653 124.564 272 167 272c11.581 0 22.942-.621 34.021-1.839a163.743 163.743 0 0 0-18.293 61.395c-5.211.286-10.465.444-15.728.444-37.394 0-74.008-7.447-100.455-20.432C43.32 300.166 30 285.744 30 272v-37.735zM167 422c-37.394 0-74.008-7.447-100.455-20.432C43.32 390.166 30 375.744 30 362v-37.736c6.724 5.137 14.512 9.907 23.323 14.233C84.193 353.653 124.564 362 167 362c5.23 0 10.459-.132 15.654-.388a163.726 163.726 0 0 0 16.486 58.557A280.559 280.559 0 0 1 167 422zm180 60c-74.439 0-135-60.561-135-135s60.561-135 135-135 135 60.561 135 135-60.561 135-135 135z"/></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -4,13 +4,13 @@ import { Banner, Loading, SearchField } from 'react-basics';
import { useMessages, useNavigation } from 'components/hooks'; import { useMessages, useNavigation } from 'components/hooks';
import Empty from 'components/common/Empty'; import Empty from 'components/common/Empty';
import Pager from 'components/common/Pager'; import Pager from 'components/common/Pager';
import { FilterQueryResult } from 'lib/types'; import { PagedQueryResult } from 'lib/types';
import styles from './DataTable.module.css'; import styles from './DataTable.module.css';
const DEFAULT_SEARCH_DELAY = 600; const DEFAULT_SEARCH_DELAY = 600;
export interface DataTableProps { export interface DataTableProps {
queryResult: FilterQueryResult<any>; queryResult: PagedQueryResult<any>;
searchDelay?: number; searchDelay?: number;
allowSearch?: boolean; allowSearch?: boolean;
allowPaging?: boolean; allowPaging?: boolean;

View File

@ -1,17 +1,24 @@
import { ReactNode } from 'react';
export function TypeIcon({ export function TypeIcon({
type, type,
value, value,
children,
}: { }: {
type: 'browser' | 'country' | 'device' | 'os'; type: 'browser' | 'country' | 'device' | 'os';
value: string; value: string;
children?: ReactNode;
}) { }) {
return ( return (
<>
<img <img
src={`${process.env.basePath || ''}/images/${type}/${value || 'unknown'}.png`} src={`${process.env.basePath || ''}/images/${type}/${value || 'unknown'}.png`}
alt={value} alt={value}
width={type === 'country' ? undefined : 16} width={type === 'country' ? undefined : 16}
height={type === 'country' ? undefined : 16} height={type === 'country' ? undefined : 16}
/> />
{children}
</>
); );
} }

View File

@ -1,6 +1,6 @@
export * from './queries/useApi'; export * from './queries/useApi';
export * from './queries/useConfig'; export * from './queries/useConfig';
export * from './queries/useFilterQuery'; export * from './queries/usePagedQuery';
export * from './queries/useLogin'; export * from './queries/useLogin';
export * from './queries/useRealtime'; export * from './queries/useRealtime';
export * from './queries/useReport'; export * from './queries/useReport';
@ -19,6 +19,7 @@ export * from './queries/useUsers';
export * from './queries/useWebsite'; export * from './queries/useWebsite';
export * from './queries/useWebsites'; export * from './queries/useWebsites';
export * from './queries/useWebsiteEvents'; export * from './queries/useWebsiteEvents';
export * from './queries/useWebsiteEventsSeries';
export * from './queries/useWebsiteMetrics'; export * from './queries/useWebsiteMetrics';
export * from './queries/useWebsiteValues'; export * from './queries/useWebsiteValues';
export * from './useCountryNames'; export * from './useCountryNames';

View File

@ -1,14 +1,14 @@
import { UseQueryOptions } from '@tanstack/react-query'; import { UseQueryOptions } from '@tanstack/react-query';
import { useState } from 'react'; import { useState } from 'react';
import { useApi } from './useApi'; import { useApi } from './useApi';
import { PageResult, PageParams, FilterQueryResult } from 'lib/types'; import { PageResult, PageParams, PagedQueryResult } from 'lib/types';
import { useNavigation } from '../useNavigation'; import { useNavigation } from '../useNavigation';
export function useFilterQuery<T = any>({ export function usePagedQuery<T = any>({
queryKey, queryKey,
queryFn, queryFn,
...options ...options
}: Omit<UseQueryOptions, 'queryFn'> & { queryFn: (params?: object) => any }): FilterQueryResult<T> { }: Omit<UseQueryOptions, 'queryFn'> & { queryFn: (params?: object) => any }): PagedQueryResult<T> {
const { query: queryParams } = useNavigation(); const { query: queryParams } = useNavigation();
const [params, setParams] = useState<PageParams>({ const [params, setParams] = useState<PageParams>({
query: '', query: '',
@ -30,4 +30,4 @@ export function useFilterQuery<T = any>({
}; };
} }
export default useFilterQuery; export default usePagedQuery;

View File

@ -1,11 +1,11 @@
import useApi from './useApi'; import useApi from './useApi';
import useFilterQuery from './useFilterQuery'; import usePagedQuery from './usePagedQuery';
import useModified from '../useModified'; import useModified from '../useModified';
export function useReports({ websiteId, teamId }: { websiteId?: string; teamId?: string }) { export function useReports({ websiteId, teamId }: { websiteId?: string; teamId?: string }) {
const { modified } = useModified(`reports`); const { modified } = useModified(`reports`);
const { get, del, useMutation } = useApi(); const { get, del, useMutation } = useApi();
const queryResult = useFilterQuery({ const queryResult = usePagedQuery({
queryKey: ['reports', { websiteId, teamId, modified }], queryKey: ['reports', { websiteId, teamId, modified }],
queryFn: (params: any) => { queryFn: (params: any) => {
return get('/reports', { websiteId, teamId, ...params }); return get('/reports', { websiteId, teamId, ...params });

View File

@ -1,12 +1,12 @@
import useApi from './useApi'; import useApi from './useApi';
import useFilterQuery from './useFilterQuery'; import usePagedQuery from './usePagedQuery';
import useModified from '../useModified'; import useModified from '../useModified';
export function useTeamMembers(teamId: string) { export function useTeamMembers(teamId: string) {
const { get } = useApi(); const { get } = useApi();
const { modified } = useModified(`teams:members`); const { modified } = useModified(`teams:members`);
return useFilterQuery({ return usePagedQuery({
queryKey: ['teams:members', { teamId, modified }], queryKey: ['teams:members', { teamId, modified }],
queryFn: (params: any) => { queryFn: (params: any) => {
return get(`/teams/${teamId}/users`, params); return get(`/teams/${teamId}/users`, params);

View File

@ -1,12 +1,12 @@
import useApi from './useApi'; import useApi from './useApi';
import useFilterQuery from './useFilterQuery'; import usePagedQuery from './usePagedQuery';
import useModified from '../useModified'; import useModified from '../useModified';
export function useTeamWebsites(teamId: string) { export function useTeamWebsites(teamId: string) {
const { get } = useApi(); const { get } = useApi();
const { modified } = useModified(`websites`); const { modified } = useModified(`websites`);
return useFilterQuery({ return usePagedQuery({
queryKey: ['teams:websites', { teamId, modified }], queryKey: ['teams:websites', { teamId, modified }],
queryFn: (params: any) => { queryFn: (params: any) => {
return get(`/teams/${teamId}/websites`, params); return get(`/teams/${teamId}/websites`, params);

View File

@ -1,12 +1,12 @@
import useApi from './useApi'; import useApi from './useApi';
import useFilterQuery from './useFilterQuery'; import usePagedQuery from './usePagedQuery';
import useModified from '../useModified'; import useModified from '../useModified';
export function useTeams(userId: string) { export function useTeams(userId: string) {
const { get } = useApi(); const { get } = useApi();
const { modified } = useModified(`teams`); const { modified } = useModified(`teams`);
return useFilterQuery({ return usePagedQuery({
queryKey: ['teams', { userId, modified }], queryKey: ['teams', { userId, modified }],
queryFn: (params: any) => { queryFn: (params: any) => {
return get(`/users/${userId}/teams`, params); return get(`/users/${userId}/teams`, params);

View File

@ -1,12 +1,12 @@
import useApi from './useApi'; import useApi from './useApi';
import useFilterQuery from './useFilterQuery'; import usePagedQuery from './usePagedQuery';
import useModified from '../useModified'; import useModified from '../useModified';
export function useUsers() { export function useUsers() {
const { get } = useApi(); const { get } = useApi();
const { modified } = useModified(`users`); const { modified } = useModified(`users`);
return useFilterQuery({ return usePagedQuery({
queryKey: ['users', { modified }], queryKey: ['users', { modified }],
queryFn: (params: any) => { queryFn: (params: any) => {
return get('/admin/users', { return get('/admin/users', {

View File

@ -1,7 +1,7 @@
import useApi from './useApi'; import useApi from './useApi';
import { UseQueryOptions } from '@tanstack/react-query'; import { UseQueryOptions } from '@tanstack/react-query';
import { useFilterParams } from '../useFilterParams'; import { useFilterParams } from '../useFilterParams';
import { useFilterQuery } from 'components/hooks'; import { usePagedQuery } from 'components/hooks';
export function useWebsiteEvents( export function useWebsiteEvents(
websiteId: string, websiteId: string,
@ -10,7 +10,7 @@ export function useWebsiteEvents(
const { get } = useApi(); const { get } = useApi();
const params = useFilterParams(websiteId); const params = useFilterParams(websiteId);
return useFilterQuery({ return usePagedQuery({
queryKey: ['websites:events', { websiteId, ...params }], queryKey: ['websites:events', { websiteId, ...params }],
queryFn: pageParams => queryFn: pageParams =>
get(`/websites/${websiteId}/events`, { ...params, ...pageParams, pageSize: 20 }), get(`/websites/${websiteId}/events`, { ...params, ...pageParams, pageSize: 20 }),

View File

@ -0,0 +1,20 @@
import useApi from './useApi';
import { UseQueryOptions } from '@tanstack/react-query';
import { useFilterParams } from '../useFilterParams';
export function useWebsiteEventsSeries(
websiteId: string,
options?: Omit<UseQueryOptions, 'queryKey' | 'queryFn'>,
) {
const { get, useQuery } = useApi();
const params = useFilterParams(websiteId);
return useQuery({
queryKey: ['websites:events:series', { websiteId, ...params }],
queryFn: () => get(`/websites/${websiteId}/events/series`, { ...params }),
enabled: !!websiteId,
...options,
});
}
export default useWebsiteEventsSeries;

View File

@ -1,17 +1,20 @@
import { useApi } from './useApi'; import { useApi } from './useApi';
import { useFilterQuery } from './useFilterQuery'; import { usePagedQuery } from './usePagedQuery';
import useModified from '../useModified'; import useModified from '../useModified';
import { useFilterParams } from 'components/hooks/useFilterParams';
export function useWebsiteSessions(websiteId: string, params?: { [key: string]: string | number }) { export function useWebsiteSessions(websiteId: string, params?: { [key: string]: string | number }) {
const { get } = useApi(); const { get } = useApi();
const { modified } = useModified(`sessions`); const { modified } = useModified(`sessions`);
const filters = useFilterParams(websiteId);
return useFilterQuery({ return usePagedQuery({
queryKey: ['sessions', { websiteId, modified, ...params }], queryKey: ['sessions', { websiteId, modified, ...params, ...filters }],
queryFn: (data: any) => { queryFn: (data: any) => {
return get(`/websites/${websiteId}/sessions`, { return get(`/websites/${websiteId}/sessions`, {
...data, ...data,
...params, ...params,
...filters,
}); });
}, },
}); });

View File

@ -1,5 +1,5 @@
import { useApi } from './useApi'; import { useApi } from './useApi';
import { useFilterQuery } from './useFilterQuery'; import { usePagedQuery } from './usePagedQuery';
import { useLogin } from './useLogin'; import { useLogin } from './useLogin';
import useModified from '../useModified'; import useModified from '../useModified';
@ -11,7 +11,7 @@ export function useWebsites(
const { user } = useLogin(); const { user } = useLogin();
const { modified } = useModified(`websites`); const { modified } = useModified(`websites`);
return useFilterQuery({ return usePagedQuery({
queryKey: ['websites', { userId, teamId, modified, ...params }], queryKey: ['websites', { userId, teamId, modified, ...params }],
queryFn: (data: any) => { queryFn: (data: any) => {
return get(teamId ? `/teams/${teamId}/websites` : `/users/${userId || user.id}/websites`, { return get(teamId ? `/teams/${teamId}/websites` : `/users/${userId || user.id}/websites`, {

View File

@ -88,8 +88,8 @@ export const labels = defineMessages({
leaveTeam: { id: 'label.leave-team', defaultMessage: 'Leave team' }, leaveTeam: { id: 'label.leave-team', defaultMessage: 'Leave team' },
refresh: { id: 'label.refresh', defaultMessage: 'Refresh' }, refresh: { id: 'label.refresh', defaultMessage: 'Refresh' },
pages: { id: 'label.pages', defaultMessage: 'Pages' }, pages: { id: 'label.pages', defaultMessage: 'Pages' },
entry: { id: 'label.entry', defaultMessage: 'Entry URL' }, entry: { id: 'label.entry', defaultMessage: 'Entry path' },
exit: { id: 'label.exit', defaultMessage: 'Exit URL' }, exit: { id: 'label.exit', defaultMessage: 'Exit path' },
referrers: { id: 'label.referrers', defaultMessage: 'Referrers' }, referrers: { id: 'label.referrers', defaultMessage: 'Referrers' },
hosts: { id: 'label.hosts', defaultMessage: 'Hosts' }, hosts: { id: 'label.hosts', defaultMessage: 'Hosts' },
screens: { id: 'label.screens', defaultMessage: 'Screens' }, screens: { id: 'label.screens', defaultMessage: 'Screens' },
@ -165,6 +165,8 @@ export const labels = defineMessages({
}, },
url: { id: 'label.url', defaultMessage: 'URL' }, url: { id: 'label.url', defaultMessage: 'URL' },
urls: { id: 'label.urls', defaultMessage: 'URLs' }, urls: { id: 'label.urls', defaultMessage: 'URLs' },
path: { id: 'label.path', defaultMessage: 'Path' },
paths: { id: 'label.paths', defaultMessage: 'Paths' },
add: { id: 'label.add', defaultMessage: 'Add' }, add: { id: 'label.add', defaultMessage: 'Add' },
update: { id: 'label.update', defaultMessage: 'Update' }, update: { id: 'label.update', defaultMessage: 'Update' },
window: { id: 'label.window', defaultMessage: 'Window' }, window: { id: 'label.window', defaultMessage: 'Window' },
@ -276,7 +278,6 @@ export const labels = defineMessages({
lastSeen: { id: 'label.last-seen', defaultMessage: 'Last seen' }, lastSeen: { id: 'label.last-seen', defaultMessage: 'Last seen' },
firstSeen: { id: 'label.first-seen', defaultMessage: 'First seen' }, firstSeen: { id: 'label.first-seen', defaultMessage: 'First seen' },
properties: { id: 'label.properties', defaultMessage: 'Properties' }, properties: { id: 'label.properties', defaultMessage: 'Properties' },
path: { id: 'label.path', defaultMessage: 'Path' },
}); });
export const messages = defineMessages({ export const messages = defineMessages({

View File

@ -2,7 +2,7 @@ import { useMemo } from 'react';
import { colord } from 'colord'; import { colord } from 'colord';
import BarChart from 'components/charts/BarChart'; import BarChart from 'components/charts/BarChart';
import { getDateArray } from 'lib/date'; import { getDateArray } from 'lib/date';
import { useLocale, useDateRange, useWebsiteEvents } from 'components/hooks'; import { useLocale, useDateRange, useWebsiteEventsSeries } from 'components/hooks';
import { CHART_COLORS } from 'lib/constants'; import { CHART_COLORS } from 'lib/constants';
import { renderDateLabels } from 'lib/charts'; import { renderDateLabels } from 'lib/charts';
@ -16,7 +16,7 @@ export function EventsChart({ websiteId, className }: EventsChartProps) {
dateRange: { startDate, endDate, unit }, dateRange: { startDate, endDate, unit },
} = useDateRange(websiteId); } = useDateRange(websiteId);
const { locale } = useLocale(); const { locale } = useLocale();
const { data, isLoading } = useWebsiteEvents(websiteId); const { data, isLoading } = useWebsiteEventsSeries(websiteId);
const chartData = useMemo(() => { const chartData = useMemo(() => {
if (!data) return []; if (!data) return [];

View File

@ -10,7 +10,7 @@ export interface MetricCardProps {
change?: number; change?: number;
label?: string; label?: string;
reverseColors?: boolean; reverseColors?: boolean;
formatValue?: typeof formatNumber; formatValue?: (n: any) => string;
showLabel?: boolean; showLabel?: boolean;
showChange?: boolean; showChange?: boolean;
showPrevious?: boolean; showPrevious?: boolean;

View File

@ -25,7 +25,7 @@ export function PagesTable({ allowFilter, ...props }: PagesTableProps) {
const buttons = [ const buttons = [
{ {
label: 'URL', label: formatMessage(labels.path),
key: 'url', key: 'url',
}, },
{ {

View File

@ -41,7 +41,7 @@ export interface PageResult<T> {
sortDescending?: boolean; sortDescending?: boolean;
} }
export interface FilterQueryResult<T> { export interface PagedQueryResult<T> {
result: PageResult<T>; result: PageResult<T>;
query: any; query: any;
params: PageParams; params: PageParams;

View File

@ -14,6 +14,8 @@ export interface ReportsRequestQuery extends PageParams {
const schema = { const schema = {
GET: yup.object().shape({ GET: yup.object().shape({
websiteId: yup.string().uuid().required(), websiteId: yup.string().uuid().required(),
startAt: yup.number().integer().required(),
endAt: yup.number().integer().min(yup.ref('startAt')).required(),
...pageInfo, ...pageInfo,
}), }),
}; };
@ -26,14 +28,17 @@ export default async (
await useAuth(req, res); await useAuth(req, res);
await useValidate(schema, req, res); await useValidate(schema, req, res);
const { websiteId } = req.query; const { websiteId, startAt, endAt } = req.query;
const startDate = new Date(+startAt);
const endDate = new Date(+endAt);
if (req.method === 'GET') { if (req.method === 'GET') {
if (!(await canViewWebsite(req.auth, websiteId))) { if (!(await canViewWebsite(req.auth, websiteId))) {
return unauthorized(res); return unauthorized(res);
} }
const data = await getWebsiteSessions(websiteId, {}, req.query); const data = await getWebsiteSessions(websiteId, { startDate, endDate }, req.query);
return ok(res, data); return ok(res, data);
} }

View File

@ -34,12 +34,14 @@ async function relationalQuery(
sum(t.c) as "pageviews", sum(t.c) as "pageviews",
count(distinct t.session_id) as "visitors", count(distinct t.session_id) as "visitors",
count(distinct t.visit_id) as "visits", count(distinct t.visit_id) as "visits",
count(distinct t.country) as "countries",
sum(case when t.c = 1 then 1 else 0 end) as "bounces", sum(case when t.c = 1 then 1 else 0 end) as "bounces",
sum(${getTimestampDiffSQL('t.min_time', 't.max_time')}) as "totaltime" sum(${getTimestampDiffSQL('t.min_time', 't.max_time')}) as "totaltime",
from ( from (
select select
website_event.session_id, website_event.session_id,
website_event.visit_id, website_event.visit_id,
session.country,
count(*) as "c", count(*) as "c",
min(website_event.created_at) as "min_time", min(website_event.created_at) as "min_time",
max(website_event.created_at) as "max_time" max(website_event.created_at) as "max_time"
@ -49,7 +51,7 @@ async function relationalQuery(
and website_event.created_at between {{startDate}} and {{endDate}} and website_event.created_at between {{startDate}} and {{endDate}}
and event_type = {{eventType}} and event_type = {{eventType}}
${filterQuery} ${filterQuery}
group by 1, 2 group by 1, 2, 3
) as t ) as t
`, `,
params, params,
@ -76,12 +78,14 @@ async function clickhouseQuery(
sum(t.c) as "pageviews", sum(t.c) as "pageviews",
uniq(t.session_id) as "visitors", uniq(t.session_id) as "visitors",
uniq(t.visit_id) as "visits", uniq(t.visit_id) as "visits",
uniq(t.country) as "countries",
sum(if(t.c = 1, 1, 0)) as "bounces", sum(if(t.c = 1, 1, 0)) as "bounces",
sum(max_time-min_time) as "totaltime" sum(max_time-min_time) as "totaltime"
from ( from (
select select
session_id, session_id,
visit_id, visit_id,
country,
count(*) c, count(*) c,
min(created_at) min_time, min(created_at) min_time,
max(created_at) max_time max(created_at) max_time
@ -90,7 +94,7 @@ async function clickhouseQuery(
and created_at between {startDate:DateTime64} and {endDate:DateTime64} and created_at between {startDate:DateTime64} and {endDate:DateTime64}
and event_type = {eventType:UInt32} and event_type = {eventType:UInt32}
${filterQuery} ${filterQuery}
group by session_id, visit_id group by session_id, visit_id, country
) as t; ) as t;
`; `;
} else { } else {
@ -99,11 +103,14 @@ async function clickhouseQuery(
sum(t.c) as "pageviews", sum(t.c) as "pageviews",
uniq(session_id) as "visitors", uniq(session_id) as "visitors",
uniq(visit_id) as "visits", uniq(visit_id) as "visits",
uniq(country) as "countries",
sumIf(1, t.c = 1) as "bounces", sumIf(1, t.c = 1) as "bounces",
sum(max_time-min_time) as "totaltime" sum(max_time-min_time) as "totaltime"
from (select from (
select
session_id, session_id,
visit_id, visit_id,
country,
sum(views) c, sum(views) c,
min(min_time) min_time, min(min_time) min_time,
max(max_time) max_time max(max_time) max_time
@ -112,7 +119,7 @@ async function clickhouseQuery(
and created_at between {startDate:DateTime64} and {endDate:DateTime64} and created_at between {startDate:DateTime64} and {endDate:DateTime64}
and event_type = {eventType:UInt32} and event_type = {eventType:UInt32}
${filterQuery} ${filterQuery}
group by session_id, visit_id group by session_id, visit_id, country
) as t; ) as t;
`; `;
} }
@ -125,6 +132,7 @@ async function clickhouseQuery(
visits: Number(a.visits), visits: Number(a.visits),
bounces: Number(a.bounces), bounces: Number(a.bounces),
totaltime: Number(a.totaltime), totaltime: Number(a.totaltime),
countries: Number(a.countries),
}; };
}); });
}); });

View File

@ -43,7 +43,8 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters, pagePar
city, city,
min(created_at) as firstAt, min(created_at) as firstAt,
max(created_at) as lastAt, max(created_at) as lastAt,
uniq(visit_id) as visits uniq(visit_id) as visits,
count(*) as views
from website_event from website_event
where website_id = {websiteId:UUID} where website_id = {websiteId:UUID}
${dateQuery} ${dateQuery}

432
yarn.lock
View File

@ -1199,17 +1199,17 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@clickhouse/client-common@1.3.0": "@clickhouse/client-common@1.4.0":
version "1.3.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/@clickhouse/client-common/-/client-common-1.3.0.tgz#9fe4b88eedb233770832cb1c0794f4ad9fbec75c" resolved "https://registry.yarnpkg.com/@clickhouse/client-common/-/client-common-1.4.0.tgz#6936f667ba901724bf9174cc2b783507e921868f"
integrity sha512-fApbhu52WSQlBU0gMZQxd2akuWbI1c9BcWjIbDDgtNZX2OggrIB7a4oI845ZGXpeZCZDI9ZqtkXzbYQYS0Yqew== integrity sha512-kglG8YyWnR1K24RckUf5ZdNTN0U0s+a1j/bpCO4ZjzjO87ICgWlXFVD22pZqSACW7/2IIi1IkzbwtxKI2s/MOw==
"@clickhouse/client@^1.3.0": "@clickhouse/client@^1.3.0":
version "1.3.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/@clickhouse/client/-/client-1.3.0.tgz#298529b970a9ba2ae5e017258aaf6cf522cb2b51" resolved "https://registry.yarnpkg.com/@clickhouse/client/-/client-1.4.0.tgz#84e17f8c0f2ba109d8e76c3d4f5830aeff5e9459"
integrity sha512-baBiuwVpXg/DHCe9Y1pNf+tcE2ZalCAQqZsR9OhP7+01C3UqTjHeY4eYixNlpfZCb8c8R4GygdWJFbXF0aGklw== integrity sha512-O4mbFPM/wQtFck01ghYI2mnNHv9jSFEiQBsTCH4t6MKeGHNAPkJGaFGv+KycLTv6zjnQNjiUGdXDMVRema5SyA==
dependencies: dependencies:
"@clickhouse/client-common" "1.3.0" "@clickhouse/client-common" "1.4.0"
"@colors/colors@1.5.0": "@colors/colors@1.5.0":
version "1.5.0" version "1.5.0"
@ -1349,7 +1349,7 @@
resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz#ea61ba7bb24be3502c6aaa3190ed231f4633a81e" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz#ea61ba7bb24be3502c6aaa3190ed231f4633a81e"
integrity sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg== integrity sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==
"@cypress/request@^3.0.0": "@cypress/request@^3.0.0", "@cypress/request@^3.0.1":
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960"
integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==
@ -2188,19 +2188,19 @@
integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==
"@netlify/plugin-nextjs@^5.1.0": "@netlify/plugin-nextjs@^5.1.0":
version "5.3.3" version "5.6.0"
resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-5.3.3.tgz#414cb0f4c21e6b80d6127b824efb00ae2f732a89" resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-5.6.0.tgz#970f96b11bee4fe115fad8e3e4f3c6121f97a370"
integrity sha512-QhvZLOHhPuTnh6TZ5G0/jtjAJ1Y52A67b39eygKv6znQUPti8p+8y2WulcntpCRzVp2stzEULMNPlnptna1ikg== integrity sha512-PBrsd/GJZ9MN8BdyIoleTkY22lAUMfcRxrbb8wgxGzXtTW0RU0GW2mc99ISB6zOwWMZ11rSjeN0GS6znnukvww==
"@next/env@14.2.5": "@next/env@14.2.5":
version "14.2.5" version "14.2.5"
resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.5.tgz#1d9328ab828711d3517d0a1d505acb55e5ef7ad0" resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.5.tgz#1d9328ab828711d3517d0a1d505acb55e5ef7ad0"
integrity sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA== integrity sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==
"@next/eslint-plugin-next@14.2.4": "@next/eslint-plugin-next@14.2.5":
version "14.2.4" version "14.2.5"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz#c7f965cb76f0b454e726ef0f69157c4fb4e28f53" resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.5.tgz#f7e3ff3efe40a2855e5f29bc2692175f85913ba8"
integrity sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA== integrity sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==
dependencies: dependencies:
glob "10.3.10" glob "10.3.10"
@ -2275,90 +2275,96 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@prisma/client@5.16.2": "@prisma/client@5.17.0":
version "5.16.2" version "5.17.0"
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.16.2.tgz#21df4c092eac29dcc4431ebed8c92579ffc9d8bd" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.17.0.tgz#9079947bd749689c2dabfb9ecc70a24ebefb1f43"
integrity sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw== integrity sha512-N2tnyKayT0Zf7mHjwEyE8iG7FwTmXDHFZ1GnNhQp0pJUObsuel4ZZ1XwfuAYkq5mRIiC/Kot0kt0tGCfLJ70Jw==
"@prisma/debug@5.16.2": "@prisma/debug@5.17.0":
version "5.16.2" version "5.17.0"
resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.16.2.tgz#bf774f4768a3d1634887e6964fcfe04576dc7496" resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.17.0.tgz#a765105848993984535b6066f8ebc6e6ead26533"
integrity sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A== integrity sha512-l7+AteR3P8FXiYyo496zkuoiJ5r9jLQEdUuxIxNCN1ud8rdbH3GTxm+f+dCyaSv9l9WY+29L9czaVRXz9mULfg==
"@prisma/engines-version@5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303": "@prisma/engines-version@5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053":
version "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303" version "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz#63ceebefb7daa1eb17f250cad75d35999a50ee1b" resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053.tgz#3c7cc1ef3ebc34cbd069e5873b9982f2aabf5acd"
integrity sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw== integrity sha512-tUuxZZysZDcrk5oaNOdrBnnkoTtmNQPkzINFDjz7eG6vcs9AVDmA/F6K5Plsb2aQc/l5M2EnFqn3htng9FA4hg==
"@prisma/engines@5.16.2": "@prisma/engines@5.17.0":
version "5.16.2" version "5.17.0"
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.16.2.tgz#d624c816c25a5cbad7ca13c7842b71557b6020e0" resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.17.0.tgz#74dd1aabb22675892760b3cf69a448e3aef4616b"
integrity sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg== integrity sha512-+r+Nf+JP210Jur+/X8SIPLtz+uW9YA4QO5IXA+KcSOBe/shT47bCcRMTYCbOESw3FFYFTwe7vU6KTWHKPiwvtg==
dependencies: dependencies:
"@prisma/debug" "5.16.2" "@prisma/debug" "5.17.0"
"@prisma/engines-version" "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303" "@prisma/engines-version" "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053"
"@prisma/fetch-engine" "5.16.2" "@prisma/fetch-engine" "5.17.0"
"@prisma/get-platform" "5.16.2" "@prisma/get-platform" "5.17.0"
"@prisma/extension-read-replicas@^0.3.0": "@prisma/extension-read-replicas@^0.3.0":
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/@prisma/extension-read-replicas/-/extension-read-replicas-0.3.0.tgz#2842a7c928f957c1dd58a6256104797596d43426" resolved "https://registry.yarnpkg.com/@prisma/extension-read-replicas/-/extension-read-replicas-0.3.0.tgz#2842a7c928f957c1dd58a6256104797596d43426"
integrity sha512-F9+rSmYday6GT2qjhJtkZcBOpLO5LtpvFcMGqrBDHf+78LEdSuxfFjOxYlNuqk4B+th62yxpbhfpmB9/Mca14Q== integrity sha512-F9+rSmYday6GT2qjhJtkZcBOpLO5LtpvFcMGqrBDHf+78LEdSuxfFjOxYlNuqk4B+th62yxpbhfpmB9/Mca14Q==
"@prisma/fetch-engine@5.16.2": "@prisma/fetch-engine@5.17.0":
version "5.16.2" version "5.17.0"
resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz#e7e06cf246340e6ae06791f9133be275c5ee50e5" resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.17.0.tgz#f718dc7426411d1ebeeee53e2d0d38652387f87c"
integrity sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg== integrity sha512-ESxiOaHuC488ilLPnrv/tM2KrPhQB5TRris/IeIV4ZvUuKeaicCl4Xj/JCQeG9IlxqOgf1cCg5h5vAzlewN91Q==
dependencies: dependencies:
"@prisma/debug" "5.16.2" "@prisma/debug" "5.17.0"
"@prisma/engines-version" "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303" "@prisma/engines-version" "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053"
"@prisma/get-platform" "5.16.2" "@prisma/get-platform" "5.17.0"
"@prisma/get-platform@5.16.2": "@prisma/get-platform@5.17.0":
version "5.16.2" version "5.17.0"
resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.16.2.tgz#f9b397ddf807b71411fd9d0b17374bc21e91cc40" resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.17.0.tgz#89fdcae2adddebbbf0e7bd0474a6c49d6023519b"
integrity sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA== integrity sha512-UlDgbRozCP1rfJ5Tlkf3Cnftb6srGrEQ4Nm3og+1Se2gWmCZ0hmPIi+tQikGDUVLlvOWx3Gyi9LzgRP+HTXV9w==
dependencies: dependencies:
"@prisma/debug" "5.16.2" "@prisma/debug" "5.17.0"
"@react-spring/animated@~9.7.3": "@react-spring/animated@~9.7.4":
version "9.7.3" version "9.7.4"
resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.3.tgz#4211b1a6d48da0ff474a125e93c0f460ff816e0f" resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.4.tgz#c712b2d3dc9312ef41aa8886818b539151bda062"
integrity sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw== integrity sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ==
dependencies: dependencies:
"@react-spring/shared" "~9.7.3" "@react-spring/shared" "~9.7.4"
"@react-spring/types" "~9.7.3" "@react-spring/types" "~9.7.4"
"@react-spring/core@~9.7.3": "@react-spring/core@~9.7.4":
version "9.7.3" version "9.7.4"
resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.3.tgz#60056bcb397f2c4f371c6c9a5f882db77ae90095" resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.4.tgz#0eaa0b5da3d18036d87a571f23079819d45a9f46"
integrity sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ== integrity sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw==
dependencies: dependencies:
"@react-spring/animated" "~9.7.3" "@react-spring/animated" "~9.7.4"
"@react-spring/shared" "~9.7.3" "@react-spring/shared" "~9.7.4"
"@react-spring/types" "~9.7.3" "@react-spring/types" "~9.7.4"
"@react-spring/shared@~9.7.3": "@react-spring/rafz@~9.7.4":
version "9.7.3" version "9.7.4"
resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.3.tgz#4cf29797847c689912aec4e62e34c99a4d5d9e53" resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.4.tgz#d53aa45a8cb116b81b27ba29e0cc15470ccfd449"
integrity sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA== integrity sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA==
"@react-spring/shared@~9.7.4":
version "9.7.4"
resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.4.tgz#8ac57505072c2aee33d77c47c4269347061a3377"
integrity sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w==
dependencies: dependencies:
"@react-spring/types" "~9.7.3" "@react-spring/rafz" "~9.7.4"
"@react-spring/types" "~9.7.4"
"@react-spring/types@~9.7.3": "@react-spring/types@~9.7.4":
version "9.7.3" version "9.7.4"
resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.3.tgz#ea78fd447cbc2612c1f5d55852e3c331e8172a0b" resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.4.tgz#c849a7f062b5163d078e5e75f28c8f6acf91792e"
integrity sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw== integrity sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g==
"@react-spring/web@^9.7.3": "@react-spring/web@^9.7.3":
version "9.7.3" version "9.7.4"
resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.3.tgz#d9f4e17fec259f1d65495a19502ada4f5b57fa3d" resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.4.tgz#0086ab5dcf17e6a8f3d7e7f8041ccb4cc2fa10dc"
integrity sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg== integrity sha512-UMvCZp7I5HCVIleSa4BwbNxynqvj+mJjG2m20VO2yPoi2pnCYANy58flvz9v/YcXTAvsmL655FV3pm5fbr6akA==
dependencies: dependencies:
"@react-spring/animated" "~9.7.3" "@react-spring/animated" "~9.7.4"
"@react-spring/core" "~9.7.3" "@react-spring/core" "~9.7.4"
"@react-spring/shared" "~9.7.3" "@react-spring/shared" "~9.7.4"
"@react-spring/types" "~9.7.3" "@react-spring/types" "~9.7.4"
"@redis/bloom@1.2.0": "@redis/bloom@1.2.0":
version "1.2.0" version "1.2.0"
@ -2459,9 +2465,9 @@
picomatch "^2.3.1" picomatch "^2.3.1"
"@rushstack/eslint-patch@^1.3.3": "@rushstack/eslint-patch@^1.3.3":
version "1.10.3" version "1.10.4"
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1"
integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==
"@sinclair/typebox@^0.27.8": "@sinclair/typebox@^0.27.8":
version "0.27.8" version "0.27.8"
@ -2616,17 +2622,17 @@
"@swc/counter" "^0.1.3" "@swc/counter" "^0.1.3"
tslib "^2.4.0" tslib "^2.4.0"
"@tanstack/query-core@5.48.0": "@tanstack/query-core@5.51.21":
version "5.48.0" version "5.51.21"
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.48.0.tgz#a3308ec925d8c16d64c789899d6c084c2fe30cbc" resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.51.21.tgz#a510469c6c30d3de2a8b8798e340169a4b0fd08f"
integrity sha512-lZAfPPeVIqXCswE9SSbG33B6/91XOWt/Iq41bFeWb/mnHwQSIfFRbkS4bfs+WhIk9abRArF9Id2fp0Mgo+hq6Q== integrity sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==
"@tanstack/react-query@^5.28.6": "@tanstack/react-query@^5.28.6":
version "5.48.0" version "5.51.21"
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.48.0.tgz#7890620272b48aeb278498dfe082f27518f3ac6d" resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.51.21.tgz#cdd14677bcc809a83e01b6c38842c841ce7420af"
integrity sha512-GDExbjYWzvDokyRqMSWXdrPiYpp95Aig0oeMIrxTaruOJJgWiWfUP//OAaowm2RrRkGVsavSZdko/XmIrrV2Nw== integrity sha512-Q/V81x3sAYgCsxjwOkfLXfrmoG+FmDhLeHH5okC/Bp8Aaw2c33lbEo/mMcMnkxUPVtB2FLpzHT0tq3c+OlZEbw==
dependencies: dependencies:
"@tanstack/query-core" "5.48.0" "@tanstack/query-core" "5.51.21"
"@trysound/sax@0.2.0": "@trysound/sax@0.2.0":
version "0.2.0" version "0.2.0"
@ -2833,12 +2839,12 @@
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e"
integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
"@types/node@*", "@types/node@^20.9.0": "@types/node@*":
version "20.14.9" version "22.1.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.1.0.tgz#6d6adc648b5e03f0e83c78dc788c2b037d0ad94b"
integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== integrity sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==
dependencies: dependencies:
undici-types "~5.26.4" undici-types "~6.13.0"
"@types/node@14": "@types/node@14":
version "14.18.63" version "14.18.63"
@ -2850,6 +2856,13 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190"
integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==
"@types/node@^20.9.0":
version "20.14.14"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.14.tgz#6b655d4a88623b0edb98300bb9dd2107225f885e"
integrity sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==
dependencies:
undici-types "~5.26.4"
"@types/normalize-package-data@^2.4.0": "@types/normalize-package-data@^2.4.0":
version "2.4.3" version "2.4.3"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c"
@ -3471,16 +3484,6 @@ array.prototype.flatmap@^1.3.2:
es-abstract "^1.22.1" es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0" es-shim-unscopables "^1.0.0"
array.prototype.toreversed@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba"
integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==
dependencies:
call-bind "^1.0.2"
define-properties "^1.2.0"
es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
array.prototype.tosorted@^1.1.4: array.prototype.tosorted@^1.1.4:
version "1.1.4" version "1.1.4"
resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc"
@ -3533,7 +3536,7 @@ astral-regex@^2.0.0:
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async@^3.2.0: async@^3.2.0, async@^3.2.3:
version "3.2.5" version "3.2.5"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66"
integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==
@ -3578,9 +3581,9 @@ aws4@^1.8.0:
integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g== integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==
axe-core@^4.9.1: axe-core@^4.9.1:
version "4.9.1" version "4.10.0"
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59"
integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==
axobject-query@~3.1.1: axobject-query@~3.1.1:
version "3.1.1" version "3.1.1"
@ -3916,7 +3919,7 @@ chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5" escape-string-regexp "^1.0.5"
supports-color "^5.3.0" supports-color "^5.3.0"
chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@ -4448,11 +4451,11 @@ cypress@*:
yauzl "^2.10.0" yauzl "^2.10.0"
cypress@^13.6.6: cypress@^13.6.6:
version "13.12.0" version "13.13.2"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.12.0.tgz#1a4ea89b7fa6855e32bc02eaf5e25fc45b9e273f" resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.13.2.tgz#c71f8d92056c430b1b879e5313f6de25ccce0eda"
integrity sha512-udzS2JilmI9ApO/UuqurEwOvThclin5ntz7K0BtnHBs+tg2Bl9QShLISXpSEMDv/u8b6mqdoAdyKeZiSqKWL8g== integrity sha512-PvJQU33933NvS1StfzEb8/mu2kMy4dABwCF+yd5Bi7Qly1HOVf+Bufrygee/tlmty/6j5lX+KIi8j9Q3JUMbhA==
dependencies: dependencies:
"@cypress/request" "^3.0.0" "@cypress/request" "^3.0.1"
"@cypress/xvfb" "^1.2.4" "@cypress/xvfb" "^1.2.4"
"@types/sinonjs__fake-timers" "8.1.1" "@types/sinonjs__fake-timers" "8.1.1"
"@types/sizzle" "^2.3.2" "@types/sizzle" "^2.3.2"
@ -4491,7 +4494,7 @@ cypress@^13.6.6:
request-progress "^3.0.0" request-progress "^3.0.0"
semver "^7.5.3" semver "^7.5.3"
supports-color "^8.1.1" supports-color "^8.1.1"
tmp "~0.2.1" tmp "~0.2.3"
untildify "^4.0.0" untildify "^4.0.0"
yauzl "^2.10.0" yauzl "^2.10.0"
@ -4633,9 +4636,9 @@ dateformat@^5.0.3:
integrity sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA== integrity sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA==
dayjs@^1.10.4: dayjs@^1.10.4:
version "1.11.11" version "1.11.12"
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.12.tgz#5245226cc7f40a15bf52e0b99fd2a04669ccac1d"
integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== integrity sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==
debounce@^1.2.1: debounce@^1.2.1:
version "1.2.1" version "1.2.1"
@ -4657,9 +4660,9 @@ debug@^3.1.0, debug@^3.2.7:
ms "^2.1.1" ms "^2.1.1"
debug@^4.1.1, debug@^4.3.4: debug@^4.1.1, debug@^4.3.4:
version "4.3.5" version "4.3.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
dependencies: dependencies:
ms "2.1.2" ms "2.1.2"
@ -4905,6 +4908,13 @@ ecdsa-sig-formatter@1.0.11:
dependencies: dependencies:
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
ejs@^3.1.10:
version "3.1.10"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b"
integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==
dependencies:
jake "^10.8.5"
electron-to-chromium@^1.4.535: electron-to-chromium@^1.4.535:
version "1.4.561" version "1.4.561"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.561.tgz#816f31d9ae01fe58abbf469fca7e125b16befd85" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.561.tgz#816f31d9ae01fe58abbf469fca7e125b16befd85"
@ -4938,9 +4948,9 @@ end-of-stream@^1.1.0:
once "^1.4.0" once "^1.4.0"
enhanced-resolve@^5.12.0: enhanced-resolve@^5.12.0:
version "5.17.0" version "5.17.1"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15"
integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==
dependencies: dependencies:
graceful-fs "^4.2.4" graceful-fs "^4.2.4"
tapable "^2.2.0" tapable "^2.2.0"
@ -5155,11 +5165,11 @@ escape-string-regexp@^4.0.0:
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-config-next@^14.0.4: eslint-config-next@^14.0.4:
version "14.2.4" version "14.2.5"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.4.tgz#eb0bedfe4a894bc2aea918214bb5243ee4fa7d4b" resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.5.tgz#cdd43d89047eb7391ba25445d5855b4600b6adb9"
integrity sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw== integrity sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==
dependencies: dependencies:
"@next/eslint-plugin-next" "14.2.4" "@next/eslint-plugin-next" "14.2.5"
"@rushstack/eslint-patch" "^1.3.3" "@rushstack/eslint-patch" "^1.3.3"
"@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0"
eslint-import-resolver-node "^0.3.6" eslint-import-resolver-node "^0.3.6"
@ -5283,9 +5293,9 @@ eslint-plugin-prettier@^4.0.0:
prettier-linter-helpers "^1.0.0" prettier-linter-helpers "^1.0.0"
eslint-plugin-promise@^6.1.1: eslint-plugin-promise@^6.1.1:
version "6.2.0" version "6.6.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.2.0.tgz#e24ab0e3c0a25fa227d98d9ff612156b5af15945" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a"
integrity sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA== integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==
"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705":
version "4.6.2" version "4.6.2"
@ -5293,28 +5303,28 @@ eslint-plugin-promise@^6.1.1:
integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==
eslint-plugin-react@^7.33.2: eslint-plugin-react@^7.33.2:
version "7.34.3" version "7.35.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41"
integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==
dependencies: dependencies:
array-includes "^3.1.8" array-includes "^3.1.8"
array.prototype.findlast "^1.2.5" array.prototype.findlast "^1.2.5"
array.prototype.flatmap "^1.3.2" array.prototype.flatmap "^1.3.2"
array.prototype.toreversed "^1.1.2"
array.prototype.tosorted "^1.1.4" array.prototype.tosorted "^1.1.4"
doctrine "^2.1.0" doctrine "^2.1.0"
es-iterator-helpers "^1.0.19" es-iterator-helpers "^1.0.19"
estraverse "^5.3.0" estraverse "^5.3.0"
hasown "^2.0.2"
jsx-ast-utils "^2.4.1 || ^3.0.0" jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.1.2" minimatch "^3.1.2"
object.entries "^1.1.8" object.entries "^1.1.8"
object.fromentries "^2.0.8" object.fromentries "^2.0.8"
object.hasown "^1.1.4"
object.values "^1.2.0" object.values "^1.2.0"
prop-types "^15.8.1" prop-types "^15.8.1"
resolve "^2.0.0-next.5" resolve "^2.0.0-next.5"
semver "^6.3.1" semver "^6.3.1"
string.prototype.matchall "^4.0.11" string.prototype.matchall "^4.0.11"
string.prototype.repeat "^1.0.0"
eslint-scope@^5.1.1: eslint-scope@^5.1.1:
version "5.1.1" version "5.1.1"
@ -5661,6 +5671,13 @@ file-entry-cache@^7.0.0:
dependencies: dependencies:
flat-cache "^3.2.0" flat-cache "^3.2.0"
filelist@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
dependencies:
minimatch "^5.0.1"
fill-range@^7.1.1: fill-range@^7.1.1:
version "7.1.1" version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
@ -5794,7 +5811,7 @@ function-bind@^1.1.2:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: function.prototype.name@^1.1.6:
version "1.1.6" version "1.1.6"
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
@ -5869,9 +5886,9 @@ get-symbol-description@^1.0.2:
get-intrinsic "^1.2.4" get-intrinsic "^1.2.4"
get-tsconfig@^4.5.0: get-tsconfig@^4.5.0:
version "4.7.5" version "4.7.6"
resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a"
integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==
dependencies: dependencies:
resolve-pkg-maps "^1.0.0" resolve-pkg-maps "^1.0.0"
@ -6373,9 +6390,9 @@ is-ci@^3.0.1:
ci-info "^3.2.0" ci-info "^3.2.0"
is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1:
version "2.14.0" version "2.15.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea"
integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==
dependencies: dependencies:
hasown "^2.0.2" hasown "^2.0.2"
@ -6610,9 +6627,9 @@ isarray@^2.0.5:
integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
isbot@^5.1.1: isbot@^5.1.1:
version "5.1.11" version "5.1.13"
resolved "https://registry.yarnpkg.com/isbot/-/isbot-5.1.11.tgz#55e91e887c806a5f07d18ce04c2efe194215ba36" resolved "https://registry.yarnpkg.com/isbot/-/isbot-5.1.13.tgz#c291ae9f33d346c070648cb44d6ab2bb163650d1"
integrity sha512-Asuou7OsKVbATgXlrlqdeSRw4fYnD6CNcc0IXy1f5m1AImL2S6IP0xRcRRzjGjoARbegvnBnju9kk5z/Itf70Q== integrity sha512-RXtBib4m9zChSb+187EpNQML7Z3u2i34zDdqcRFZnqSJs0xdh91xzJytc5apYVg+9Y4NGnUQ0AIeJvX9FAnCUw==
isexe@^2.0.0: isexe@^2.0.0:
version "2.0.0" version "2.0.0"
@ -6697,6 +6714,16 @@ jackspeak@^2.3.5:
optionalDependencies: optionalDependencies:
"@pkgjs/parseargs" "^0.11.0" "@pkgjs/parseargs" "^0.11.0"
jake@^10.8.5:
version "10.9.2"
resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f"
integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==
dependencies:
async "^3.2.3"
chalk "^4.0.2"
filelist "^1.0.4"
minimatch "^3.1.2"
jest-changed-files@^29.7.0: jest-changed-files@^29.7.0:
version "29.7.0" version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a"
@ -7527,9 +7554,9 @@ lower-case@^2.0.2:
tslib "^2.0.3" tslib "^2.0.3"
lru-cache@^10.2.0: lru-cache@^10.2.0:
version "10.3.0" version "10.4.3"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
lru-cache@^5.1.1: lru-cache@^5.1.1:
version "5.1.1" version "5.1.1"
@ -7601,12 +7628,12 @@ mathml-tag-names@^2.1.3:
integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
maxmind@^4.3.6: maxmind@^4.3.6:
version "4.3.20" version "4.3.21"
resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.3.20.tgz#1b85c4b0d9a8df072c5cbe50dc5c54c130a02889" resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.3.21.tgz#cc3af09775e9b96434a56b6ac63c9bf4878d23b8"
integrity sha512-xwnLGghs96DyNK3ANs1jzW8+JwS6pBQ3eTh3kNsi23n5wySZb9FgqCghmde5JZFOv23bxGehcyh6lT522llNKw== integrity sha512-orda4yI01roTa4pP5Jf43u5HPOoEIGaLudTn9cdgCPyZDPipTJdbz1boZQR9QE96hvwNDrJwt1ak9vHIE6iZSQ==
dependencies: dependencies:
mmdb-lib "2.1.1" mmdb-lib "2.1.1"
tiny-lru "11.2.6" tiny-lru "11.2.11"
md5@^2.3.0: md5@^2.3.0:
version "2.3.0" version "2.3.0"
@ -8050,15 +8077,6 @@ object.groupby@^1.0.1:
define-properties "^1.2.1" define-properties "^1.2.1"
es-abstract "^1.23.2" es-abstract "^1.23.2"
object.hasown@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc"
integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==
dependencies:
define-properties "^1.2.1"
es-abstract "^1.23.2"
es-object-atoms "^1.0.0"
object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
@ -8258,10 +8276,10 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
picocolors@^1.0.0: picocolors@^1.0.0, picocolors@^1.0.1:
version "1.0.0" version "1.0.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
version "2.3.1" version "2.3.1"
@ -8880,12 +8898,12 @@ postcss@^8.4.28:
source-map-js "^1.0.2" source-map-js "^1.0.2"
postcss@^8.4.31: postcss@^8.4.31:
version "8.4.38" version "8.4.40"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.40.tgz#eb81f2a4dd7668ed869a6db25999e02e9ad909d8"
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== integrity sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==
dependencies: dependencies:
nanoid "^3.3.7" nanoid "^3.3.7"
picocolors "^1.0.0" picocolors "^1.0.1"
source-map-js "^1.2.0" source-map-js "^1.2.0"
prelude-ls@^1.2.1: prelude-ls@^1.2.1:
@ -8919,12 +8937,12 @@ pretty-format@^29.0.0, pretty-format@^29.7.0:
ansi-styles "^5.0.0" ansi-styles "^5.0.0"
react-is "^18.0.0" react-is "^18.0.0"
prisma@5.16.2: prisma@5.17.0:
version "5.16.2" version "5.17.0"
resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.16.2.tgz#f46f130550bc148e603d25e06e82263fa6ab68e8" resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.17.0.tgz#267b43921ab94805b010537cffa5ccaf530fa066"
integrity sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A== integrity sha512-m4UWkN5lBE6yevqeOxEvmepnL5cNPEjzMw2IqDB59AcEV6w7D8vGljDLd1gPFH+W6gUxw9x7/RmN5dCS/WTPxA==
dependencies: dependencies:
"@prisma/engines" "5.16.2" "@prisma/engines" "5.17.0"
process@^0.11.10: process@^0.11.10:
version "0.11.10" version "0.11.10"
@ -9025,10 +9043,10 @@ randombytes@^2.1.0:
dependencies: dependencies:
safe-buffer "^5.1.0" safe-buffer "^5.1.0"
react-basics@^0.123.0: react-basics@^0.124.0:
version "0.123.0" version "0.124.0"
resolved "https://registry.yarnpkg.com/react-basics/-/react-basics-0.123.0.tgz#8b18c1c1a235858dd0d1e329d5b1c3ac9ab48df3" resolved "https://registry.yarnpkg.com/react-basics/-/react-basics-0.124.0.tgz#c2c783f634aadccc13aae8a770960d298a10ebe4"
integrity sha512-5K5b6pSp0uiBMytDeSlWuAHRjkLfwpySAIc1jKM4nuR8E6jf6UxGn4W2I7jI8p220vmdeK8Phsyxht0UxvIxHA== integrity sha512-5E2chyDE0PKKQ9x7kKM18/6UjFsjkPx7mfbTJb4PsWCC5gPi6m5zX7uPWF7omu4/I5Oms/nj16D3pa350WXIyw==
dependencies: dependencies:
"@react-spring/web" "^9.7.3" "@react-spring/web" "^9.7.3"
classnames "^2.3.1" classnames "^2.3.1"
@ -9600,9 +9618,9 @@ semver@^7.3.4, semver@^7.3.7:
lru-cache "^6.0.0" lru-cache "^6.0.0"
semver@^7.5.3, semver@^7.5.4: semver@^7.5.3, semver@^7.5.4:
version "7.6.2" version "7.6.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
serialize-javascript@^4.0.0: serialize-javascript@^4.0.0:
version "4.0.0" version "4.0.0"
@ -9919,6 +9937,14 @@ string.prototype.padend@^3.0.0:
define-properties "^1.2.0" define-properties "^1.2.0"
es-abstract "^1.22.1" es-abstract "^1.22.1"
string.prototype.repeat@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a"
integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.17.5"
string.prototype.trim@^1.2.9: string.prototype.trim@^1.2.9:
version "1.2.9" version "1.2.9"
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
@ -10247,12 +10273,12 @@ tiny-invariant@^1.0.6:
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642"
integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==
tiny-lru@11.2.6: tiny-lru@11.2.11:
version "11.2.6" version "11.2.11"
resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-11.2.6.tgz#86a4fd0ad615eac1639adf92010e8b944e209fdb" resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-11.2.11.tgz#5089a6a4a157f5a97b82aa930b44d550ac5c4778"
integrity sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA== integrity sha512-27BIW0dIWTYYoWNnqSmoNMKe5WIbkXsc0xaCQHd3/3xT2XMuMJrzHdrO9QBFR14emBz1Bu0dOAs2sCBBrvgPQA==
tmp@~0.2.1: tmp@~0.2.1, tmp@~0.2.3:
version "0.2.3" version "0.2.3"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae"
integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==
@ -10312,11 +10338,12 @@ ts-api-utils@^1.0.1:
integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
ts-jest@^29.1.2: ts-jest@^29.1.2:
version "29.1.5" version "29.2.4"
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.5.tgz#d6c0471cc78bffa2cb4664a0a6741ef36cfe8f69" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.4.tgz#38ccf487407d7a63054a72689f6f99b075e296e5"
integrity sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg== integrity sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==
dependencies: dependencies:
bs-logger "0.x" bs-logger "0.x"
ejs "^3.1.10"
fast-json-stable-stringify "2.x" fast-json-stable-stringify "2.x"
jest-util "^29.0.0" jest-util "^29.0.0"
json5 "^2.2.3" json5 "^2.2.3"
@ -10487,9 +10514,9 @@ typescript@^4.0, typescript@^4.5:
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
typescript@^5.5.3: typescript@^5.5.3:
version "5.5.3" version "5.5.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
unbox-primitive@^1.0.2: unbox-primitive@^1.0.2:
version "1.0.2" version "1.0.2"
@ -10506,6 +10533,11 @@ undici-types@~5.26.4:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
undici-types@~6.13.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.13.0.tgz#e3e79220ab8c81ed1496b5812471afd7cf075ea5"
integrity sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==
unicode-canonical-property-names-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
@ -10668,12 +10700,12 @@ which-boxed-primitive@^1.0.2:
is-symbol "^1.0.3" is-symbol "^1.0.3"
which-builtin-type@^1.1.3: which-builtin-type@^1.1.3:
version "1.1.3" version "1.1.4"
resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3"
integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==
dependencies: dependencies:
function.prototype.name "^1.1.5" function.prototype.name "^1.1.6"
has-tostringtag "^1.0.0" has-tostringtag "^1.0.2"
is-async-function "^2.0.0" is-async-function "^2.0.0"
is-date-object "^1.0.5" is-date-object "^1.0.5"
is-finalizationregistry "^1.0.2" is-finalizationregistry "^1.0.2"
@ -10682,10 +10714,10 @@ which-builtin-type@^1.1.3:
is-weakref "^1.0.2" is-weakref "^1.0.2"
isarray "^2.0.5" isarray "^2.0.5"
which-boxed-primitive "^1.0.2" which-boxed-primitive "^1.0.2"
which-collection "^1.0.1" which-collection "^1.0.2"
which-typed-array "^1.1.9" which-typed-array "^1.1.15"
which-collection@^1.0.1: which-collection@^1.0.1, which-collection@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
@ -10695,7 +10727,7 @@ which-collection@^1.0.1:
is-weakmap "^2.0.2" is-weakmap "^2.0.2"
is-weakset "^2.0.3" is-weakset "^2.0.3"
which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15:
version "1.1.15" version "1.1.15"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==