diff --git a/db/clickhouse/schema.sql b/db/clickhouse/schema.sql
index 53fba1fb..e36ddf61 100644
--- a/db/clickhouse/schema.sql
+++ b/db/clickhouse/schema.sql
@@ -66,4 +66,203 @@ CREATE TABLE umami.session_data
)
engine = MergeTree
ORDER BY (website_id, session_id, data_key, created_at)
- SETTINGS index_granularity = 8192;
\ No newline at end of file
+ SETTINGS index_granularity = 8192;
+
+-- stats hourly
+CREATE TABLE umami.website_event_stats_hourly
+(
+ website_id UUID,
+ session_id UUID,
+ visit_id UUID,
+ hostname LowCardinality(String),
+ browser LowCardinality(String),
+ os LowCardinality(String),
+ device LowCardinality(String),
+ country LowCardinality(String),
+ subdivision1 LowCardinality(String),
+ city String,
+ entry_url AggregateFunction(argMin, String, DateTime('UTC')),
+ exit_url AggregateFunction(argMax, String, DateTime('UTC')),
+ url_path SimpleAggregateFunction(groupArrayArray, Array(String)),
+ url_query SimpleAggregateFunction(groupArrayArray, Array(String)),
+ referrer_domain SimpleAggregateFunction(groupArrayArray, Array(String)),
+ page_title SimpleAggregateFunction(groupArrayArray, Array(String)),
+ event_type UInt32,
+ event_name SimpleAggregateFunction(groupArrayArray, Array(String)),
+ views SimpleAggregateFunction(sum, UInt64),
+ min_time SimpleAggregateFunction(min, DateTime('UTC')),
+ max_time SimpleAggregateFunction(max, DateTime('UTC')),
+ created_at Datetime('UTC')
+)
+ENGINE = AggregatingMergeTree
+PARTITION BY toYYYYMM(created_at)
+ORDER BY (
+ website_id,
+ toStartOfHour(created_at),
+ cityHash64(visit_id),
+ visit_id
+)
+SAMPLE BY cityHash64(visit_id)
+TTL created_at + INTERVAL 10 DAY;
+
+CREATE MATERIALIZED VIEW umami.website_event_stats_hourly_mv
+TO umami.website_event_stats_hourly
+AS
+SELECT
+ website_id,
+ session_id,
+ visit_id,
+ hostname,
+ browser,
+ os,
+ device,
+ country,
+ subdivision1,
+ city,
+ entry_url,
+ exit_url,
+ url_paths as url_path,
+ url_query,
+ referrer_domain,
+ page_title,
+ event_type,
+ event_name,
+ views,
+ min_time,
+ max_time,
+ timestamp as created_at
+FROM (SELECT
+ website_id,
+ session_id,
+ visit_id,
+ hostname,
+ browser,
+ os,
+ device,
+ country,
+ subdivision1,
+ city,
+ argMinState(url_path, created_at) entry_url,
+ argMaxState(url_path, created_at) exit_url,
+ arrayFilter(x -> x != '', groupArray(url_path)) as url_paths,
+ arrayFilter(x -> x != '', groupArray(url_query)) url_query,
+ arrayFilter(x -> x != '', groupArray(referrer_domain)) referrer_domain,
+ arrayFilter(x -> x != '', groupArray(page_title)) page_title,
+ event_type,
+ if(event_type = 2, groupArray(event_name), []) event_name,
+ sumIf(1, event_type = 1) views,
+ min(created_at) min_time,
+ max(created_at) max_time,
+ toStartOfHour(created_at) timestamp
+FROM umami.website_event
+GROUP BY website_id,
+ session_id,
+ visit_id,
+ hostname,
+ browser,
+ os,
+ device,
+ country,
+ subdivision1,
+ city,
+ event_type,
+ timestamp);
+
+-- stats daily
+CREATE TABLE umami.website_event_stats_daily
+(
+ website_id UUID,
+ session_id UUID,
+ visit_id UUID,
+ hostname LowCardinality(String),
+ browser LowCardinality(String),
+ os LowCardinality(String),
+ device LowCardinality(String),
+ country LowCardinality(String),
+ subdivision1 LowCardinality(String),
+ city String,
+ entry_url AggregateFunction(argMin, String, DateTime('UTC')),
+ exit_url AggregateFunction(argMax, String, DateTime('UTC')),
+ url_path SimpleAggregateFunction(groupArrayArray, Array(String)),
+ url_query SimpleAggregateFunction(groupArrayArray, Array(String)),
+ referrer_domain SimpleAggregateFunction(groupArrayArray, Array(String)),
+ page_title SimpleAggregateFunction(groupArrayArray, Array(String)),
+ event_type UInt32,
+ event_name SimpleAggregateFunction(groupArrayArray, Array(String)),
+ views SimpleAggregateFunction(sum, UInt64),
+ min_time SimpleAggregateFunction(min, DateTime('UTC')),
+ max_time SimpleAggregateFunction(max, DateTime('UTC')),
+ created_at Datetime('UTC')
+)
+ENGINE = AggregatingMergeTree
+PARTITION BY toYYYYMM(created_at)
+ORDER BY (
+ website_id,
+ toStartOfDay(created_at),
+ cityHash64(visit_id),
+ visit_id
+)
+SAMPLE BY cityHash64(visit_id);
+
+CREATE MATERIALIZED VIEW umami.website_event_stats_daily_mv
+TO umami.website_event_stats_daily
+AS
+SELECT
+ website_id,
+ session_id,
+ visit_id,
+ hostname,
+ browser,
+ os,
+ device,
+ country,
+ subdivision1,
+ city,
+ entry_url,
+ exit_url,
+ url_paths as url_path,
+ url_query,
+ referrer_domain,
+ page_title,
+ event_type,
+ event_name,
+ views,
+ min_time,
+ max_time,
+ timestamp as created_at
+FROM (SELECT
+ website_id,
+ session_id,
+ visit_id,
+ hostname,
+ browser,
+ os,
+ device,
+ country,
+ subdivision1,
+ city,
+ argMinState(url_path, created_at) entry_url,
+ argMaxState(url_path, created_at) exit_url,
+ arrayFilter(x -> x != '', groupArray(url_path)) as url_paths,
+ arrayFilter(x -> x != '', groupArray(url_query)) url_query,
+ arrayFilter(x -> x != '', groupArray(referrer_domain)) referrer_domain,
+ arrayFilter(x -> x != '', groupArray(page_title)) page_title,
+ event_type,
+ if(event_type = 2, groupArray(event_name), []) event_name,
+ sumIf(1, event_type = 1) views,
+ min(created_at) min_time,
+ max(created_at) max_time,
+ toStartOfDay(created_at) timestamp
+FROM umami.website_event
+GROUP BY website_id,
+ session_id,
+ visit_id,
+ hostname,
+ browser,
+ os,
+ device,
+ country,
+ subdivision1,
+ city,
+ event_type,
+ timestamp);
\ No newline at end of file
diff --git a/package.json b/package.json
index d002388f..f14e552d 100644
--- a/package.json
+++ b/package.json
@@ -64,9 +64,9 @@
".next/cache"
],
"dependencies": {
- "@clickhouse/client": "^1.0.2",
+ "@clickhouse/client": "^1.3.0",
"@fontsource/inter": "^4.5.15",
- "@prisma/client": "5.14.0",
+ "@prisma/client": "5.16.2",
"@prisma/extension-read-replicas": "^0.3.0",
"@react-spring/web": "^9.7.3",
"@tanstack/react-query": "^5.28.6",
@@ -98,11 +98,11 @@
"maxmind": "^4.3.6",
"md5": "^2.3.0",
"moment-timezone": "^0.5.35",
- "next": "14.2.3",
+ "next": "14.2.4",
"next-basics": "^0.39.0",
"node-fetch": "^3.2.8",
"npm-run-all": "^4.1.5",
- "prisma": "5.14.0",
+ "prisma": "5.16.2",
"react": "^18.2.0",
"react-basics": "^0.123.0",
"react-beautiful-dnd": "^13.1.0",
@@ -175,6 +175,6 @@
"tar": "^6.1.2",
"ts-jest": "^29.1.2",
"ts-node": "^10.9.1",
- "typescript": "^5.4.3"
+ "typescript": "^5.5.3"
}
}
diff --git a/public/intl/messages/ca-ES.json b/public/intl/messages/ca-ES.json
index 94c7d3d4..dc7b27a8 100644
--- a/public/intl/messages/ca-ES.json
+++ b/public/intl/messages/ca-ES.json
@@ -152,7 +152,7 @@
"label.compare": [
{
"type": 0,
- "value": "Compare"
+ "value": "Comparar"
}
],
"label.confirm": [
@@ -182,7 +182,7 @@
"label.count": [
{
"type": 0,
- "value": "Count"
+ "value": "Recompte"
}
],
"label.countries": [
@@ -236,7 +236,7 @@
"label.current": [
{
"type": 0,
- "value": "Current"
+ "value": "Actual"
}
],
"label.current-password": [
@@ -398,13 +398,13 @@
"label.end-step": [
{
"type": 0,
- "value": "End Step"
+ "value": "Pas Final"
}
],
"label.entry": [
{
"type": 0,
- "value": "Entry URL"
+ "value": "URL d'entrada"
}
],
"label.event": [
@@ -428,7 +428,7 @@
"label.exit": [
{
"type": 0,
- "value": "Exit URL"
+ "value": "URL de sortida"
}
],
"label.false": [
@@ -488,19 +488,19 @@
"label.goal": [
{
"type": 0,
- "value": "Goal"
+ "value": "Meta"
}
],
"label.goals": [
{
"type": 0,
- "value": "Goals"
+ "value": "Metes"
}
],
"label.goals-description": [
{
"type": 0,
- "value": "Track your goals for pageviews and events."
+ "value": "Feu un seguiment de les seves metes per a pàgines vistes i esdeveniments."
}
],
"label.greater-than": [
@@ -518,13 +518,13 @@
"label.host": [
{
"type": 0,
- "value": "Host"
+ "value": "Amfitrió"
}
],
"label.hosts": [
{
"type": 0,
- "value": "Hosts"
+ "value": "Amfitrions"
}
],
"label.insights": [
@@ -578,13 +578,13 @@
"label.journey": [
{
"type": 0,
- "value": "Journey"
+ "value": "Trajecte"
}
],
"label.journey-description": [
{
"type": 0,
- "value": "Understand how users navigate through your website."
+ "value": "Entengui com naveguen els usuaris pel seu lloc web."
}
],
"label.language": [
@@ -777,7 +777,7 @@
"value": [
{
"type": 0,
- "value": "record"
+ "value": "registre"
}
]
},
@@ -785,7 +785,7 @@
"value": [
{
"type": 0,
- "value": "records"
+ "value": "registres"
}
]
}
@@ -874,19 +874,19 @@
"label.previous": [
{
"type": 0,
- "value": "Previous"
+ "value": "Anterior"
}
],
"label.previous-period": [
{
"type": 0,
- "value": "Previous period"
+ "value": "Període anterior"
}
],
"label.previous-year": [
{
"type": 0,
- "value": "Previous year"
+ "value": "Any anterior"
}
],
"label.profile": [
@@ -898,7 +898,7 @@
"label.property": [
{
"type": 0,
- "value": "Property"
+ "value": "Propietat"
}
],
"label.queries": [
@@ -1090,7 +1090,7 @@
"label.start-step": [
{
"type": 0,
- "value": "Start Step"
+ "value": "Pas inicial"
}
],
"label.steps": [
@@ -1360,7 +1360,7 @@
"label.views-per-visit": [
{
"type": 0,
- "value": "Views per visit"
+ "value": "Vistes per visita"
}
],
"label.visit-duration": [
@@ -1462,7 +1462,7 @@
"message.collected-data": [
{
"type": 0,
- "value": "Collected data"
+ "value": "Dades recol·lectades"
}
],
"message.confirm-delete": [
@@ -1790,7 +1790,7 @@
"message.visitors-dropped-off": [
{
"type": 0,
- "value": "Els visitants han sortit"
+ "value": "Visitants han sortit"
}
]
}
diff --git a/public/intl/messages/de-DE.json b/public/intl/messages/de-DE.json
index 2482b208..a7d1f1ab 100644
--- a/public/intl/messages/de-DE.json
+++ b/public/intl/messages/de-DE.json
@@ -32,13 +32,13 @@
"label.add-member": [
{
"type": 0,
- "value": "Add member"
+ "value": "Mitglied hinzufügen"
}
],
"label.add-step": [
{
"type": 0,
- "value": "Add step"
+ "value": "Schritt hinzufügen"
}
],
"label.add-website": [
@@ -104,7 +104,7 @@
"label.breakdown": [
{
"type": 0,
- "value": "Breakdown"
+ "value": "Aufschlüsselung"
}
],
"label.browser": [
@@ -152,7 +152,7 @@
"label.compare": [
{
"type": 0,
- "value": "Compare"
+ "value": "Vergleich"
}
],
"label.confirm": [
@@ -182,7 +182,7 @@
"label.count": [
{
"type": 0,
- "value": "Count"
+ "value": "Anzahl"
}
],
"label.countries": [
@@ -200,7 +200,7 @@
"label.create": [
{
"type": 0,
- "value": "Create"
+ "value": "Erstellen"
}
],
"label.create-report": [
@@ -230,13 +230,13 @@
"label.created-by": [
{
"type": 0,
- "value": "Created By"
+ "value": "Erstellt von"
}
],
"label.current": [
{
"type": 0,
- "value": "Current"
+ "value": "Aktuell"
}
],
"label.current-password": [
@@ -296,7 +296,7 @@
"label.delete-report": [
{
"type": 0,
- "value": "Delete report"
+ "value": "Bericht löschen"
}
],
"label.delete-team": [
@@ -386,7 +386,7 @@
"label.edit-member": [
{
"type": 0,
- "value": "Edit member"
+ "value": "Mitglied bearbeiten"
}
],
"label.enable-share-url": [
@@ -398,7 +398,7 @@
"label.end-step": [
{
"type": 0,
- "value": "End Step"
+ "value": "Schritt beenden"
}
],
"label.entry": [
@@ -482,25 +482,25 @@
"label.funnel-description": [
{
"type": 0,
- "value": "Understand the conversion and drop-off rate of users."
+ "value": "Verstehe die Konversions- und Dropoffrate von Nutzern."
}
],
"label.goal": [
{
"type": 0,
- "value": "Goal"
+ "value": "Ziel"
}
],
"label.goals": [
{
"type": 0,
- "value": "Goals"
+ "value": "Ziele"
}
],
"label.goals-description": [
{
"type": 0,
- "value": "Track your goals for pageviews and events."
+ "value": "Verfolgen Sie Ihre Ziele für Aufrufe und Events."
}
],
"label.greater-than": [
@@ -536,7 +536,7 @@
"label.insights-description": [
{
"type": 0,
- "value": "Dive deeper into your data by using segments and filters."
+ "value": "Tauchen Sie tiefer in Ihre Daten mit Filtern und Segmenten ein."
}
],
"label.is": [
@@ -584,7 +584,7 @@
"label.journey-description": [
{
"type": 0,
- "value": "Understand how users navigate through your website."
+ "value": "Verstehen Sie, wie Nutzer Ihre Website navigieren."
}
],
"label.language": [
@@ -686,7 +686,7 @@
"label.manage": [
{
"type": 0,
- "value": "Manage"
+ "value": "Verwalten"
}
],
"label.manager": [
@@ -704,7 +704,7 @@
"label.member": [
{
"type": 0,
- "value": "Member"
+ "value": "Mitglied"
}
],
"label.members": [
@@ -734,7 +734,7 @@
"label.my-account": [
{
"type": 0,
- "value": "My account"
+ "value": "Mein Konto"
}
],
"label.my-websites": [
@@ -874,19 +874,19 @@
"label.previous": [
{
"type": 0,
- "value": "Previous"
+ "value": "Vorherige"
}
],
"label.previous-period": [
{
"type": 0,
- "value": "Previous period"
+ "value": "Vorheriger Zeitraum"
}
],
"label.previous-year": [
{
"type": 0,
- "value": "Previous year"
+ "value": "Vorheriges Jahr"
}
],
"label.profile": [
@@ -898,7 +898,7 @@
"label.property": [
{
"type": 0,
- "value": "Property"
+ "value": "Besitz"
}
],
"label.queries": [
@@ -970,7 +970,7 @@
"label.remove-member": [
{
"type": 0,
- "value": "Remove member"
+ "value": "Mitglied entfernen"
}
],
"label.reports": [
@@ -1006,7 +1006,7 @@
"label.retention-description": [
{
"type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
+ "value": "Messen Sie die Presenz Ihrer Website, indem Sie tracken wie oft Nutzer zurückkehren."
}
],
"label.role": [
@@ -1036,13 +1036,13 @@
"label.search": [
{
"type": 0,
- "value": "Search"
+ "value": "Suche"
}
],
"label.select": [
{
"type": 0,
- "value": "Select"
+ "value": "Auswählen"
}
],
"label.select-date": [
@@ -1054,7 +1054,7 @@
"label.select-role": [
{
"type": 0,
- "value": "Select role"
+ "value": "Rolle auswählen"
}
],
"label.select-website": [
@@ -1090,13 +1090,13 @@
"label.start-step": [
{
"type": 0,
- "value": "Start Step"
+ "value": "Schritt starten"
}
],
"label.steps": [
{
"type": 0,
- "value": "Steps"
+ "value": "Schritte"
}
],
"label.sum": [
@@ -1126,7 +1126,7 @@
"label.team-manager": [
{
"type": 0,
- "value": "Team manager"
+ "value": "Team-Manager"
}
],
"label.team-member": [
@@ -1234,13 +1234,13 @@
"label.transfer": [
{
"type": 0,
- "value": "Transfer"
+ "value": "Übertragung"
}
],
"label.transfer-website": [
{
"type": 0,
- "value": "Transfer website"
+ "value": "Website übertragen"
}
],
"label.true": [
@@ -1324,7 +1324,7 @@
"label.utm-description": [
{
"type": 0,
- "value": "Track your campaigns through UTM parameters."
+ "value": "Tracken Sie Ihre Kampagnen mit Hilfe von UTM Parametern."
}
],
"label.value": [
@@ -1360,7 +1360,7 @@
"label.views-per-visit": [
{
"type": 0,
- "value": "Views per visit"
+ "value": "Aufrufe pro Besuch"
}
],
"label.visit-duration": [
@@ -1378,7 +1378,7 @@
"label.visits": [
{
"type": 0,
- "value": "Visits"
+ "value": "Besuche"
}
],
"label.website": [
@@ -1414,7 +1414,7 @@
"message.action-confirmation": [
{
"type": 0,
- "value": "Type "
+ "value": "Tippen Sie "
},
{
"type": 1,
@@ -1422,7 +1422,7 @@
},
{
"type": 0,
- "value": " in the box below to confirm."
+ "value": " in das untenliegende Feld, um zu bestätigen."
}
],
"message.active-users": [
@@ -1462,7 +1462,7 @@
"message.collected-data": [
{
"type": 0,
- "value": "Collected data"
+ "value": "Gesammelte Daten"
}
],
"message.confirm-delete": [
@@ -1496,7 +1496,7 @@
"message.confirm-remove": [
{
"type": 0,
- "value": "Are you sure you want to remove "
+ "value": "Sind Sie sicher, dass Sie "
},
{
"type": 1,
@@ -1504,7 +1504,7 @@
},
{
"type": 0,
- "value": "?"
+ "value": " entfernen möchten?"
}
],
"message.confirm-reset": [
@@ -1524,7 +1524,7 @@
"message.delete-team-warning": [
{
"type": 0,
- "value": "Deleting a team will also delete all team websites."
+ "value": "Alle zugehörigen Websiten werden ebenfalls gelöscht."
}
],
"message.delete-website-warning": [
@@ -1708,25 +1708,25 @@
"message.transfer-team-website-to-user": [
{
"type": 0,
- "value": "Transfer this website to your account?"
+ "value": "Möchten Sie diese Website auf Ihr Konto übertragen?"
}
],
"message.transfer-user-website-to-team": [
{
"type": 0,
- "value": "Select the team to transfer this website to."
+ "value": "Wählen Sie das Team, auf das die Website übertragen wird."
}
],
"message.transfer-website": [
{
"type": 0,
- "value": "Transfer website ownership to your account or another team."
+ "value": "Übertragen Sie den Besitz der Website auf Ihren Account oder ein anderes Team."
}
],
"message.triggered-event": [
{
"type": 0,
- "value": "Triggered event"
+ "value": "Event ausgelöst"
}
],
"message.user-deleted": [
@@ -1738,7 +1738,7 @@
"message.viewed-page": [
{
"type": 0,
- "value": "Viewed page"
+ "value": "Seite besucht"
}
],
"message.visitor-log": [
@@ -1778,7 +1778,7 @@
"message.visitors-dropped-off": [
{
"type": 0,
- "value": "Visitors dropped off"
+ "value": "Besucher haben die Seite verlassen"
}
]
}
diff --git a/public/intl/messages/ko-KR.json b/public/intl/messages/ko-KR.json
index b2213cd8..deab1408 100644
--- a/public/intl/messages/ko-KR.json
+++ b/public/intl/messages/ko-KR.json
@@ -2,7 +2,7 @@
"label.access-code": [
{
"type": 0,
- "value": "Access code"
+ "value": "액세스 코드"
}
],
"label.actions": [
@@ -14,31 +14,31 @@
"label.activity-log": [
{
"type": 0,
- "value": "Activity log"
+ "value": "활동 기록"
}
],
"label.add": [
{
"type": 0,
- "value": "Add"
+ "value": "추가"
}
],
"label.add-description": [
{
"type": 0,
- "value": "Add description"
+ "value": "설명 추가"
}
],
"label.add-member": [
{
"type": 0,
- "value": "Add member"
+ "value": "멤버 추가"
}
],
"label.add-step": [
{
"type": 0,
- "value": "Add step"
+ "value": "단계 추가"
}
],
"label.add-website": [
@@ -56,7 +56,7 @@
"label.after": [
{
"type": 0,
- "value": "After"
+ "value": "이후"
}
],
"label.all": [
@@ -68,19 +68,19 @@
"label.all-time": [
{
"type": 0,
- "value": "All time"
+ "value": "전체 시간"
}
],
"label.analytics": [
{
"type": 0,
- "value": "Analytics"
+ "value": "분석"
}
],
"label.average": [
{
"type": 0,
- "value": "Average"
+ "value": "평균"
}
],
"label.back": [
@@ -92,7 +92,7 @@
"label.before": [
{
"type": 0,
- "value": "Before"
+ "value": "이전"
}
],
"label.bounce-rate": [
@@ -104,13 +104,13 @@
"label.breakdown": [
{
"type": 0,
- "value": "Breakdown"
+ "value": "세부 사항"
}
],
"label.browser": [
{
"type": 0,
- "value": "Browser"
+ "value": "브라우저"
}
],
"label.browsers": [
@@ -128,37 +128,37 @@
"label.change-password": [
{
"type": 0,
- "value": "비밀번호 변경"
+ "value": "비밀번호 변경하기"
}
],
"label.cities": [
{
"type": 0,
- "value": "Cities"
+ "value": "도시"
}
],
"label.city": [
{
"type": 0,
- "value": "City"
+ "value": "도시"
}
],
"label.clear-all": [
{
"type": 0,
- "value": "Clear all"
+ "value": "모두 지우기"
}
],
"label.compare": [
{
"type": 0,
- "value": "Compare"
+ "value": "비교"
}
],
"label.confirm": [
{
"type": 0,
- "value": "Confirm"
+ "value": "확인"
}
],
"label.confirm-password": [
@@ -170,19 +170,19 @@
"label.contains": [
{
"type": 0,
- "value": "Contains"
+ "value": "포함"
}
],
"label.continue": [
{
"type": 0,
- "value": "Continue"
+ "value": "계속"
}
],
"label.count": [
{
"type": 0,
- "value": "Count"
+ "value": "수"
}
],
"label.countries": [
@@ -194,49 +194,49 @@
"label.country": [
{
"type": 0,
- "value": "Country"
+ "value": "국가"
}
],
"label.create": [
{
"type": 0,
- "value": "Create"
+ "value": "생성"
}
],
"label.create-report": [
{
"type": 0,
- "value": "Create report"
+ "value": "리포트 생성"
}
],
"label.create-team": [
{
"type": 0,
- "value": "Create team"
+ "value": "팀 생성"
}
],
"label.create-user": [
{
"type": 0,
- "value": "Create user"
+ "value": "사용자 생성"
}
],
"label.created": [
{
"type": 0,
- "value": "Created"
+ "value": "생성됨"
}
],
"label.created-by": [
{
"type": 0,
- "value": "Created By"
+ "value": "작성자"
}
],
"label.current": [
{
"type": 0,
- "value": "Current"
+ "value": "현재"
}
],
"label.current-password": [
@@ -260,13 +260,13 @@
"label.data": [
{
"type": 0,
- "value": "Data"
+ "value": "데이터"
}
],
"label.date": [
{
"type": 0,
- "value": "Date"
+ "value": "날짜"
}
],
"label.date-range": [
@@ -278,7 +278,7 @@
"label.day": [
{
"type": 0,
- "value": "Day"
+ "value": "일"
}
],
"label.default-date-range": [
@@ -296,19 +296,19 @@
"label.delete-report": [
{
"type": 0,
- "value": "Delete report"
+ "value": "리포트 삭제"
}
],
"label.delete-team": [
{
"type": 0,
- "value": "Delete team"
+ "value": "팀 삭제"
}
],
"label.delete-user": [
{
"type": 0,
- "value": "Delete user"
+ "value": "사용자 삭제"
}
],
"label.delete-website": [
@@ -320,7 +320,7 @@
"label.description": [
{
"type": 0,
- "value": "Description"
+ "value": "설명"
}
],
"label.desktop": [
@@ -332,13 +332,13 @@
"label.details": [
{
"type": 0,
- "value": "Details"
+ "value": "세부 사항"
}
],
"label.device": [
{
"type": 0,
- "value": "Device"
+ "value": "기기"
}
],
"label.devices": [
@@ -356,7 +356,7 @@
"label.does-not-contain": [
{
"type": 0,
- "value": "Does not contain"
+ "value": "포함하지 않음"
}
],
"label.domain": [
@@ -368,7 +368,7 @@
"label.dropoff": [
{
"type": 0,
- "value": "Dropoff"
+ "value": "이탈"
}
],
"label.edit": [
@@ -380,13 +380,13 @@
"label.edit-dashboard": [
{
"type": 0,
- "value": "Edit dashboard"
+ "value": "대시보드 편집"
}
],
"label.edit-member": [
{
"type": 0,
- "value": "Edit member"
+ "value": "회원 편집"
}
],
"label.enable-share-url": [
@@ -398,25 +398,25 @@
"label.end-step": [
{
"type": 0,
- "value": "End Step"
+ "value": "종료 단계"
}
],
"label.entry": [
{
"type": 0,
- "value": "Entry URL"
+ "value": "입장 URL"
}
],
"label.event": [
{
"type": 0,
- "value": "Event"
+ "value": "이벤트"
}
],
"label.event-data": [
{
"type": 0,
- "value": "Event data"
+ "value": "이벤트 데이터"
}
],
"label.events": [
@@ -428,31 +428,31 @@
"label.exit": [
{
"type": 0,
- "value": "Exit URL"
+ "value": "퇴장 URL"
}
],
"label.false": [
{
"type": 0,
- "value": "False"
+ "value": "거짓"
}
],
"label.field": [
{
"type": 0,
- "value": "Field"
+ "value": "필드"
}
],
"label.fields": [
{
"type": 0,
- "value": "Fields"
+ "value": "필드"
}
],
"label.filter": [
{
"type": 0,
- "value": "Filter"
+ "value": "필터"
}
],
"label.filter-combined": [
@@ -470,133 +470,133 @@
"label.filters": [
{
"type": 0,
- "value": "Filters"
+ "value": "필터"
}
],
"label.funnel": [
{
"type": 0,
- "value": "Funnel"
+ "value": "퍼널"
}
],
"label.funnel-description": [
{
"type": 0,
- "value": "Understand the conversion and drop-off rate of users."
+ "value": "사용자 전환율 및 이탈률을 살펴보세요."
}
],
"label.goal": [
{
"type": 0,
- "value": "Goal"
+ "value": "목표"
}
],
"label.goals": [
{
"type": 0,
- "value": "Goals"
+ "value": "목표"
}
],
"label.goals-description": [
{
"type": 0,
- "value": "Track your goals for pageviews and events."
+ "value": "페이지뷰 및 이벤트 목표를 추적합니다."
}
],
"label.greater-than": [
{
"type": 0,
- "value": "Greater than"
+ "value": "이상"
}
],
"label.greater-than-equals": [
{
"type": 0,
- "value": "Greater than or equals"
+ "value": "이상"
}
],
"label.host": [
{
"type": 0,
- "value": "Host"
+ "value": "호스트"
}
],
"label.hosts": [
{
"type": 0,
- "value": "Hosts"
+ "value": "호스트"
}
],
"label.insights": [
{
"type": 0,
- "value": "Insights"
+ "value": "인사이트"
}
],
"label.insights-description": [
{
"type": 0,
- "value": "Dive deeper into your data by using segments and filters."
+ "value": "세그먼트 및 필터를 사용하여 데이터를 더 자세히 살펴보세요."
}
],
"label.is": [
{
"type": 0,
- "value": "Is"
+ "value": "해당"
}
],
"label.is-not": [
{
"type": 0,
- "value": "Is not"
+ "value": "해당하지 않음"
}
],
"label.is-not-set": [
{
"type": 0,
- "value": "Is not set"
+ "value": "설정되지 않음"
}
],
"label.is-set": [
{
"type": 0,
- "value": "Is set"
+ "value": "설정됨"
}
],
"label.join": [
{
"type": 0,
- "value": "Join"
+ "value": "가입"
}
],
"label.join-team": [
{
"type": 0,
- "value": "Join team"
+ "value": "팀 가입"
}
],
"label.journey": [
{
"type": 0,
- "value": "Journey"
+ "value": "여정"
}
],
"label.journey-description": [
{
"type": 0,
- "value": "Understand how users navigate through your website."
+ "value": "사용자가 웹사이트를 탐색하는 경로를 살펴보세요."
}
],
"label.language": [
{
"type": 0,
- "value": "Language"
+ "value": "언어"
}
],
"label.languages": [
{
"type": 0,
- "value": "Languages"
+ "value": "언어"
}
],
"label.laptop": [
@@ -616,7 +616,7 @@
},
{
"type": 0,
- "value": " 일간"
+ "value": " 일"
}
],
"label.last-hours": [
@@ -636,7 +636,7 @@
"label.last-months": [
{
"type": 0,
- "value": "Last "
+ "value": "최근 "
},
{
"type": 1,
@@ -644,31 +644,31 @@
},
{
"type": 0,
- "value": " months"
+ "value": " 개월"
}
],
"label.leave": [
{
"type": 0,
- "value": "Leave"
+ "value": "떠나기"
}
],
"label.leave-team": [
{
"type": 0,
- "value": "Leave team"
+ "value": "팀 떠나기"
}
],
"label.less-than": [
{
"type": 0,
- "value": "Less than"
+ "value": "미만"
}
],
"label.less-than-equals": [
{
"type": 0,
- "value": "Less than or equals"
+ "value": "이하"
}
],
"label.login": [
@@ -686,37 +686,37 @@
"label.manage": [
{
"type": 0,
- "value": "Manage"
+ "value": "관리"
}
],
"label.manager": [
{
"type": 0,
- "value": "Manager"
+ "value": "관리자"
}
],
"label.max": [
{
"type": 0,
- "value": "Max"
+ "value": "최대"
}
],
"label.member": [
{
"type": 0,
- "value": "Member"
+ "value": "멤버"
}
],
"label.members": [
{
"type": 0,
- "value": "Members"
+ "value": "멤버"
}
],
"label.min": [
{
"type": 0,
- "value": "Min"
+ "value": "최소"
}
],
"label.mobile": [
@@ -734,13 +734,13 @@
"label.my-account": [
{
"type": 0,
- "value": "My account"
+ "value": "내 계정"
}
],
"label.my-websites": [
{
"type": 0,
- "value": "My websites"
+ "value": "내 웹사이트"
}
],
"label.name": [
@@ -758,7 +758,7 @@
"label.none": [
{
"type": 0,
- "value": "None"
+ "value": "없음"
}
],
"label.number-of-records": [
@@ -785,7 +785,7 @@
"value": [
{
"type": 0,
- "value": "records"
+ "value": "레코드"
}
]
}
@@ -798,31 +798,35 @@
"label.ok": [
{
"type": 0,
- "value": "OK"
+ "value": "확인"
}
],
"label.os": [
{
"type": 0,
- "value": "OS"
+ "value": "운영체제"
}
],
"label.overview": [
{
"type": 0,
- "value": "Overview"
+ "value": "개요"
}
],
"label.owner": [
{
"type": 0,
- "value": "Owner"
+ "value": "소유자"
}
],
"label.page-of": [
+ {
+ "type": 1,
+ "value": "total"
+ },
{
"type": 0,
- "value": "Page "
+ "value": " 중 "
},
{
"type": 1,
@@ -830,23 +834,19 @@
},
{
"type": 0,
- "value": " of "
- },
- {
- "type": 1,
- "value": "total"
+ "value": " 페이지"
}
],
"label.page-views": [
{
"type": 0,
- "value": "페이지 뷰(PV)"
+ "value": "페이지 뷰"
}
],
"label.pageTitle": [
{
"type": 0,
- "value": "Page title"
+ "value": "페이지 제목"
}
],
"label.pages": [
@@ -878,19 +878,19 @@
"label.previous": [
{
"type": 0,
- "value": "Previous"
+ "value": "이전"
}
],
"label.previous-period": [
{
"type": 0,
- "value": "Previous period"
+ "value": "이전 기간"
}
],
"label.previous-year": [
{
"type": 0,
- "value": "Previous year"
+ "value": "이전 연도"
}
],
"label.profile": [
@@ -902,25 +902,25 @@
"label.property": [
{
"type": 0,
- "value": "Property"
+ "value": "속성"
}
],
"label.queries": [
{
"type": 0,
- "value": "Queries"
+ "value": "쿼리"
}
],
"label.query": [
{
"type": 0,
- "value": "Query"
+ "value": "쿼리"
}
],
"label.query-parameters": [
{
"type": 0,
- "value": "Query parameters"
+ "value": "쿼리 매개변수"
}
],
"label.realtime": [
@@ -932,7 +932,7 @@
"label.referrer": [
{
"type": 0,
- "value": "Referrer"
+ "value": "리퍼러"
}
],
"label.referrers": [
@@ -950,37 +950,37 @@
"label.regenerate": [
{
"type": 0,
- "value": "Regenerate"
+ "value": "다시 생성"
}
],
"label.region": [
{
"type": 0,
- "value": "Region"
+ "value": "지역"
}
],
"label.regions": [
{
"type": 0,
- "value": "Regions"
+ "value": "지역"
}
],
"label.remove": [
{
"type": 0,
- "value": "Remove"
+ "value": "제거"
}
],
"label.remove-member": [
{
"type": 0,
- "value": "Remove member"
+ "value": "멤버 제거"
}
],
"label.reports": [
{
"type": 0,
- "value": "Reports"
+ "value": "리포트"
}
],
"label.required": [
@@ -998,31 +998,31 @@
"label.reset-website": [
{
"type": 0,
- "value": "Reset statistics"
+ "value": "웹사이트 초기화"
}
],
"label.retention": [
{
"type": 0,
- "value": "Retention"
+ "value": "리텐션"
}
],
"label.retention-description": [
{
"type": 0,
- "value": "Measure your website stickiness by tracking how often users return."
+ "value": "사용자가 얼마나 자주 돌아오는지를 추적하여 웹사이트의 리텐션을 측정하십시오."
}
],
"label.role": [
{
"type": 0,
- "value": "Role"
+ "value": "역할"
}
],
"label.run-query": [
{
"type": 0,
- "value": "Run query"
+ "value": "쿼리 실행"
}
],
"label.save": [
@@ -1034,43 +1034,43 @@
"label.screens": [
{
"type": 0,
- "value": "Screens"
+ "value": "스크린"
}
],
"label.search": [
{
"type": 0,
- "value": "Search"
+ "value": "검색"
}
],
"label.select": [
{
"type": 0,
- "value": "Select"
+ "value": "선택"
}
],
"label.select-date": [
{
"type": 0,
- "value": "Select date"
+ "value": "날짜 선택"
}
],
"label.select-role": [
{
"type": 0,
- "value": "Select role"
+ "value": "역할 선택"
}
],
"label.select-website": [
{
"type": 0,
- "value": "Select website"
+ "value": "웹사이트 선택"
}
],
"label.sessions": [
{
"type": 0,
- "value": "Sessions"
+ "value": "세션"
}
],
"label.settings": [
@@ -1094,19 +1094,19 @@
"label.start-step": [
{
"type": 0,
- "value": "Start Step"
+ "value": "시작 단계"
}
],
"label.steps": [
{
"type": 0,
- "value": "Steps"
+ "value": "단계"
}
],
"label.sum": [
{
"type": 0,
- "value": "Sum"
+ "value": "합계"
}
],
"label.tablet": [
@@ -1118,61 +1118,61 @@
"label.team": [
{
"type": 0,
- "value": "Team"
+ "value": "팀"
}
],
"label.team-id": [
{
"type": 0,
- "value": "Team ID"
+ "value": "팀 ID"
}
],
"label.team-manager": [
{
"type": 0,
- "value": "Team manager"
+ "value": "팀 관리자"
}
],
"label.team-member": [
{
"type": 0,
- "value": "Team member"
+ "value": "팀 멤버"
}
],
"label.team-name": [
{
"type": 0,
- "value": "Team name"
+ "value": "팀 이름"
}
],
"label.team-owner": [
{
"type": 0,
- "value": "Team owner"
+ "value": "팀 소유자"
}
],
"label.team-view-only": [
{
"type": 0,
- "value": "Team view only"
+ "value": "팀 보기 전용"
}
],
"label.team-websites": [
{
"type": 0,
- "value": "Team websites"
+ "value": "팀 웹사이트"
}
],
"label.teams": [
{
"type": 0,
- "value": "Teams"
+ "value": "팀"
}
],
"label.theme": [
{
"type": 0,
- "value": "Theme"
+ "value": "테마"
}
],
"label.this-month": [
@@ -1202,7 +1202,7 @@
"label.title": [
{
"type": 0,
- "value": "Title"
+ "value": "제목"
}
],
"label.today": [
@@ -1214,19 +1214,19 @@
"label.toggle-charts": [
{
"type": 0,
- "value": "Toggle charts"
+ "value": "차트 전환"
}
],
"label.total": [
{
"type": 0,
- "value": "Total"
+ "value": "합계"
}
],
"label.total-records": [
{
"type": 0,
- "value": "Total records"
+ "value": "총 레코드"
}
],
"label.tracking-code": [
@@ -1238,31 +1238,31 @@
"label.transfer": [
{
"type": 0,
- "value": "Transfer"
+ "value": "전송"
}
],
"label.transfer-website": [
{
"type": 0,
- "value": "Transfer website"
+ "value": "웹사이트 전송"
}
],
"label.true": [
{
"type": 0,
- "value": "True"
+ "value": "참"
}
],
"label.type": [
{
"type": 0,
- "value": "Type"
+ "value": "유형"
}
],
"label.unique": [
{
"type": 0,
- "value": "Unique"
+ "value": "고유"
}
],
"label.unique-visitors": [
@@ -1280,13 +1280,13 @@
"label.untitled": [
{
"type": 0,
- "value": "Untitled"
+ "value": "제목 없음"
}
],
"label.update": [
{
"type": 0,
- "value": "Update"
+ "value": "업데이트"
}
],
"label.url": [
@@ -1298,13 +1298,13 @@
"label.urls": [
{
"type": 0,
- "value": "URLs"
+ "value": "URL"
}
],
"label.user": [
{
"type": 0,
- "value": "User"
+ "value": "사용자"
}
],
"label.username": [
@@ -1316,7 +1316,7 @@
"label.users": [
{
"type": 0,
- "value": "Users"
+ "value": "사용자"
}
],
"label.utm": [
@@ -1328,19 +1328,19 @@
"label.utm-description": [
{
"type": 0,
- "value": "Track your campaigns through UTM parameters."
+ "value": "UTM 매개변수를 통해 캠페인을 추적합니다."
}
],
"label.value": [
{
"type": 0,
- "value": "Value"
+ "value": "값"
}
],
"label.view": [
{
"type": 0,
- "value": "View"
+ "value": "보기"
}
],
"label.view-details": [
@@ -1352,7 +1352,7 @@
"label.view-only": [
{
"type": 0,
- "value": "View only"
+ "value": "보기 전용"
}
],
"label.views": [
@@ -1364,7 +1364,7 @@
"label.views-per-visit": [
{
"type": 0,
- "value": "Views per visit"
+ "value": "방문당 조회수"
}
],
"label.visit-duration": [
@@ -1382,19 +1382,19 @@
"label.visits": [
{
"type": 0,
- "value": "Visits"
+ "value": "방문"
}
],
"label.website": [
{
"type": 0,
- "value": "Website"
+ "value": "웹사이트"
}
],
"label.website-id": [
{
"type": 0,
- "value": "Website ID"
+ "value": "웹사이트 ID"
}
],
"label.websites": [
@@ -1406,19 +1406,19 @@
"label.window": [
{
"type": 0,
- "value": "Window"
+ "value": "창"
}
],
"label.yesterday": [
{
"type": 0,
- "value": "Yesterday"
+ "value": "어제"
}
],
"message.action-confirmation": [
{
"type": 0,
- "value": "Type "
+ "value": "확인을 위해 아래 상자에 "
},
{
"type": 1,
@@ -1426,7 +1426,7 @@
},
{
"type": 0,
- "value": " in the box below to confirm."
+ "value": "을(를) 입력하십시오."
}
],
"message.active-users": [
@@ -1442,7 +1442,7 @@
"message.collected-data": [
{
"type": 0,
- "value": "Collected data"
+ "value": "수집된 데이터"
}
],
"message.confirm-delete": [
@@ -1456,57 +1456,45 @@
}
],
"message.confirm-leave": [
- {
- "type": 0,
- "value": "Are you sure you want to leave "
- },
{
"type": 1,
"value": "target"
},
{
"type": 0,
- "value": "?"
+ "value": "을(를) 떠나시겠습니까?"
}
],
"message.confirm-remove": [
- {
- "type": 0,
- "value": "Are you sure you want to remove "
- },
{
"type": 1,
"value": "target"
},
{
"type": 0,
- "value": "?"
+ "value": "을(를) 제거하시겠습니까?"
}
],
"message.confirm-reset": [
- {
- "type": 0,
- "value": "Are your sure you want to reset "
- },
{
"type": 1,
"value": "target"
},
{
"type": 0,
- "value": "'s statistics?"
+ "value": "을(를) 초기화하시겠습니까?"
}
],
"message.delete-team-warning": [
{
"type": 0,
- "value": "Deleting a team will also delete all team websites."
+ "value": "팀을 삭제하면 팀에 등록된 모든 웹사이트도 삭제됩니다."
}
],
"message.delete-website-warning": [
{
"type": 0,
- "value": "관련된 모든 데이터도 삭제됩니다."
+ "value": "관련된 모든 데이터가 삭제됩니다."
}
],
"message.error": [
@@ -1522,7 +1510,7 @@
},
{
"type": 0,
- "value": " on "
+ "value": " - "
},
{
"type": 1,
@@ -1538,7 +1526,7 @@
"message.incorrect-username-password": [
{
"type": 0,
- "value": "사용자 이름/비밀번호가 잘못되었습니다.."
+ "value": "사용자 이름/비밀번호가 잘못되었습니다."
}
],
"message.invalid-domain": [
@@ -1550,7 +1538,7 @@
"message.min-password-length": [
{
"type": 0,
- "value": "Minimum length of "
+ "value": "최소 길이는 "
},
{
"type": 1,
@@ -1558,21 +1546,17 @@
},
{
"type": 0,
- "value": " characters"
+ "value": "자입니다"
}
],
"message.new-version-available": [
{
"type": 0,
- "value": "A new version of Umami "
+ "value": "새 버전이 사용 가능합니다! - Umami "
},
{
"type": 1,
"value": "version"
- },
- {
- "type": 0,
- "value": " is available!"
}
],
"message.no-data-available": [
@@ -1584,7 +1568,7 @@
"message.no-event-data": [
{
"type": 0,
- "value": "No event data is available."
+ "value": "사용 가능한 이벤트 데이터가 없습니다."
}
],
"message.no-match-password": [
@@ -1596,31 +1580,31 @@
"message.no-results-found": [
{
"type": 0,
- "value": "No results were found."
+ "value": "결과를 찾을 수 없습니다."
}
],
"message.no-team-websites": [
{
"type": 0,
- "value": "This team does not have any websites."
+ "value": "이 팀에는 웹사이트가 없습니다."
}
],
"message.no-teams": [
{
"type": 0,
- "value": "You have not created any teams."
+ "value": "생성된 팀이 없습니다."
}
],
"message.no-users": [
{
"type": 0,
- "value": "There are no users."
+ "value": "사용자가 없습니다."
}
],
"message.no-websites-configured": [
{
"type": 0,
- "value": "구성된 웹 사이트가 없습니다."
+ "value": "설정된 웹사이트가 없습니다."
}
],
"message.page-not-found": [
@@ -1632,7 +1616,7 @@
"message.reset-website": [
{
"type": 0,
- "value": "To reset this website, type "
+ "value": "이 웹사이트를 초기화하려면, 아래 상자에 "
},
{
"type": 1,
@@ -1640,13 +1624,13 @@
},
{
"type": 0,
- "value": " in the box below to confirm."
+ "value": "을(를) 입력하십시오."
}
],
"message.reset-website-warning": [
{
"type": 0,
- "value": "All statistics for this website will be deleted, but your tracking code will remain intact."
+ "value": "이 웹사이트의 모든 통계가 삭제되지만 설정은 그대로 유지됩니다."
}
],
"message.saved": [
@@ -1658,78 +1642,100 @@
"message.share-url": [
{
"type": 0,
- "value": "이것은 "
- },
- {
- "type": 1,
- "value": "target"
- },
- {
- "type": 0,
- "value": "의 공개적으로 공유된 URL입니다."
+ "value": "아래 링크를 통해 웹사이트의 통계를 누구나 볼 수 있습니다."
}
],
"message.team-already-member": [
{
"type": 0,
- "value": "You are already a member of the team."
+ "value": "이미 팀의 회원입니다."
}
],
"message.team-not-found": [
{
"type": 0,
- "value": "Team not found."
+ "value": "팀을 찾을 수 없습니다."
}
],
"message.team-websites-info": [
{
"type": 0,
- "value": "Websites can be viewed by anyone on the team."
+ "value": "웹사이트는 팀의 누구나 볼 수 있습니다."
}
],
"message.tracking-code": [
{
"type": 0,
- "value": "추적 코드"
+ "value": "이 웹사이트의 통계를 추적하려면, 다음 코드를 HTML의 "
+ },
+ {
+ "children": [
+ {
+ "type": 0,
+ "value": "..."
+ }
+ ],
+ "type": 8,
+ "value": "head"
+ },
+ {
+ "type": 0,
+ "value": " 섹션에 추가하십시오."
}
],
"message.transfer-team-website-to-user": [
{
"type": 0,
- "value": "Transfer this website to your account?"
+ "value": "이 웹사이트를 당신의 계정으로 전송하시겠습니까?"
}
],
"message.transfer-user-website-to-team": [
{
"type": 0,
- "value": "Select the team to transfer this website to."
+ "value": "이 웹사이트를 전송받을 팀을 선택하십시오."
}
],
"message.transfer-website": [
{
"type": 0,
- "value": "Transfer website ownership to your account or another team."
+ "value": "웹사이트 소유권을 계정이나 다른 팀으로 전송합니다."
}
],
"message.triggered-event": [
{
"type": 0,
- "value": "Triggered event"
+ "value": "트리거된 이벤트"
}
],
"message.user-deleted": [
{
"type": 0,
- "value": "User deleted."
+ "value": "사용자가 삭제되었습니다."
}
],
"message.viewed-page": [
{
"type": 0,
- "value": "Viewed page"
+ "value": "페이지 조회"
}
],
"message.visitor-log": [
+ {
+ "type": 1,
+ "value": "country"
+ },
+ {
+ "type": 0,
+ "value": "의 "
+ },
+ {
+ "type": 1,
+ "value": "browser"
+ },
+ {
+ "type": 0,
+ "value": " 브라우저를 사용하는 "
+ },
{
"type": 1,
"value": "os"
@@ -1744,29 +1750,13 @@
},
{
"type": 0,
- "value": "에서 "
- },
- {
- "type": 1,
- "value": "browser"
- },
- {
- "type": 0,
- "value": "을(를) 사용하는 "
- },
- {
- "type": 1,
- "value": "country"
- },
- {
- "type": 0,
- "value": "의 방문자"
+ "value": " 방문자"
}
],
"message.visitors-dropped-off": [
{
"type": 0,
- "value": "Visitors dropped off"
+ "value": "방문자가 이탈했습니다"
}
]
}
diff --git a/public/intl/messages/pl-PL.json b/public/intl/messages/pl-PL.json
index 608c0b3a..7157a4f2 100644
--- a/public/intl/messages/pl-PL.json
+++ b/public/intl/messages/pl-PL.json
@@ -152,7 +152,7 @@
"label.compare": [
{
"type": 0,
- "value": "Compare"
+ "value": "Porównaj"
}
],
"label.confirm": [
@@ -182,7 +182,7 @@
"label.count": [
{
"type": 0,
- "value": "Count"
+ "value": "Liczba"
}
],
"label.countries": [
@@ -236,7 +236,7 @@
"label.current": [
{
"type": 0,
- "value": "Current"
+ "value": "Aktualny"
}
],
"label.current-password": [
@@ -398,7 +398,7 @@
"label.end-step": [
{
"type": 0,
- "value": "End Step"
+ "value": "Krok końcowy"
}
],
"label.entry": [
@@ -428,7 +428,7 @@
"label.exit": [
{
"type": 0,
- "value": "Exit URL"
+ "value": "URL wyjściowy"
}
],
"label.false": [
@@ -488,13 +488,13 @@
"label.goal": [
{
"type": 0,
- "value": "Goal"
+ "value": "Cel"
}
],
"label.goals": [
{
"type": 0,
- "value": "Goals"
+ "value": "Cele"
}
],
"label.goals-description": [
@@ -524,7 +524,7 @@
"label.hosts": [
{
"type": 0,
- "value": "Hosts"
+ "value": "Hosty"
}
],
"label.insights": [
@@ -578,13 +578,13 @@
"label.journey": [
{
"type": 0,
- "value": "Journey"
+ "value": "Droga"
}
],
"label.journey-description": [
{
"type": 0,
- "value": "Understand how users navigate through your website."
+ "value": "Zrozum, w jaki sposób użytkownicy poruszają się po Twojej witrynie."
}
],
"label.language": [
@@ -874,19 +874,19 @@
"label.previous": [
{
"type": 0,
- "value": "Previous"
+ "value": "Poprzedni"
}
],
"label.previous-period": [
{
"type": 0,
- "value": "Previous period"
+ "value": "Poprzedni okres"
}
],
"label.previous-year": [
{
"type": 0,
- "value": "Previous year"
+ "value": "Poprzedni rok"
}
],
"label.profile": [
@@ -928,7 +928,7 @@
"label.referrer": [
{
"type": 0,
- "value": "Referrer"
+ "value": "Źródło odsyłające"
}
],
"label.referrers": [
@@ -970,7 +970,7 @@
"label.remove-member": [
{
"type": 0,
- "value": "Remove member"
+ "value": "Usuń członka"
}
],
"label.reports": [
@@ -1090,7 +1090,7 @@
"label.start-step": [
{
"type": 0,
- "value": "Start Step"
+ "value": "Krok startowy"
}
],
"label.steps": [
@@ -1378,7 +1378,7 @@
"label.visits": [
{
"type": 0,
- "value": "Odwiedząjący"
+ "value": "Wizyty"
}
],
"label.website": [
@@ -1462,7 +1462,7 @@
"message.collected-data": [
{
"type": 0,
- "value": "Collected data"
+ "value": "Zebrane dane"
}
],
"message.confirm-delete": [
diff --git a/public/intl/messages/zh-CN.json b/public/intl/messages/zh-CN.json
index c8852041..bb77d83b 100644
--- a/public/intl/messages/zh-CN.json
+++ b/public/intl/messages/zh-CN.json
@@ -152,7 +152,7 @@
"label.compare": [
{
"type": 0,
- "value": "Compare"
+ "value": "比较"
}
],
"label.confirm": [
@@ -182,7 +182,7 @@
"label.count": [
{
"type": 0,
- "value": "Count"
+ "value": "统计"
}
],
"label.countries": [
@@ -236,7 +236,7 @@
"label.current": [
{
"type": 0,
- "value": "Current"
+ "value": "目前"
}
],
"label.current-password": [
@@ -398,13 +398,13 @@
"label.end-step": [
{
"type": 0,
- "value": "End Step"
+ "value": "结束步骤"
}
],
"label.entry": [
{
"type": 0,
- "value": "Entry URL"
+ "value": "入口 URL"
}
],
"label.event": [
@@ -428,7 +428,7 @@
"label.exit": [
{
"type": 0,
- "value": "Exit URL"
+ "value": "退出 URL"
}
],
"label.false": [
@@ -488,19 +488,19 @@
"label.goal": [
{
"type": 0,
- "value": "Goal"
+ "value": "目标"
}
],
"label.goals": [
{
"type": 0,
- "value": "Goals"
+ "value": "目标"
}
],
"label.goals-description": [
{
"type": 0,
- "value": "Track your goals for pageviews and events."
+ "value": "跟踪页面浏览量和事件的目标。"
}
],
"label.greater-than": [
@@ -518,13 +518,13 @@
"label.host": [
{
"type": 0,
- "value": "Host"
+ "value": "主机"
}
],
"label.hosts": [
{
"type": 0,
- "value": "Hosts"
+ "value": "主机"
}
],
"label.insights": [
@@ -578,13 +578,13 @@
"label.journey": [
{
"type": 0,
- "value": "Journey"
+ "value": "用户浏览轨迹"
}
],
"label.journey-description": [
{
"type": 0,
- "value": "Understand how users navigate through your website."
+ "value": "了解用户如何浏览网站。"
}
],
"label.language": [
@@ -692,7 +692,7 @@
"label.manager": [
{
"type": 0,
- "value": "Manager"
+ "value": "管理者"
}
],
"label.max": [
@@ -798,7 +798,7 @@
"label.ok": [
{
"type": 0,
- "value": "OK"
+ "value": "好的"
}
],
"label.os": [
@@ -882,19 +882,19 @@
"label.previous": [
{
"type": 0,
- "value": "Previous"
+ "value": "先前"
}
],
"label.previous-period": [
{
"type": 0,
- "value": "Previous period"
+ "value": "上一时期"
}
],
"label.previous-year": [
{
"type": 0,
- "value": "Previous year"
+ "value": "上一年"
}
],
"label.profile": [
@@ -906,7 +906,7 @@
"label.property": [
{
"type": 0,
- "value": "Property"
+ "value": "属性"
}
],
"label.queries": [
@@ -1098,7 +1098,7 @@
"label.start-step": [
{
"type": 0,
- "value": "Start Step"
+ "value": "开始步骤"
}
],
"label.steps": [
@@ -1134,7 +1134,7 @@
"label.team-manager": [
{
"type": 0,
- "value": "Team manager"
+ "value": "团队管理者"
}
],
"label.team-member": [
@@ -1450,7 +1450,7 @@
"message.collected-data": [
{
"type": 0,
- "value": "Collected data"
+ "value": "已收集的数据"
}
],
"message.confirm-delete": [
diff --git a/scripts/check-db.js b/scripts/check-db.js
index 757843ac..cdfeafa3 100644
--- a/scripts/check-db.js
+++ b/scripts/check-db.js
@@ -44,7 +44,7 @@ async function checkConnection() {
success('Database connection successful.');
} catch (e) {
- throw new Error('Unable to connect to the database.');
+ throw new Error('Unable to connect to the database: ' + e.message);
}
}
diff --git a/scripts/start-env.js b/scripts/start-env.js
index e9fe2a4b..264c4e92 100644
--- a/scripts/start-env.js
+++ b/scripts/start-env.js
@@ -2,7 +2,6 @@ require('dotenv').config();
const cli = require('next/dist/cli/next-start');
cli.nextStart({
- '--port': process.env.PORT || 3000,
- '--hostname': process.env.HOSTNAME || '0.0.0.0',
- _: [],
+ port: process.env.PORT || 3000,
+ hostname: process.env.HOSTNAME || '0.0.0.0',
});
diff --git a/src/app/(main)/console/TestConsole.tsx b/src/app/(main)/console/TestConsole.tsx
index d0afb14c..7461454f 100644
--- a/src/app/(main)/console/TestConsole.tsx
+++ b/src/app/(main)/console/TestConsole.tsx
@@ -21,8 +21,12 @@ export function TestConsole({ websiteId }: { websiteId: string }) {
router.push(`/console/${value}`);
}
- function handleClick() {
- window['umami'].track({ url: '/page-view', referrer: 'https://www.google.com' });
+ function handleRunScript() {
+ window['umami'].track(props => ({
+ ...props,
+ url: '/page-view',
+ referrer: 'https://www.google.com',
+ }));
window['umami'].track('track-event-no-data');
window['umami'].track('track-event-with-data', {
test: 'test-data',
@@ -44,7 +48,7 @@ export function TestConsole({ websiteId }: { websiteId: string }) {
});
}
- function handleIdentifyClick() {
+ function handleRunIdentify() {
window['umami'].identify({
userId: 123,
name: 'brian',
@@ -145,10 +149,10 @@ export function TestConsole({ websiteId }: { websiteId: string }) {
Javascript events
-
diff --git a/src/app/(main)/reports/create/ReportTemplates.tsx b/src/app/(main)/reports/create/ReportTemplates.tsx
index e37efc03..2314f7d6 100644
--- a/src/app/(main)/reports/create/ReportTemplates.tsx
+++ b/src/app/(main)/reports/create/ReportTemplates.tsx
@@ -51,6 +51,12 @@ export function ReportTemplates({ showHeader = true }: { showHeader?: boolean })
url: renderTeamUrl('/reports/journey'),
icon: ,
},
+ {
+ title: formatMessage(labels.revenue),
+ description: formatMessage(labels.revenueDescription),
+ url: renderTeamUrl('/reports/revenue'),
+ icon: ,
+ },
];
return (
diff --git a/src/app/(main)/reports/funnel/FunnelChart.module.css b/src/app/(main)/reports/funnel/FunnelChart.module.css
index 81b22c78..7972d573 100644
--- a/src/app/(main)/reports/funnel/FunnelChart.module.css
+++ b/src/app/(main)/reports/funnel/FunnelChart.module.css
@@ -34,6 +34,10 @@
background-color: var(--base100);
}
+.step:last-child::before {
+ display: none;
+}
+
.card {
display: grid;
gap: 20px;
diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx
index 0cbaeb44..bbd6460a 100644
--- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx
+++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx
@@ -46,9 +46,14 @@ export function WebsiteHeader({
path: '/reports',
},
{
- label: formatMessage(labels.eventData),
+ label: formatMessage(labels.sessions),
+ icon: ,
+ path: '/sessions',
+ },
+ {
+ label: formatMessage(labels.events),
icon: ,
- path: '/event-data',
+ path: '/events',
},
];
diff --git a/src/app/(main)/websites/[websiteId]/event-data/EventDataMetricsBar.module.css b/src/app/(main)/websites/[websiteId]/events/EventDataMetricsBar.module.css
similarity index 100%
rename from src/app/(main)/websites/[websiteId]/event-data/EventDataMetricsBar.module.css
rename to src/app/(main)/websites/[websiteId]/events/EventDataMetricsBar.module.css
diff --git a/src/app/(main)/websites/[websiteId]/event-data/EventDataMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/events/EventDataMetricsBar.tsx
similarity index 100%
rename from src/app/(main)/websites/[websiteId]/event-data/EventDataMetricsBar.tsx
rename to src/app/(main)/websites/[websiteId]/events/EventDataMetricsBar.tsx
diff --git a/src/app/(main)/websites/[websiteId]/event-data/EventDataPage.tsx b/src/app/(main)/websites/[websiteId]/events/EventDataPage.tsx
similarity index 100%
rename from src/app/(main)/websites/[websiteId]/event-data/EventDataPage.tsx
rename to src/app/(main)/websites/[websiteId]/events/EventDataPage.tsx
diff --git a/src/app/(main)/websites/[websiteId]/event-data/EventDataTable.tsx b/src/app/(main)/websites/[websiteId]/events/EventDataTable.tsx
similarity index 100%
rename from src/app/(main)/websites/[websiteId]/event-data/EventDataTable.tsx
rename to src/app/(main)/websites/[websiteId]/events/EventDataTable.tsx
diff --git a/src/app/(main)/websites/[websiteId]/event-data/EventDataValueTable.tsx b/src/app/(main)/websites/[websiteId]/events/EventDataValueTable.tsx
similarity index 100%
rename from src/app/(main)/websites/[websiteId]/event-data/EventDataValueTable.tsx
rename to src/app/(main)/websites/[websiteId]/events/EventDataValueTable.tsx
diff --git a/src/app/(main)/websites/[websiteId]/event-data/WebsiteEventData.module.css b/src/app/(main)/websites/[websiteId]/events/WebsiteEventData.module.css
similarity index 100%
rename from src/app/(main)/websites/[websiteId]/event-data/WebsiteEventData.module.css
rename to src/app/(main)/websites/[websiteId]/events/WebsiteEventData.module.css
diff --git a/src/app/(main)/websites/[websiteId]/event-data/WebsiteEventData.tsx b/src/app/(main)/websites/[websiteId]/events/WebsiteEventData.tsx
similarity index 100%
rename from src/app/(main)/websites/[websiteId]/event-data/WebsiteEventData.tsx
rename to src/app/(main)/websites/[websiteId]/events/WebsiteEventData.tsx
diff --git a/src/app/(main)/websites/[websiteId]/event-data/page.tsx b/src/app/(main)/websites/[websiteId]/events/page.tsx
similarity index 100%
rename from src/app/(main)/websites/[websiteId]/event-data/page.tsx
rename to src/app/(main)/websites/[websiteId]/events/page.tsx
diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
index cbdeb1ac..97fb1659 100644
--- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
+++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx
@@ -54,7 +54,7 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
},
];
- const getTime = ({ timestamp }) => format(timestamp * 1000, 'h:mm:ss');
+ const getTime = ({ createdAt }) => format(new Date(createdAt), 'h:mm:ss');
const getColor = ({ id, sessionId }) => stringToColor(sessionId || id);
@@ -144,9 +144,12 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
const { events, visitors } = data;
let logs = [
- ...events.map(e => ({ __type: e.eventName ? TYPE_EVENT : TYPE_PAGEVIEW, ...e })),
+ ...events.map(e => ({
+ __type: e.eventName ? TYPE_EVENT : TYPE_PAGEVIEW,
+ ...e,
+ })),
...visitors.map(v => ({ __type: TYPE_SESSION, ...v })),
- ].sort(thenby.firstBy('timestamp', -1));
+ ].sort(thenby.firstBy('createdAt', -1));
if (search) {
logs = logs.filter(({ eventName, urlPath, browser, os, country, device }) => {
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionMetricsBar.tsx
new file mode 100644
index 00000000..c4f21875
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionMetricsBar.tsx
@@ -0,0 +1,5 @@
+export function SessionMetricsBar({ websiteId }: { websiteId: string }) {
+ return {websiteId}
;
+}
+
+export default SessionMetricsBar;
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx
new file mode 100644
index 00000000..9e9f97e9
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx
@@ -0,0 +1,25 @@
+import { useSessions } from 'components/hooks';
+import SessionsTable from './SessionsTable';
+import DataTable from 'components/common/DataTable';
+import { ReactNode } from 'react';
+
+export default function SessionsDataTable({
+ websiteId,
+ children,
+}: {
+ websiteId?: string;
+ teamId?: string;
+ children?: ReactNode;
+}) {
+ const queryResult = useSessions(websiteId);
+
+ if (queryResult?.result?.data?.length === 0) {
+ return children;
+ }
+
+ return (
+
+ {({ data }) => }
+
+ );
+}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx
new file mode 100644
index 00000000..e95145a7
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx
@@ -0,0 +1,14 @@
+'use client';
+import WebsiteHeader from '../WebsiteHeader';
+import SessionsDataTable from './SessionsDataTable';
+
+export function SessionsPage({ websiteId }) {
+ return (
+ <>
+
+
+ >
+ );
+}
+
+export default SessionsPage;
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx
new file mode 100644
index 00000000..d5ca439a
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx
@@ -0,0 +1,31 @@
+import { GridColumn, GridTable, useBreakpoint } from 'react-basics';
+import { useFormat, useMessages } from 'components/hooks';
+import { formatDistanceToNow } from 'date-fns';
+
+export function SessionsTable({ data = [] }: { data: any[]; showDomain?: boolean }) {
+ const { formatMessage, labels } = useMessages();
+ const breakpoint = useBreakpoint();
+ const { formatValue } = useFormat();
+
+ return (
+
+
+
+ {row => formatValue(row.country, 'country')}
+
+
+
+ {row => formatValue(row.browser, 'browser')}
+
+
+
+ {row => formatValue(row.device, 'device')}
+
+
+ {row => formatDistanceToNow(new Date(row.createdAt))}
+
+
+ );
+}
+
+export default SessionsTable;
diff --git a/src/app/(main)/websites/[websiteId]/sessions/page.tsx b/src/app/(main)/websites/[websiteId]/sessions/page.tsx
new file mode 100644
index 00000000..771f682d
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/sessions/page.tsx
@@ -0,0 +1,10 @@
+import SessionsPage from './SessionsPage';
+import { Metadata } from 'next';
+
+export default function ({ params: { websiteId } }) {
+ return ;
+}
+
+export const metadata: Metadata = {
+ title: 'Sessions',
+};
diff --git a/src/app/api/scripts/telemetry/route.ts b/src/app/api/scripts/telemetry/route.ts
new file mode 100644
index 00000000..ecd83fcb
--- /dev/null
+++ b/src/app/api/scripts/telemetry/route.ts
@@ -0,0 +1,28 @@
+import { CURRENT_VERSION, TELEMETRY_PIXEL } from 'lib/constants';
+
+export async function GET() {
+ if (
+ process.env.NODE_ENV !== 'production' &&
+ process.env.DISABLE_TELEMETRY &&
+ process.env.PRIVATE_MODE
+ ) {
+ const script = `
+ (()=>{const i=document.createElement('img');
+ i.setAttribute('src','${TELEMETRY_PIXEL}?v=${CURRENT_VERSION}');
+ i.setAttribute('style','width:0;height:0;position:absolute;pointer-events:none;');
+ document.body.appendChild(i);})();
+ `;
+
+ return new Response(script.replace(/\s\s+/g, ''), {
+ headers: {
+ 'content-type': 'text/javascript',
+ },
+ });
+ }
+
+ return new Response('/* telemetry disabled */', {
+ headers: {
+ 'content-type': 'text/javascript',
+ },
+ });
+}
diff --git a/src/components/charts/Chart.tsx b/src/components/charts/Chart.tsx
index 6ba60159..926defaf 100644
--- a/src/components/charts/Chart.tsx
+++ b/src/components/charts/Chart.tsx
@@ -79,7 +79,7 @@ export function Chart({
};
const updateChart = (data: any) => {
- if (data.datasets.length === chart.current.data.datasets.length) {
+ if ((data?.datasets?.length || 0) === chart.current.data.datasets.length) {
chart.current.data.datasets.forEach((dataset: { data: any }, index: string | number) => {
if (data?.datasets[index]) {
dataset.data = data?.datasets[index]?.data;
diff --git a/src/components/hooks/index.ts b/src/components/hooks/index.ts
index df4fbd88..86abdd84 100644
--- a/src/components/hooks/index.ts
+++ b/src/components/hooks/index.ts
@@ -5,6 +5,7 @@ export * from './queries/useLogin';
export * from './queries/useRealtime';
export * from './queries/useReport';
export * from './queries/useReports';
+export * from './queries/useSessions';
export * from './queries/useShareToken';
export * from './queries/useTeam';
export * from './queries/useTeams';
diff --git a/src/components/hooks/queries/useSessions.ts b/src/components/hooks/queries/useSessions.ts
new file mode 100644
index 00000000..c54c3acd
--- /dev/null
+++ b/src/components/hooks/queries/useSessions.ts
@@ -0,0 +1,20 @@
+import { useApi } from './useApi';
+import { useFilterQuery } from './useFilterQuery';
+import useModified from '../useModified';
+
+export function useSessions(websiteId: string, params?: { [key: string]: string | number }) {
+ const { get } = useApi();
+ const { modified } = useModified(`websites`);
+
+ return useFilterQuery({
+ queryKey: ['sessions', { websiteId, modified, ...params }],
+ queryFn: (data: any) => {
+ return get(`/websites/${websiteId}/sessions`, {
+ ...data,
+ ...params,
+ });
+ },
+ });
+}
+
+export default useSessions;
diff --git a/src/components/metrics/EventsChart.tsx b/src/components/metrics/EventsChart.tsx
index 842ae605..36ec8672 100644
--- a/src/components/metrics/EventsChart.tsx
+++ b/src/components/metrics/EventsChart.tsx
@@ -1,5 +1,4 @@
import { useMemo } from 'react';
-import { Loading } from 'react-basics';
import { colord } from 'colord';
import BarChart from 'components/charts/BarChart';
import { getDateArray } from 'lib/date';
@@ -51,10 +50,6 @@ export function EventsChart({ websiteId, className }: EventsChartProps) {
};
}, [data, startDate, endDate, unit]);
- if (isLoading) {
- return ;
- }
-
return (
... នៃ HTML របស់អ្នក។",
+ "message.transfer-team-website-to-user": "ផ្ទេរគេហទំព័រនេះទៅគណនីរបស់អ្នក។?",
+ "message.transfer-user-website-to-team": "ជ្រើសក្រុមដែរត្រូវផ្ទេរគេហទំព័រនេះទៅ។",
+ "message.transfer-website": "ផ្ទេរកម្មសិទ្ធិគេហទំព័រទៅគណនីរបស់អ្នក ឬក្រុមផ្សេងទៀត។",
"message.triggered-event": "Triggered event",
- "message.user-deleted": "User deleted.",
- "message.viewed-page": "Viewed page",
+ "message.user-deleted": "អ្នកប្រើប្រាស់ត្រូវបានលុបចោល។",
+ "message.viewed-page": "ទំព័រដែលបានមើល",
"message.visitor-log": "អ្នកមើលពីប្រទេស {country} ប្រើប្រាស់កម្មវិធី {browser} លើឧបករណ៍ {os} {device}",
- "message.visitors-dropped-off": "Visitors dropped off"
+ "message.visitors-dropped-off": "ចំនួនអ្នកទស្សនាធ្លាក់ចុះ"
}
diff --git a/src/lang/pl-PL.json b/src/lang/pl-PL.json
index e663d445..953438be 100644
--- a/src/lang/pl-PL.json
+++ b/src/lang/pl-PL.json
@@ -24,12 +24,12 @@
"label.cities": "Miasta",
"label.city": "Miasto",
"label.clear-all": "Wyczyść wszystko",
- "label.compare": "Compare",
+ "label.compare": "Porównaj",
"label.confirm": "Potwierdź",
"label.confirm-password": "Potwierdź hasło",
"label.contains": "Zawiera",
"label.continue": "Kontynuuj",
- "label.count": "Count",
+ "label.count": "Liczba",
"label.countries": "Kraje",
"label.country": "Państwo",
"label.create": "Utwórz",
@@ -38,7 +38,7 @@
"label.create-user": "Utwórz użytkownika",
"label.created": "Utworzony",
"label.created-by": "Utworzony przez",
- "label.current": "Current",
+ "label.current": "Aktualny",
"label.current-password": "Aktualne hasło",
"label.custom-range": "Zakres niestandardowy",
"label.dashboard": "Panel",
@@ -65,12 +65,12 @@
"label.edit-dashboard": "Edytuj panel",
"label.edit-member": "Edytuj członka",
"label.enable-share-url": "Włącz udostępnianie adresu URL",
- "label.end-step": "End Step",
+ "label.end-step": "Krok końcowy",
"label.entry": "Entry URL",
"label.event": "Zdarzenie",
"label.event-data": "Dane zdarzenia",
"label.events": "Zdarzenia",
- "label.exit": "Exit URL",
+ "label.exit": "URL wyjściowy",
"label.false": "Fałsz",
"label.field": "Pole",
"label.fields": "Pola",
@@ -80,13 +80,13 @@
"label.filters": "Filtry",
"label.funnel": "Lejek",
"label.funnel-description": "Zrozum wskaźniki konwersji i odpływu użytkowników.",
- "label.goal": "Goal",
- "label.goals": "Goals",
+ "label.goal": "Cel",
+ "label.goals": "Cele",
"label.goals-description": "Track your goals for pageviews and events.",
"label.greater-than": "Większe niż",
"label.greater-than-equals": "Większe niż lub równe",
"label.host": "Host",
- "label.hosts": "Hosts",
+ "label.hosts": "Hosty",
"label.insights": "Analiza",
"label.insights-description": "Poznaj lepiej swoje dane, korzystając z segmentów i filtrów.",
"label.is": "Równe",
@@ -95,8 +95,8 @@
"label.is-set": "Ustawione",
"label.join": "Dołącz",
"label.join-team": "Dołącz do zespołu",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
+ "label.journey": "Droga",
+ "label.journey-description": "Zrozum, w jaki sposób użytkownicy poruszają się po Twojej witrynie.",
"label.language": "Język",
"label.languages": "Języki",
"label.laptop": "Laptop",
@@ -133,23 +133,23 @@
"label.pages": "Strony",
"label.password": "Hasło",
"label.powered-by": "Obsługiwane przez {name}",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
+ "label.previous": "Poprzedni",
+ "label.previous-period": "Poprzedni okres",
+ "label.previous-year": "Poprzedni rok",
"label.profile": "Profil",
"label.property": "Property",
"label.queries": "Zapytania",
"label.query": "Zapytanie",
"label.query-parameters": "Parametry zapytania",
"label.realtime": "Czas rzeczywisty",
- "label.referrer": "Referrer",
+ "label.referrer": "Źródło odsyłające",
"label.referrers": "Źródła odsyłające",
"label.refresh": "Odśwież",
"label.regenerate": "Wygeneruj ponownie",
"label.region": "Region",
"label.regions": "Regiony",
"label.remove": "Usuń",
- "label.remove-member": "Remove member",
+ "label.remove-member": "Usuń członka",
"label.reports": "Raporty",
"label.required": "Wymagany",
"label.reset": "Zresetuj",
@@ -169,7 +169,7 @@
"label.settings": "Ustawienia",
"label.share-url": "Udostępnij adres URL",
"label.single-day": "W tym dniu",
- "label.start-step": "Start Step",
+ "label.start-step": "Krok startowy",
"label.steps": "Kroki",
"label.sum": "Suma",
"label.tablet": "Tablet",
@@ -217,7 +217,7 @@
"label.views-per-visit": "Widoków na wizytę",
"label.visit-duration": "Średni czas wizyty",
"label.visitors": "Odwiedzający",
- "label.visits": "Odwiedząjący",
+ "label.visits": "Wizyty",
"label.website": "Witryna",
"label.website-id": "ID witryny",
"label.websites": "Witryny",
@@ -225,7 +225,7 @@
"label.yesterday": "Wczoraj",
"message.action-confirmation": "Wpisz {confirmation}, aby potwierdzić.",
"message.active-users": "{x} aktualnie {x, plural, one {odwiedzający} other {odwiedzających}}",
- "message.collected-data": "Collected data",
+ "message.collected-data": "Zebrane dane",
"message.confirm-delete": "Czy na pewno chcesz usunąć {target}?",
"message.confirm-leave": "Czy na pewno chcesz opuścić {target}?",
"message.confirm-remove": "Czy na pewno chcesz usunąć {target}?",
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index 91df00a6..64dfa12f 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -24,12 +24,12 @@
"label.cities": "市/县",
"label.city": "市/县",
"label.clear-all": "清除全部",
- "label.compare": "Compare",
+ "label.compare": "比较",
"label.confirm": "确认",
"label.confirm-password": "确认密码",
"label.contains": "包含",
"label.continue": "继续",
- "label.count": "Count",
+ "label.count": "统计",
"label.countries": "国家/地区",
"label.country": "国家/地区",
"label.create": "创建",
@@ -38,7 +38,7 @@
"label.create-user": "创建用户",
"label.created": "已创建",
"label.created-by": "创建者",
- "label.current": "Current",
+ "label.current": "目前",
"label.current-password": "目前密码",
"label.custom-range": "自定义时间段",
"label.dashboard": "仪表板",
@@ -65,12 +65,12 @@
"label.edit-dashboard": "编辑仪表板",
"label.edit-member": "编辑成员",
"label.enable-share-url": "启用共享链接",
- "label.end-step": "End Step",
- "label.entry": "Entry URL",
+ "label.end-step": "结束步骤",
+ "label.entry": "入口 URL",
"label.event": "事件",
"label.event-data": "事件数据",
"label.events": "行为类别",
- "label.exit": "Exit URL",
+ "label.exit": "退出 URL",
"label.false": "否",
"label.field": "字段",
"label.fields": "字段",
@@ -80,13 +80,13 @@
"label.filters": "筛选",
"label.funnel": "分析",
"label.funnel-description": "了解用户的转换率和退出率。",
- "label.goal": "Goal",
- "label.goals": "Goals",
- "label.goals-description": "Track your goals for pageviews and events.",
+ "label.goal": "目标",
+ "label.goals": "目标",
+ "label.goals-description": "跟踪页面浏览量和事件的目标。",
"label.greater-than": "大于",
"label.greater-than-equals": "大于或等于",
- "label.host": "Host",
- "label.hosts": "Hosts",
+ "label.host": "主机",
+ "label.hosts": "主机",
"label.insights": "见解",
"label.insights-description": "通过使用筛选器和划分时间段来更深入地研究数据。",
"label.is": "等于",
@@ -95,8 +95,8 @@
"label.is-set": "已设置",
"label.join": "加入",
"label.join-team": "加入团队",
- "label.journey": "Journey",
- "label.journey-description": "Understand how users navigate through your website.",
+ "label.journey": "用户浏览轨迹",
+ "label.journey-description": "了解用户如何浏览网站。",
"label.language": "语言",
"label.languages": "语言",
"label.laptop": "笔记本",
@@ -110,7 +110,7 @@
"label.login": "登录",
"label.logout": "退出",
"label.manage": "管理",
- "label.manager": "Manager",
+ "label.manager": "管理者",
"label.max": "最大",
"label.member": "成员",
"label.members": "成员",
@@ -123,7 +123,7 @@
"label.new-password": "新密码",
"label.none": "无",
"label.number-of-records": "{x} {x, plural, one {record} other {records}}",
- "label.ok": "OK",
+ "label.ok": "好的",
"label.os": "操作系统",
"label.overview": "概览",
"label.owner": "所有者",
@@ -133,11 +133,11 @@
"label.pages": "网页",
"label.password": "密码",
"label.powered-by": "由 {name} 提供支持",
- "label.previous": "Previous",
- "label.previous-period": "Previous period",
- "label.previous-year": "Previous year",
+ "label.previous": "先前",
+ "label.previous-period": "上一时期",
+ "label.previous-year": "上一年",
"label.profile": "个人资料",
- "label.property": "Property",
+ "label.property": "属性",
"label.queries": "查询",
"label.query": "查询",
"label.query-parameters": "查询参数",
@@ -169,13 +169,13 @@
"label.settings": "设置",
"label.share-url": "共享链接",
"label.single-day": "单日",
- "label.start-step": "Start Step",
+ "label.start-step": "开始步骤",
"label.steps": "步骤",
"label.sum": "总和",
"label.tablet": "平板",
"label.team": "团队",
"label.team-id": "团队 ID",
- "label.team-manager": "Team manager",
+ "label.team-manager": "团队管理者",
"label.team-member": "团队成员",
"label.team-name": "团队名称",
"label.team-owner": "团队所有者",
@@ -225,7 +225,7 @@
"label.yesterday": "昨天",
"message.action-confirmation": "在下面的框中输入 {confirmation} 以确认。",
"message.active-users": "当前在线 {x} 人",
- "message.collected-data": "Collected data",
+ "message.collected-data": "已收集的数据",
"message.confirm-delete": "你确定要删除 {target} 吗?",
"message.confirm-leave": "你确定要离开 {target} 吗?",
"message.confirm-remove": "您确定要移除 {target} ?",
diff --git a/src/lib/clickhouse.ts b/src/lib/clickhouse.ts
index b6d0fc3f..2bda9bfa 100644
--- a/src/lib/clickhouse.ts
+++ b/src/lib/clickhouse.ts
@@ -2,18 +2,19 @@ import { ClickHouseClient, createClient } from '@clickhouse/client';
import dateFormat from 'dateformat';
import debug from 'debug';
import { CLICKHOUSE } from 'lib/db';
-import { QueryFilters, QueryOptions } from './types';
-import { OPERATORS } from './constants';
+import { PageParams, QueryFilters, QueryOptions } from './types';
+import { DEFAULT_PAGE_SIZE, OPERATORS } from './constants';
import { fetchWebsite } from './load';
import { maxDate } from './date';
import { filtersToArray } from './params';
export const CLICKHOUSE_DATE_FORMATS = {
- minute: '%Y-%m-%d %H:%i:00',
- hour: '%Y-%m-%d %H:00:00',
- day: '%Y-%m-%d',
- month: '%Y-%m-01',
- year: '%Y-01-01',
+ second: '%Y-%m-%dT%H:%i:%S',
+ minute: '%Y-%m-%dT%H:%i:00',
+ hour: '%Y-%m-%dT%H:00:00',
+ day: '%Y-%m-%dT00:00:00',
+ month: '%Y-%m-01T00:00:00',
+ year: '%Y-01-01T00:00:00',
};
const log = debug('umami:clickhouse');
@@ -32,7 +33,7 @@ function getClient() {
} = new URL(process.env.CLICKHOUSE_URL);
const client = createClient({
- host: `${protocol}//${hostname}:${port}`,
+ url: `${protocol}//${hostname}:${port}`,
database: pathname.replace('/', ''),
username: username,
password,
@@ -47,11 +48,15 @@ function getClient() {
return client;
}
-function getDateStringQuery(data: any, unit: string | number) {
+function getDateStringSQL(data: any, unit: string | number, timezone?: string) {
+ if (timezone) {
+ return `formatDateTime(${data}, '${CLICKHOUSE_DATE_FORMATS[unit]}', '${timezone}')`;
+ }
+
return `formatDateTime(${data}, '${CLICKHOUSE_DATE_FORMATS[unit]}')`;
}
-function getDateQuery(field: string, unit: string, timezone?: string) {
+function getDateSQL(field: string, unit: string, timezone?: string) {
if (timezone) {
return `date_trunc('${unit}', ${field}, '${timezone}')`;
}
@@ -95,6 +100,20 @@ function getFilterQuery(filters: QueryFilters = {}, options: QueryOptions = {})
return query.join('\n');
}
+function getDateQuery(filters: QueryFilters = {}) {
+ const { startDate, endDate } = filters;
+
+ if (startDate) {
+ if (endDate) {
+ return `and created_at between {startDate:DateTime64} and {endDate:DateTime64}`;
+ } else {
+ return `and created_at >= {startDate:DateTime64}`;
+ }
+ }
+
+ return '';
+}
+
function getFilterParams(filters: QueryFilters = {}) {
return filtersToArray(filters).reduce((obj, { name, value }) => {
if (name && value !== undefined) {
@@ -110,6 +129,7 @@ async function parseFilters(websiteId: string, filters: QueryFilters = {}, optio
return {
filterQuery: getFilterQuery(filters, options),
+ dateQuery: getDateQuery(filters),
params: {
...getFilterParams(filters),
websiteId,
@@ -119,6 +139,32 @@ async function parseFilters(websiteId: string, filters: QueryFilters = {}, optio
};
}
+async function pagedQuery(
+ query: string,
+ queryParams: { [key: string]: any },
+ pageParams: PageParams = {},
+) {
+ const { page = 1, pageSize, orderBy, sortDescending = false } = pageParams;
+ const size = +pageSize || DEFAULT_PAGE_SIZE;
+ const offset = +size * (page - 1);
+ const direction = sortDescending ? 'desc' : 'asc';
+
+ const statements = [
+ orderBy && `order by ${orderBy} ${direction}`,
+ +size > 0 && `limit ${+size} offset ${offset}`,
+ ]
+ .filter(n => n)
+ .join('\n');
+
+ const count = await rawQuery(`select count(*) as num from (${query}) t`, queryParams).then(
+ res => res[0].num,
+ );
+
+ const data = await rawQuery(`${query}${statements}`, queryParams);
+
+ return { data, count, page: +page, pageSize: size, orderBy };
+}
+
async function rawQuery(
query: string,
params: Record = {},
@@ -136,7 +182,13 @@ async function rawQuery(
format: 'JSONEachRow',
});
- return resultSet.json();
+ return resultSet.json() as T;
+}
+
+async function insert(table: string, values: any[]) {
+ await connect();
+
+ return clickhouse.insert({ table, values, format: 'JSONEachRow' });
}
async function findUnique(data: any[]) {
@@ -164,12 +216,14 @@ export default {
client: clickhouse,
log,
connect,
- getDateStringQuery,
- getDateQuery,
+ getDateStringSQL,
+ getDateSQL,
getDateFormat,
getFilterQuery,
parseFilters,
+ pagedQuery,
findUnique,
findFirst,
rawQuery,
+ insert,
};
diff --git a/src/lib/constants.ts b/src/lib/constants.ts
index 35917802..aa1b3c0f 100644
--- a/src/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -58,8 +58,8 @@ export const SESSION_COLUMNS = [
export const FILTER_COLUMNS = {
url: 'url_path',
- entry: 'url_path',
- exit: 'url_path',
+ entry: 'entry_url',
+ exit: 'exit_url',
referrer: 'referrer_domain',
host: 'hostname',
title: 'page_title',
@@ -248,7 +248,8 @@ export const UUID_REGEX =
/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/;
export const HOSTNAME_REGEX =
/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/;
-export const IP_REGEX = /^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$/;
+export const IP_REGEX =
+ /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|^(?:(?:[0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:(?:(:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$/;
export const DATETIME_REGEX =
/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{3}(Z|\+[0-9]{2}:[0-9]{2})?)?$/;
diff --git a/src/lib/date.ts b/src/lib/date.ts
index de76f7f3..2fb24073 100644
--- a/src/lib/date.ts
+++ b/src/lib/date.ts
@@ -292,7 +292,7 @@ export function getDateArray(data: any[], startDate: Date, endDate: Date, unit:
for (let i = 0; i <= n; i++) {
const t = start(add(startDate, i));
- const y = data.find(({ x }) => start(getDateFromString(x)).getTime() === t.getTime())?.y || 0;
+ const y = data.find(({ x }) => start(new Date(x)).getTime() === t.getTime())?.y || 0;
arr.push({ x: t, y });
}
diff --git a/src/lib/detect.ts b/src/lib/detect.ts
index 64f70e6c..56a037ec 100644
--- a/src/lib/detect.ts
+++ b/src/lib/detect.ts
@@ -2,9 +2,9 @@ import path from 'path';
import { getClientIp } from 'request-ip';
import { browserName, detectOS } from 'detect-browser';
import isLocalhost from 'is-localhost-ip';
+import ipaddr from 'ipaddr.js';
import maxmind from 'maxmind';
import { safeDecodeURIComponent } from 'next-basics';
-
import {
DESKTOP_OS,
MOBILE_OS,
@@ -137,3 +137,31 @@ export async function getClientInfo(req: NextApiRequestCollect) {
return { userAgent, browser, os, ip, country, subdivision1, subdivision2, city, device };
}
+
+export function hasBlockedIp(req: NextApiRequestCollect) {
+ const ignoreIps = process.env.IGNORE_IP;
+
+ if (ignoreIps) {
+ const ips = [];
+
+ if (ignoreIps) {
+ ips.push(...ignoreIps.split(',').map(n => n.trim()));
+ }
+
+ const clientIp = getIpAddress(req);
+
+ return ips.find(ip => {
+ if (ip === clientIp) return true;
+
+ // CIDR notation
+ if (ip.indexOf('/') > 0) {
+ const addr = ipaddr.parse(clientIp);
+ const range = ipaddr.parseCIDR(ip);
+
+ if (addr.kind() === range[0].kind() && addr.match(range)) return true;
+ }
+ });
+ }
+
+ return false;
+}
diff --git a/src/lib/kafka.ts b/src/lib/kafka.ts
index da38baa4..76692afb 100644
--- a/src/lib/kafka.ts
+++ b/src/lib/kafka.ts
@@ -61,8 +61,8 @@ function getDateFormat(date: Date, format?: string): string {
}
async function sendMessage(
- message: { [key: string]: string | number },
topic: string,
+ message: { [key: string]: string | number },
): Promise {
await connect();
@@ -77,7 +77,7 @@ async function sendMessage(
});
}
-async function sendMessages(messages: { [key: string]: string | number }[], topic: string) {
+async function sendMessages(topic: string, messages: { [key: string]: string | number }[]) {
await connect();
await producer.send({
diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts
index 6250f2e5..28835414 100644
--- a/src/lib/prisma.ts
+++ b/src/lib/prisma.ts
@@ -60,7 +60,7 @@ function getCastColumnQuery(field: string, type: string): string {
}
}
-function getDateQuery(field: string, unit: string, timezone?: string): string {
+function getDateSQL(field: string, unit: string, timezone?: string): string {
const db = getDatabaseType();
if (db === POSTGRESQL) {
@@ -81,7 +81,19 @@ function getDateQuery(field: string, unit: string, timezone?: string): string {
}
}
-function getTimestampDiffQuery(field1: string, field2: string): string {
+export function getTimestampSQL(field: string) {
+ const db = getDatabaseType();
+
+ if (db === POSTGRESQL) {
+ return `floor(extract(epoch from ${field}))`;
+ }
+
+ if (db === MYSQL) {
+ return `UNIX_TIMESTAMP(${field})`;
+ }
+}
+
+function getTimestampDiffSQL(field1: string, field2: string): string {
const db = getDatabaseType();
if (db === POSTGRESQL) {
@@ -93,7 +105,7 @@ function getTimestampDiffQuery(field1: string, field2: string): string {
}
}
-function getSearchQuery(column: string): string {
+function getSearchSQL(column: string): string {
const db = getDatabaseType();
const like = db === POSTGRESQL ? 'ilike' : 'like';
@@ -137,6 +149,20 @@ function getFilterQuery(filters: QueryFilters = {}, options: QueryOptions = {}):
return query.join('\n');
}
+function getDateQuery(filters: QueryFilters = {}) {
+ const { startDate, endDate } = filters;
+
+ if (startDate) {
+ if (endDate) {
+ return `and website_event.created_at between {{startDate}} and {{endDate}}`;
+ } else {
+ return `and website_event.created_at >= {{startDate}}`;
+ }
+ }
+
+ return '';
+}
+
function getFilterParams(filters: QueryFilters = {}) {
return filtersToArray(filters).reduce((obj, { name, operator, value }) => {
obj[name] = [OPERATORS.contains, OPERATORS.doesNotContain].includes(operator)
@@ -161,6 +187,7 @@ async function parseFilters(
? `inner join session on website_event.session_id = session.session_id`
: '',
filterQuery: getFilterQuery(filters, options),
+ dateQuery: getDateQuery(filters),
params: {
...getFilterParams(filters),
websiteId,
@@ -191,8 +218,8 @@ async function rawQuery(sql: string, data: object): Promise {
return prisma.rawQuery(query, params);
}
-async function pagedQuery(model: string, criteria: T, filters: PageParams) {
- const { page = 1, pageSize, orderBy, sortDescending = false } = filters || {};
+async function pagedQuery(model: string, criteria: T, pageParams: PageParams) {
+ const { page = 1, pageSize, orderBy, sortDescending = false } = pageParams || {};
const size = +pageSize || DEFAULT_PAGE_SIZE;
const data = await prisma.client[model].findMany({
@@ -256,11 +283,11 @@ export default {
getAddIntervalQuery,
getCastColumnQuery,
getDayDiffQuery,
- getDateQuery,
+ getDateSQL,
getFilterQuery,
getSearchParameters,
- getTimestampDiffQuery,
- getSearchQuery,
+ getTimestampDiffSQL,
+ getSearchSQL,
getQueryMode,
pagedQuery,
parseFilters,
diff --git a/src/pages/api/scripts/telemetry.ts b/src/pages/api/scripts/telemetry.ts
deleted file mode 100644
index a8a8872e..00000000
--- a/src/pages/api/scripts/telemetry.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { ok } from 'next-basics';
-import { CURRENT_VERSION, TELEMETRY_PIXEL } from 'lib/constants';
-import { NextApiRequest, NextApiResponse } from 'next';
-
-export default function handler(req: NextApiRequest, res: NextApiResponse) {
- if (process.env.NODE_ENV === 'production') {
- res.setHeader('content-type', 'text/javascript');
-
- if (process.env.DISABLE_TELEMETRY || process.env.PRIVATE_MODE) {
- return res.send('/* telemetry disabled */');
- }
-
- const script = `
- (()=>{const i=document.createElement('img');
- i.setAttribute('src','${TELEMETRY_PIXEL}?v=${CURRENT_VERSION}');
- i.setAttribute('style','width:0;height:0;position:absolute;pointer-events:none;');
- document.body.appendChild(i);})();
- `;
-
- return res.send(script.replace(/\s\s+/g, ''));
- }
-
- return ok(res);
-}
diff --git a/src/pages/api/send.ts b/src/pages/api/send.ts
index ab565e6e..31318420 100644
--- a/src/pages/api/send.ts
+++ b/src/pages/api/send.ts
@@ -1,4 +1,3 @@
-import ipaddr from 'ipaddr.js';
import { isbot } from 'isbot';
import { NextApiRequest, NextApiResponse } from 'next';
import {
@@ -12,7 +11,7 @@ import {
} from 'next-basics';
import { COLLECTION_TYPE, HOSTNAME_REGEX, IP_REGEX } from 'lib/constants';
import { secret, visitSalt, uuid } from 'lib/crypto';
-import { getIpAddress } from 'lib/detect';
+import { hasBlockedIp } from 'lib/detect';
import { useCors, useSession, useValidate } from 'lib/middleware';
import { CollectionType, YupRequest } from 'lib/types';
import { saveEvent, saveSessionData } from 'queries';
@@ -122,7 +121,7 @@ export default async (req: NextApiRequestCollect, res: NextApiResponse) => {
urlPath = '/';
}
- if (referrerPath?.startsWith('http')) {
+ if (/^[\w-]+:\/\/\w+/.test(referrerPath)) {
const refUrl = new URL(referrer);
referrerPath = refUrl.pathname;
referrerQuery = refUrl.search.substring(1);
@@ -166,31 +165,3 @@ export default async (req: NextApiRequestCollect, res: NextApiResponse) => {
return methodNotAllowed(res);
};
-
-function hasBlockedIp(req: NextApiRequestCollect) {
- const ignoreIps = process.env.IGNORE_IP;
-
- if (ignoreIps) {
- const ips = [];
-
- if (ignoreIps) {
- ips.push(...ignoreIps.split(',').map(n => n.trim()));
- }
-
- const clientIp = getIpAddress(req);
-
- return ips.find(ip => {
- if (ip === clientIp) return true;
-
- // CIDR notation
- if (ip.indexOf('/') > 0) {
- const addr = ipaddr.parse(clientIp);
- const range = ipaddr.parseCIDR(ip);
-
- if (addr.kind() === range[0].kind() && addr.match(range)) return true;
- }
- });
- }
-
- return false;
-}
diff --git a/src/pages/api/websites/[websiteId]/metrics.ts b/src/pages/api/websites/[websiteId]/metrics.ts
index 3dac217b..b37c38f7 100644
--- a/src/pages/api/websites/[websiteId]/metrics.ts
+++ b/src/pages/api/websites/[websiteId]/metrics.ts
@@ -64,7 +64,7 @@ export default async (
await useAuth(req, res);
await useValidate(schema, req, res);
- const { websiteId, type, limit, offset, search } = req.query;
+ const { websiteId, type, limit, offset, search, unit } = req.query;
if (req.method === 'GET') {
if (!(await canViewWebsite(req.auth, websiteId))) {
@@ -89,7 +89,7 @@ export default async (
}
if (SESSION_COLUMNS.includes(type)) {
- const data = await getSessionMetrics(websiteId, type, filters, limit, offset);
+ const data = await getSessionMetrics(websiteId, type, filters, limit, offset, unit as string);
if (type === 'language') {
const combined = {};
@@ -111,7 +111,14 @@ export default async (
}
if (EVENT_COLUMNS.includes(type)) {
- const data = await getPageviewMetrics(websiteId, type, filters, limit, offset);
+ const data = await getPageviewMetrics(
+ websiteId,
+ type,
+ filters,
+ limit,
+ offset,
+ unit as string,
+ );
return ok(res, data);
}
diff --git a/src/pages/api/websites/[websiteId]/sessions.ts b/src/pages/api/websites/[websiteId]/sessions.ts
new file mode 100644
index 00000000..21cacb1c
--- /dev/null
+++ b/src/pages/api/websites/[websiteId]/sessions.ts
@@ -0,0 +1,42 @@
+import * as yup from 'yup';
+import { canViewWebsite } from 'lib/auth';
+import { useAuth, useCors, useValidate } from 'lib/middleware';
+import { NextApiRequestQueryBody, PageParams } from 'lib/types';
+import { NextApiResponse } from 'next';
+import { methodNotAllowed, ok, unauthorized } from 'next-basics';
+import { pageInfo } from 'lib/schema';
+import { getSessions } from 'queries';
+
+export interface ReportsRequestQuery extends PageParams {
+ websiteId: string;
+}
+
+const schema = {
+ GET: yup.object().shape({
+ websiteId: yup.string().uuid().required(),
+ ...pageInfo,
+ }),
+};
+
+export default async (
+ req: NextApiRequestQueryBody,
+ res: NextApiResponse,
+) => {
+ await useCors(req, res);
+ await useAuth(req, res);
+ await useValidate(schema, req, res);
+
+ const { websiteId } = req.query;
+
+ if (req.method === 'GET') {
+ if (!(await canViewWebsite(req.auth, websiteId))) {
+ return unauthorized(res);
+ }
+
+ const data = await getSessions(websiteId, {}, req.query);
+
+ return ok(res, data);
+ }
+
+ return methodNotAllowed(res);
+};
diff --git a/src/pages/api/websites/[websiteId]/stats.ts b/src/pages/api/websites/[websiteId]/stats.ts
index 0189627a..1c684dbe 100644
--- a/src/pages/api/websites/[websiteId]/stats.ts
+++ b/src/pages/api/websites/[websiteId]/stats.ts
@@ -56,7 +56,7 @@ export default async (
await useAuth(req, res);
await useValidate(schema, req, res);
- const { websiteId, compare } = req.query;
+ const { websiteId, compare, unit } = req.query;
if (req.method === 'GET') {
if (!(await canViewWebsite(req.auth, websiteId))) {
@@ -72,9 +72,13 @@ export default async (
const filters = getRequestFilters(req);
- const metrics = await getWebsiteStats(websiteId, { ...filters, startDate, endDate });
+ const metrics = await getWebsiteStats(websiteId, unit as string, {
+ ...filters,
+ startDate,
+ endDate,
+ });
- const prevPeriod = await getWebsiteStats(websiteId, {
+ const prevPeriod = await getWebsiteStats(websiteId, unit as string, {
...filters,
startDate: compareStartDate,
endDate: compareEndDate,
diff --git a/src/queries/analytics/eventData/saveEventData.ts b/src/queries/analytics/eventData/saveEventData.ts
index 0ed3c8b0..9c7218e9 100644
--- a/src/queries/analytics/eventData/saveEventData.ts
+++ b/src/queries/analytics/eventData/saveEventData.ts
@@ -3,6 +3,7 @@ import { DATA_TYPE } from 'lib/constants';
import { uuid } from 'lib/crypto';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
import { flattenJSON, getStringValue } from 'lib/data';
+import clickhouse from 'lib/clickhouse';
import kafka from 'lib/kafka';
import prisma from 'lib/prisma';
import { DynamicData } from 'lib/types';
@@ -59,6 +60,7 @@ async function clickhouseQuery(data: {
}) {
const { websiteId, sessionId, eventId, urlPath, eventName, eventData, createdAt } = data;
+ const { insert } = clickhouse;
const { getDateFormat, sendMessages } = kafka;
const jsonKeys = flattenJSON(eventData);
@@ -79,7 +81,11 @@ async function clickhouseQuery(data: {
};
});
- await sendMessages(messages, 'event_data');
+ if (kafka.enabled) {
+ await sendMessages('event_data', messages);
+ } else {
+ await insert('event_data', messages);
+ }
return data;
}
diff --git a/src/queries/analytics/events/getEventMetrics.ts b/src/queries/analytics/events/getEventMetrics.ts
index 32cccd3e..c97c11ad 100644
--- a/src/queries/analytics/events/getEventMetrics.ts
+++ b/src/queries/analytics/events/getEventMetrics.ts
@@ -15,7 +15,7 @@ export async function getEventMetrics(
async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { timezone = 'utc', unit = 'day' } = filters;
- const { rawQuery, getDateQuery, parseFilters } = prisma;
+ const { rawQuery, getDateSQL, parseFilters } = prisma;
const { filterQuery, joinSession, params } = await parseFilters(websiteId, {
...filters,
eventType: EVENT_TYPE.customEvent,
@@ -25,7 +25,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
`
select
event_name x,
- ${getDateQuery('website_event.created_at', unit, timezone)} t,
+ ${getDateSQL('website_event.created_at', unit, timezone)} t,
count(*) y
from website_event
${joinSession}
@@ -45,23 +45,29 @@ async function clickhouseQuery(
filters: QueryFilters,
): Promise<{ x: string; t: string; y: number }[]> {
const { timezone = 'UTC', unit = 'day' } = filters;
- const { rawQuery, getDateQuery, parseFilters } = clickhouse;
+ const { rawQuery, getDateSQL, parseFilters } = clickhouse;
const { filterQuery, params } = await parseFilters(websiteId, {
...filters,
eventType: EVENT_TYPE.customEvent,
});
+ const table = unit === 'hour' ? 'website_event_stats_hourly' : 'website_event_stats_daily';
+
return rawQuery(
`
select
event_name x,
- ${getDateQuery('created_at', unit, timezone)} t,
+ ${getDateSQL('created_at', unit, timezone)} t,
count(*) y
- from website_event
- where website_id = {websiteId:UUID}
- and created_at between {startDate:DateTime64} and {endDate:DateTime64}
- and event_type = {eventType:UInt32}
+ from (
+ select arrayJoin(event_name) as event_name,
+ created_at
+ from ${table} website_event
+ where website_id = {websiteId:UUID}
+ and created_at between {startDate:DateTime64} and {endDate:DateTime64}
+ and event_type = {eventType:UInt32}
${filterQuery}
+ ) as g
group by x, t
order by t
`,
diff --git a/src/queries/analytics/events/getEvents.ts b/src/queries/analytics/events/getEvents.ts
index c333242e..540c1a05 100644
--- a/src/queries/analytics/events/getEvents.ts
+++ b/src/queries/analytics/events/getEvents.ts
@@ -1,63 +1,54 @@
import clickhouse from 'lib/clickhouse';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
import prisma from 'lib/prisma';
-import { QueryFilters } from 'lib/types';
+import { PageParams, QueryFilters } from 'lib/types';
-export function getEvents(...args: [websiteId: string, filters: QueryFilters]) {
+export function getEvents(
+ ...args: [websiteId: string, filters: QueryFilters, pageParams?: PageParams]
+) {
return runQuery({
[PRISMA]: () => relationalQuery(...args),
[CLICKHOUSE]: () => clickhouseQuery(...args),
});
}
-function relationalQuery(websiteId: string, filters: QueryFilters) {
- const { startDate } = filters;
+async function relationalQuery(websiteId: string, filters: QueryFilters, pageParams?: PageParams) {
+ const { pagedQuery } = prisma;
- return prisma.client.websiteEvent
- .findMany({
- where: {
- websiteId,
- createdAt: {
- gte: startDate,
- },
- },
- orderBy: {
- createdAt: 'desc',
- },
- })
- .then(a => {
- return Object.values(a).map(a => {
- return {
- ...a,
- timestamp: new Date(a.createdAt).getTime() / 1000,
- };
- });
- });
+ const where = {
+ ...filters,
+ id: websiteId,
+ };
+
+ return pagedQuery('website_event', { where }, pageParams);
}
-function clickhouseQuery(websiteId: string, filters: QueryFilters) {
- const { rawQuery } = clickhouse;
- const { startDate } = filters;
+async function clickhouseQuery(websiteId: string, filters: QueryFilters, pageParams?: PageParams) {
+ const { pagedQuery, parseFilters, getDateStringSQL } = clickhouse;
+ const { params, dateQuery, filterQuery } = await parseFilters(websiteId, filters);
- return rawQuery(
+ return pagedQuery(
`
select
event_id as id,
website_id as websiteId,
session_id as sessionId,
- created_at as createdAt,
- toUnixTimestamp(created_at) as timestamp,
+ ${getDateStringSQL('created_at', 'second', filters.timezone)} as createdAt,
url_path as urlPath,
+ url_query as urlQuery,
+ referrer_path as referrerPath,
+ referrer_query as referrerQuery,
referrer_domain as referrerDomain,
+ page_title as pageTitle,
+ event_type as eventType,
event_name as eventName
from website_event
where website_id = {websiteId:UUID}
- and created_at >= {startDate:DateTime64}
+ ${dateQuery}
+ ${filterQuery}
order by created_at desc
`,
- {
- websiteId,
- startDate,
- },
+ params,
+ pageParams,
);
}
diff --git a/src/queries/analytics/events/saveEvent.ts b/src/queries/analytics/events/saveEvent.ts
index 25bcf9e7..cd41b7a3 100644
--- a/src/queries/analytics/events/saveEvent.ts
+++ b/src/queries/analytics/events/saveEvent.ts
@@ -1,5 +1,6 @@
import { EVENT_NAME_LENGTH, URL_LENGTH, EVENT_TYPE, PAGE_TITLE_LENGTH } from 'lib/constants';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
+import clickhouse from 'lib/clickhouse';
import kafka from 'lib/kafka';
import prisma from 'lib/prisma';
import { uuid } from 'lib/crypto';
@@ -134,6 +135,7 @@ async function clickhouseQuery(data: {
city,
...args
} = data;
+ const { insert } = clickhouse;
const { getDateFormat, sendMessage } = kafka;
const eventId = uuid();
const createdAt = getDateFormat(new Date());
@@ -164,7 +166,11 @@ async function clickhouseQuery(data: {
created_at: createdAt,
};
- await sendMessage(message, 'event');
+ if (kafka.enabled) {
+ await sendMessage('event', message);
+ } else {
+ await insert('website_event', [message]);
+ }
if (eventData) {
await saveEventData({
diff --git a/src/queries/analytics/getRealtimeData.ts b/src/queries/analytics/getRealtimeData.ts
index b42fbc50..5a9c5a36 100644
--- a/src/queries/analytics/getRealtimeData.ts
+++ b/src/queries/analytics/getRealtimeData.ts
@@ -19,15 +19,15 @@ export async function getRealtimeData(
const { startDate, timezone } = criteria;
const filters = { startDate, endDate: new Date(), unit: 'minute', timezone };
const [events, sessions, pageviews, sessionviews] = await Promise.all([
- getEvents(websiteId, { startDate }),
- getSessions(websiteId, { startDate }),
+ getEvents(websiteId, { startDate, timezone }, { pageSize: 10000 }),
+ getSessions(websiteId, { startDate, timezone }, { pageSize: 10000 }),
getPageviewStats(websiteId, filters),
getSessionStats(websiteId, filters),
]);
const uniques = new Set();
- const sessionStats = sessions.reduce(
+ const sessionStats = sessions.data.reduce(
(obj: { visitors: any; countries: any }, session: { id: any; country: any }) => {
const { countries, visitors } = obj;
const { id, country } = session;
@@ -49,7 +49,7 @@ export async function getRealtimeData(
},
);
- const eventStats = events.reduce(
+ const eventStats = events.data.reduce(
(
obj: { urls: any; referrers: any; events: any },
event: { urlPath: any; referrerDomain: any },
@@ -81,9 +81,9 @@ export async function getRealtimeData(
visitors: sessionviews,
},
totals: {
- views: events.filter(e => !e.eventName).length,
+ views: events.data.filter(e => !e.eventName).length,
visitors: uniques.size,
- events: events.filter(e => e.eventName).length,
+ events: events.data.filter(e => e.eventName).length,
countries: Object.keys(sessionStats.countries).length,
},
timestamp: Date.now(),
diff --git a/src/queries/analytics/getValues.ts b/src/queries/analytics/getValues.ts
index 7cd34994..8b1afb3f 100644
--- a/src/queries/analytics/getValues.ts
+++ b/src/queries/analytics/getValues.ts
@@ -18,11 +18,11 @@ async function relationalQuery(
endDate: Date,
search: string,
) {
- const { rawQuery, getSearchQuery } = prisma;
+ const { rawQuery, getSearchSQL } = prisma;
let searchQuery = '';
if (search) {
- searchQuery = getSearchQuery(column);
+ searchQuery = getSearchSQL(column);
}
return rawQuery(
diff --git a/src/queries/analytics/getWebsiteStats.ts b/src/queries/analytics/getWebsiteStats.ts
index 6257e166..125715ca 100644
--- a/src/queries/analytics/getWebsiteStats.ts
+++ b/src/queries/analytics/getWebsiteStats.ts
@@ -1,3 +1,4 @@
+/* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */
import clickhouse from 'lib/clickhouse';
import { EVENT_TYPE } from 'lib/constants';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
@@ -5,7 +6,7 @@ import prisma from 'lib/prisma';
import { QueryFilters } from 'lib/types';
export async function getWebsiteStats(
- ...args: [websiteId: string, filters: QueryFilters]
+ ...args: [websiteId: string, unit: string, filters: QueryFilters]
): Promise<
{ pageviews: number; visitors: number; visits: number; bounces: number; totaltime: number }[]
> {
@@ -17,11 +18,12 @@ export async function getWebsiteStats(
async function relationalQuery(
websiteId: string,
+ unit: string,
filters: QueryFilters,
): Promise<
{ pageviews: number; visitors: number; visits: number; bounces: number; totaltime: number }[]
> {
- const { getTimestampDiffQuery, parseFilters, rawQuery } = prisma;
+ const { getTimestampDiffSQL, parseFilters, rawQuery } = prisma;
const { filterQuery, joinSession, params } = await parseFilters(websiteId, {
...filters,
eventType: EVENT_TYPE.pageView,
@@ -34,7 +36,7 @@ async function relationalQuery(
count(distinct t.session_id) as "visitors",
count(distinct t.visit_id) as "visits",
sum(case when t.c = 1 then 1 else 0 end) as "bounces",
- sum(${getTimestampDiffQuery('t.min_time', 't.max_time')}) as "totaltime"
+ sum(${getTimestampDiffSQL('t.min_time', 't.max_time')}) as "totaltime"
from (
select
website_event.session_id,
@@ -57,6 +59,7 @@ async function relationalQuery(
async function clickhouseQuery(
websiteId: string,
+ unit: string,
filters: QueryFilters,
): Promise<
{ pageviews: number; visitors: number; visits: number; bounces: number; totaltime: number }[]
@@ -66,29 +69,21 @@ async function clickhouseQuery(
...filters,
eventType: EVENT_TYPE.pageView,
});
+ const table = unit === 'hour' ? 'website_event_stats_hourly' : 'website_event_stats_daily';
return rawQuery(
`
select
- sum(t.c) as "pageviews",
- count(distinct t.session_id) as "visitors",
- count(distinct t.visit_id) as "visits",
- sum(if(t.c = 1, 1, 0)) as "bounces",
+ sum(views) as "pageviews",
+ uniq(session_id) as "visitors",
+ uniq(visit_id) as "visits",
+ sumIf(1, views = 1) as "bounces",
sum(max_time-min_time) as "totaltime"
- from (
- select
- session_id,
- visit_id,
- count(*) c,
- min(created_at) min_time,
- max(created_at) max_time
- from website_event
- where website_id = {websiteId:UUID}
- and created_at between {startDate:DateTime64} and {endDate:DateTime64}
- and event_type = {eventType:UInt32}
- ${filterQuery}
- group by session_id, visit_id
- ) as t;
+ from ${table} "website_event"
+ where website_id = {websiteId:UUID}
+ and created_at between {startDate:DateTime64} and {endDate:DateTime64}
+ and event_type = {eventType:UInt32}
+ ${filterQuery};
`,
params,
).then(result => {
diff --git a/src/queries/analytics/pageviews/getPageviewMetrics.ts b/src/queries/analytics/pageviews/getPageviewMetrics.ts
index 67ccb04a..d66ec6aa 100644
--- a/src/queries/analytics/pageviews/getPageviewMetrics.ts
+++ b/src/queries/analytics/pageviews/getPageviewMetrics.ts
@@ -1,3 +1,4 @@
+/* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */
import clickhouse from 'lib/clickhouse';
import { EVENT_TYPE, FILTER_COLUMNS, SESSION_COLUMNS } from 'lib/constants';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
@@ -5,7 +6,14 @@ import prisma from 'lib/prisma';
import { QueryFilters } from 'lib/types';
export async function getPageviewMetrics(
- ...args: [websiteId: string, type: string, filters: QueryFilters, limit?: number, offset?: number]
+ ...args: [
+ websiteId: string,
+ type: string,
+ filters: QueryFilters,
+ limit?: number,
+ offset?: number,
+ unit?: string,
+ ]
) {
return runQuery({
[PRISMA]: () => relationalQuery(...args),
@@ -19,6 +27,7 @@ async function relationalQuery(
filters: QueryFilters,
limit: number = 500,
offset: number = 0,
+ unit: string,
) {
const column = FILTER_COLUMNS[type] || type;
const { rawQuery, parseFilters } = prisma;
@@ -42,15 +51,18 @@ async function relationalQuery(
const aggregrate = type === 'entry' ? 'min' : 'max';
entryExitQuery = `
- JOIN (select visit_id,
- ${aggregrate}(created_at) target_created_at
- from website_event
- where website_event.website_id = {{websiteId::uuid}}
- and website_event.created_at between {{startDate}} and {{endDate}}
- and event_type = {{eventType}}
- group by visit_id) x
- ON x.visit_id = website_event.visit_id
- and x.target_created_at = website_event.created_at`;
+ join (
+ select visit_id,
+ ${aggregrate}(created_at) target_created_at
+ from website_event
+ where website_event.website_id = {{websiteId::uuid}}
+ and website_event.created_at between {{startDate}} and {{endDate}}
+ and event_type = {{eventType}}
+ group by visit_id
+ ) x
+ on x.visit_id = website_event.visit_id
+ and x.target_created_at = website_event.created_at
+ `;
}
return rawQuery(
@@ -79,6 +91,7 @@ async function clickhouseQuery(
filters: QueryFilters,
limit: number = 500,
offset: number = 0,
+ unit: string,
): Promise<{ x: string; y: number }[]> {
const column = FILTER_COLUMNS[type] || type;
const { rawQuery, parseFilters } = clickhouse;
@@ -87,37 +100,42 @@ async function clickhouseQuery(
eventType: column === 'event_name' ? EVENT_TYPE.customEvent : EVENT_TYPE.pageView,
});
- let entryExitQuery = '';
let excludeDomain = '';
+ let groupByQuery = '';
+
if (column === 'referrer_domain') {
- excludeDomain = `and referrer_domain != {websiteDomain:String} and referrer_domain != ''`;
+ excludeDomain = `and t != {websiteDomain:String} and t != ''`;
+ }
+
+ let columnQuery = `arrayJoin(${column})`;
+
+ if (type === 'entry') {
+ columnQuery = `visit_id x, argMinMerge(${column})`;
+ }
+
+ if (type === 'exit') {
+ columnQuery = `visit_id x, argMaxMerge(${column})`;
}
if (type === 'entry' || type === 'exit') {
- const aggregrate = type === 'entry' ? 'min' : 'max';
-
- entryExitQuery = `
- JOIN (select visit_id,
- ${aggregrate}(created_at) target_created_at
- from website_event
- where website_id = {websiteId:UUID}
- and created_at between {startDate:DateTime64} and {endDate:DateTime64}
- and event_type = {eventType:UInt32}
- group by visit_id) x
- ON x.visit_id = website_event.visit_id
- and x.target_created_at = website_event.created_at`;
+ groupByQuery = 'group by x';
}
+ const table = unit === 'hour' ? 'website_event_stats_hourly' : 'website_event_stats_daily';
+
return rawQuery(
`
- select ${column} x, count(*) y
- from website_event
- ${entryExitQuery}
- where website_id = {websiteId:UUID}
- and created_at between {startDate:DateTime64} and {endDate:DateTime64}
- and event_type = {eventType:UInt32}
- ${excludeDomain}
- ${filterQuery}
+ select g.t as x,
+ count(*) as y
+ from (
+ select ${columnQuery} as t
+ from ${table} website_event
+ where website_id = {websiteId:UUID}
+ and created_at between {startDate:DateTime64} and {endDate:DateTime64}
+ and event_type = {eventType:UInt32}
+ ${excludeDomain}
+ ${filterQuery}
+ ${groupByQuery}) as g
group by x
order by y desc
limit ${limit}
diff --git a/src/queries/analytics/pageviews/getPageviewStats.ts b/src/queries/analytics/pageviews/getPageviewStats.ts
index a37a1566..0bb16ca9 100644
--- a/src/queries/analytics/pageviews/getPageviewStats.ts
+++ b/src/queries/analytics/pageviews/getPageviewStats.ts
@@ -13,7 +13,7 @@ export async function getPageviewStats(...args: [websiteId: string, filters: Que
async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { timezone = 'utc', unit = 'day' } = filters;
- const { getDateQuery, parseFilters, rawQuery } = prisma;
+ const { getDateSQL, parseFilters, rawQuery } = prisma;
const { filterQuery, joinSession, params } = await parseFilters(websiteId, {
...filters,
eventType: EVENT_TYPE.pageView,
@@ -22,7 +22,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
return rawQuery(
`
select
- ${getDateQuery('website_event.created_at', unit, timezone)} x,
+ ${getDateSQL('website_event.created_at', unit, timezone)} x,
count(*) y
from website_event
${joinSession}
@@ -41,22 +41,23 @@ async function clickhouseQuery(
filters: QueryFilters,
): Promise<{ x: string; y: number }[]> {
const { timezone = 'UTC', unit = 'day' } = filters;
- const { parseFilters, rawQuery, getDateStringQuery, getDateQuery } = clickhouse;
+ const { parseFilters, rawQuery, getDateStringSQL, getDateSQL } = clickhouse;
const { filterQuery, params } = await parseFilters(websiteId, {
...filters,
eventType: EVENT_TYPE.pageView,
});
+ const table = unit === 'hour' ? 'website_event_stats_hourly' : 'website_event_stats_daily';
return rawQuery(
`
select
- ${getDateStringQuery('g.t', unit)} as x,
+ ${getDateStringSQL('g.t', unit)} as x,
g.y as y
from (
select
- ${getDateQuery('created_at', unit, timezone)} as t,
- count(*) as y
- from website_event
+ ${getDateSQL('created_at', unit, timezone)} as t,
+ sum(views) as y
+ from ${table} website_event
where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
and event_type = {eventType:UInt32}
diff --git a/src/queries/analytics/reports/getInsights.ts b/src/queries/analytics/reports/getInsights.ts
index c1a4f1f1..8e6e3289 100644
--- a/src/queries/analytics/reports/getInsights.ts
+++ b/src/queries/analytics/reports/getInsights.ts
@@ -23,7 +23,7 @@ async function relationalQuery(
y: number;
}[]
> {
- const { getTimestampDiffQuery, parseFilters, rawQuery } = prisma;
+ const { getTimestampDiffSQL, parseFilters, rawQuery } = prisma;
const { filterQuery, joinSession, params } = await parseFilters(
websiteId,
{
@@ -42,7 +42,7 @@ async function relationalQuery(
count(distinct t.session_id) as "visitors",
count(distinct t.visit_id) as "visits",
sum(case when t.c = 1 then 1 else 0 end) as "bounces",
- sum(${getTimestampDiffQuery('t.min_time', 't.max_time')}) as "totaltime",
+ sum(${getTimestampDiffSQL('t.min_time', 't.max_time')}) as "totaltime",
${parseFieldsByName(fields)}
from (
select
diff --git a/src/queries/analytics/reports/getRetention.ts b/src/queries/analytics/reports/getRetention.ts
index de495cc4..24aa2e3a 100644
--- a/src/queries/analytics/reports/getRetention.ts
+++ b/src/queries/analytics/reports/getRetention.ts
@@ -35,14 +35,14 @@ async function relationalQuery(
}[]
> {
const { startDate, endDate, timezone = 'UTC' } = filters;
- const { getDateQuery, getDayDiffQuery, getCastColumnQuery, rawQuery } = prisma;
+ const { getDateSQL, getDayDiffQuery, getCastColumnQuery, rawQuery } = prisma;
const unit = 'day';
return rawQuery(
`
WITH cohort_items AS (
select session_id,
- ${getDateQuery('created_at', unit, timezone)} as cohort_date
+ ${getDateSQL('created_at', unit, timezone)} as cohort_date
from session
where website_id = {{websiteId::uuid}}
and created_at between {{startDate}} and {{endDate}}
@@ -50,10 +50,7 @@ async function relationalQuery(
user_activities AS (
select distinct
w.session_id,
- ${getDayDiffQuery(
- getDateQuery('created_at', unit, timezone),
- 'c.cohort_date',
- )} as day_number
+ ${getDayDiffQuery(getDateSQL('created_at', unit, timezone), 'c.cohort_date')} as day_number
from website_event w
join cohort_items c
on w.session_id = c.session_id
@@ -115,14 +112,14 @@ async function clickhouseQuery(
}[]
> {
const { startDate, endDate, timezone = 'UTC' } = filters;
- const { getDateQuery, getDateStringQuery, rawQuery } = clickhouse;
+ const { getDateSQL, getDateStringSQL, rawQuery } = clickhouse;
const unit = 'day';
return rawQuery(
`
WITH cohort_items AS (
select
- min(${getDateQuery('created_at', unit, timezone)}) as cohort_date,
+ min(${getDateSQL('created_at', unit, timezone)}) as cohort_date,
session_id
from website_event
where website_id = {websiteId:UUID}
@@ -132,7 +129,7 @@ async function clickhouseQuery(
user_activities AS (
select distinct
w.session_id,
- (${getDateQuery('created_at', unit, timezone)} - c.cohort_date) / 86400 as day_number
+ (${getDateSQL('created_at', unit, timezone)} - c.cohort_date) / 86400 as day_number
from website_event w
join cohort_items c
on w.session_id = c.session_id
@@ -157,7 +154,7 @@ async function clickhouseQuery(
group by 1, 2
)
select
- ${getDateStringQuery('c.cohort_date', unit)} as date,
+ ${getDateStringSQL('c.cohort_date', unit)} as date,
c.day_number as day,
s.visitors as visitors,
c.visitors returnVisitors,
diff --git a/src/queries/analytics/reports/getRevenue.ts b/src/queries/analytics/reports/getRevenue.ts
index 6b151bb7..e4857a43 100644
--- a/src/queries/analytics/reports/getRevenue.ts
+++ b/src/queries/analytics/reports/getRevenue.ts
@@ -46,12 +46,12 @@ async function relationalQuery(
timezone = 'UTC',
unit = 'day',
} = criteria;
- const { getDateQuery, rawQuery } = prisma;
+ const { getDateSQL, rawQuery } = prisma;
const chartRes = await rawQuery(
`
select
- ${getDateQuery('website_event.created_at', unit, timezone)} time,
+ ${getDateSQL('website_event.created_at', unit, timezone)} time,
sum(case when data_key = {{revenueProperty}} then number_value else 0 end) sum,
avg(case when data_key = {{revenueProperty}} then number_value else 0 end) avg,
count(case when data_key = {{revenueProperty}} then 1 else 0 end) count,
@@ -110,7 +110,7 @@ async function clickhouseQuery(
timezone = 'UTC',
unit = 'day',
} = criteria;
- const { getDateStringQuery, getDateQuery, rawQuery } = clickhouse;
+ const { getDateStringSQL, getDateSQL, rawQuery } = clickhouse;
const chartRes = await rawQuery<{
time: string;
@@ -121,14 +121,14 @@ async function clickhouseQuery(
}>(
`
select
- ${getDateStringQuery('g.time', unit)} as time,
+ ${getDateStringSQL('g.time', unit)} as time,
g.sum as sum,
g.avg as avg,
g.count as count,
g.uniqueCount as uniqueCount
from (
select
- ${getDateQuery('created_at', unit, timezone)} as time,
+ ${getDateSQL('created_at', unit, timezone)} as time,
sumIf(number_value, data_key = {revenueProperty:String}) as sum,
avgIf(number_value, data_key = {revenueProperty:String}) as avg,
countIf(data_key = {revenueProperty:String}) as count,
diff --git a/src/queries/analytics/sessions/getSessionMetrics.ts b/src/queries/analytics/sessions/getSessionMetrics.ts
index e28f1fb2..93e36a55 100644
--- a/src/queries/analytics/sessions/getSessionMetrics.ts
+++ b/src/queries/analytics/sessions/getSessionMetrics.ts
@@ -1,3 +1,4 @@
+/* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */
import prisma from 'lib/prisma';
import clickhouse from 'lib/clickhouse';
import { runQuery, CLICKHOUSE, PRISMA } from 'lib/db';
@@ -5,7 +6,14 @@ import { EVENT_TYPE, FILTER_COLUMNS, SESSION_COLUMNS } from 'lib/constants';
import { QueryFilters } from 'lib/types';
export async function getSessionMetrics(
- ...args: [websiteId: string, type: string, filters: QueryFilters, limit?: number, offset?: number]
+ ...args: [
+ websiteId: string,
+ type: string,
+ filters: QueryFilters,
+ limit?: number,
+ offset?: number,
+ unit?: string,
+ ]
) {
return runQuery({
[PRISMA]: () => relationalQuery(...args),
@@ -19,6 +27,7 @@ async function relationalQuery(
filters: QueryFilters,
limit: number = 500,
offset: number = 0,
+ unit: string,
) {
const column = FILTER_COLUMNS[type] || type;
const { parseFilters, rawQuery } = prisma;
@@ -62,6 +71,7 @@ async function clickhouseQuery(
filters: QueryFilters,
limit: number = 500,
offset: number = 0,
+ unit: string,
): Promise<{ x: string; y: number }[]> {
const column = FILTER_COLUMNS[type] || type;
const { parseFilters, rawQuery } = clickhouse;
@@ -70,14 +80,15 @@ async function clickhouseQuery(
eventType: EVENT_TYPE.pageView,
});
const includeCountry = column === 'city' || column === 'subdivision1';
+ const table = unit === 'hour' ? 'website_event_stats_hourly' : 'website_event_stats_daily';
return rawQuery(
`
select
${column} x,
- count(distinct session_id) y
+ uniq(session_id) y
${includeCountry ? ', country' : ''}
- from website_event
+ from ${table} website_event
where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
and event_type = {eventType:UInt32}
diff --git a/src/queries/analytics/sessions/getSessionStats.ts b/src/queries/analytics/sessions/getSessionStats.ts
index e3af7ba6..2b57b922 100644
--- a/src/queries/analytics/sessions/getSessionStats.ts
+++ b/src/queries/analytics/sessions/getSessionStats.ts
@@ -13,7 +13,7 @@ export async function getSessionStats(...args: [websiteId: string, filters: Quer
async function relationalQuery(websiteId: string, filters: QueryFilters) {
const { timezone = 'utc', unit = 'day' } = filters;
- const { getDateQuery, parseFilters, rawQuery } = prisma;
+ const { getDateSQL, parseFilters, rawQuery } = prisma;
const { filterQuery, joinSession, params } = await parseFilters(websiteId, {
...filters,
eventType: EVENT_TYPE.pageView,
@@ -22,7 +22,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
return rawQuery(
`
select
- ${getDateQuery('website_event.created_at', unit, timezone)} x,
+ ${getDateSQL('website_event.created_at', unit, timezone)} x,
count(distinct website_event.session_id) y
from website_event
${joinSession}
@@ -41,22 +41,23 @@ async function clickhouseQuery(
filters: QueryFilters,
): Promise<{ x: string; y: number }[]> {
const { timezone = 'UTC', unit = 'day' } = filters;
- const { parseFilters, rawQuery, getDateStringQuery, getDateQuery } = clickhouse;
+ const { parseFilters, rawQuery, getDateStringSQL, getDateSQL } = clickhouse;
const { filterQuery, params } = await parseFilters(websiteId, {
...filters,
eventType: EVENT_TYPE.pageView,
});
+ const table = unit === 'hour' ? 'website_event_stats_hourly' : 'website_event_stats_daily';
return rawQuery(
`
select
- ${getDateStringQuery('g.t', unit)} as x,
+ ${getDateStringSQL('g.t', unit)} as x,
g.y as y
from (
select
- ${getDateQuery('created_at', unit, timezone)} as t,
- count(distinct session_id) as y
- from website_event
+ ${getDateSQL('created_at', unit, timezone)} as t,
+ uniq(session_id) as y
+ from ${table} website_event
where website_id = {websiteId:UUID}
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
and event_type = {eventType:UInt32}
diff --git a/src/queries/analytics/sessions/getSessions.ts b/src/queries/analytics/sessions/getSessions.ts
index a11edd39..538133ba 100644
--- a/src/queries/analytics/sessions/getSessions.ts
+++ b/src/queries/analytics/sessions/getSessions.ts
@@ -1,51 +1,38 @@
import prisma from 'lib/prisma';
import clickhouse from 'lib/clickhouse';
import { runQuery, PRISMA, CLICKHOUSE } from 'lib/db';
-import { QueryFilters } from 'lib/types';
+import { PageParams, QueryFilters } from 'lib/types';
-export async function getSessions(...args: [websiteId: string, filters: QueryFilters]) {
+export async function getSessions(
+ ...args: [websiteId: string, filters?: QueryFilters, pageParams?: PageParams]
+) {
return runQuery({
[PRISMA]: () => relationalQuery(...args),
[CLICKHOUSE]: () => clickhouseQuery(...args),
});
}
-async function relationalQuery(websiteId: string, filters: QueryFilters) {
- const { startDate } = filters;
+async function relationalQuery(websiteId: string, filters: QueryFilters, pageParams: PageParams) {
+ const { pagedQuery } = prisma;
- return prisma.client.session
- .findMany({
- where: {
- websiteId,
- createdAt: {
- gte: startDate,
- },
- },
- orderBy: {
- createdAt: 'desc',
- },
- })
- .then(a => {
- return Object.values(a).map(a => {
- return {
- ...a,
- timestamp: new Date(a.createdAt).getTime() / 1000,
- };
- });
- });
+ const where = {
+ ...filters,
+ id: websiteId,
+ };
+
+ return pagedQuery('session', { where }, pageParams);
}
-async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
- const { rawQuery } = clickhouse;
- const { startDate } = filters;
+async function clickhouseQuery(websiteId: string, filters: QueryFilters, pageParams?: PageParams) {
+ const { pagedQuery, parseFilters, getDateStringSQL } = clickhouse;
+ const { params, dateQuery, filterQuery } = await parseFilters(websiteId, filters);
- return rawQuery(
+ return pagedQuery(
`
select
session_id as id,
website_id as websiteId,
- created_at as createdAt,
- toUnixTimestamp(created_at) as timestamp,
+ ${getDateStringSQL('created_at', 'second', filters.timezone)} as createdAt,
hostname,
browser,
os,
@@ -58,12 +45,11 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters) {
city
from website_event
where website_id = {websiteId:UUID}
- and created_at >= {startDate:DateTime64}
+ ${dateQuery}
+ ${filterQuery}
order by created_at desc
`,
- {
- websiteId,
- startDate,
- },
+ params,
+ pageParams,
);
}
diff --git a/src/queries/analytics/sessions/saveSessionData.ts b/src/queries/analytics/sessions/saveSessionData.ts
index 429c6e28..1f5c1494 100644
--- a/src/queries/analytics/sessions/saveSessionData.ts
+++ b/src/queries/analytics/sessions/saveSessionData.ts
@@ -5,6 +5,7 @@ import prisma from 'lib/prisma';
import { DynamicData } from 'lib/types';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
import kafka from 'lib/kafka';
+import clickhouse from 'lib/clickhouse';
export async function saveSessionData(data: {
websiteId: string;
@@ -81,6 +82,7 @@ async function clickhouseQuery(data: {
}) {
const { websiteId, sessionId, sessionData, createdAt } = data;
+ const { insert } = clickhouse;
const { getDateFormat, sendMessages } = kafka;
const jsonKeys = flattenJSON(sessionData);
@@ -98,7 +100,11 @@ async function clickhouseQuery(data: {
};
});
- await sendMessages(messages, 'session_data');
+ if (kafka.enabled) {
+ await sendMessages('session_data', messages);
+ } else {
+ await insert('session_data', messages);
+ }
return data;
}
diff --git a/src/queries/index.ts b/src/queries/index.ts
index 8cef080a..796adea6 100644
--- a/src/queries/index.ts
+++ b/src/queries/index.ts
@@ -1,8 +1,8 @@
-export * from './admin/report';
-export * from './admin/team';
-export * from './admin/teamUser';
-export * from './admin/user';
-export * from './admin/website';
+export * from 'queries/prisma/report';
+export * from 'queries/prisma/team';
+export * from 'queries/prisma/teamUser';
+export * from 'queries/prisma/user';
+export * from 'queries/prisma/website';
export * from './analytics/events/getEventMetrics';
export * from './analytics/events/getEventUsage';
export * from './analytics/events/getEvents';
diff --git a/src/queries/admin/report.ts b/src/queries/prisma/report.ts
similarity index 93%
rename from src/queries/admin/report.ts
rename to src/queries/prisma/report.ts
index dc05a1d5..a0e6364c 100644
--- a/src/queries/admin/report.ts
+++ b/src/queries/prisma/report.ts
@@ -17,9 +17,9 @@ export async function getReport(reportId: string): Promise {
export async function getReports(
criteria: ReportFindManyArgs,
- filters: PageParams = {},
+ pageParams: PageParams = {},
): Promise> {
- const { query } = filters;
+ const { query } = pageParams;
const where: Prisma.ReportWhereInput = {
...criteria.where,
@@ -45,7 +45,7 @@ export async function getReports(
]),
};
- return prisma.pagedQuery('report', { ...criteria, where }, filters);
+ return prisma.pagedQuery('report', { ...criteria, where }, pageParams);
}
export async function getUserReports(
diff --git a/src/queries/admin/team.ts b/src/queries/prisma/team.ts
similarity index 100%
rename from src/queries/admin/team.ts
rename to src/queries/prisma/team.ts
diff --git a/src/queries/admin/teamUser.ts b/src/queries/prisma/teamUser.ts
similarity index 100%
rename from src/queries/admin/teamUser.ts
rename to src/queries/prisma/teamUser.ts
diff --git a/src/queries/admin/user.ts b/src/queries/prisma/user.ts
similarity index 98%
rename from src/queries/admin/user.ts
rename to src/queries/prisma/user.ts
index 9e085112..9b471787 100644
--- a/src/queries/admin/user.ts
+++ b/src/queries/prisma/user.ts
@@ -49,9 +49,9 @@ export async function getUserByUsername(username: string, options: GetUserOption
export async function getUsers(
criteria: UserFindManyArgs,
- filters?: PageParams,
+ pageParams?: PageParams,
): Promise> {
- const { query } = filters;
+ const { query } = pageParams;
const where: Prisma.UserWhereInput = {
...criteria.where,
@@ -68,7 +68,7 @@ export async function getUsers(
{
orderBy: 'createdAt',
sortDescending: true,
- ...filters,
+ ...pageParams,
},
);
}
diff --git a/src/queries/admin/website.ts b/src/queries/prisma/website.ts
similarity index 97%
rename from src/queries/admin/website.ts
rename to src/queries/prisma/website.ts
index eb07f779..0814a137 100644
--- a/src/queries/admin/website.ts
+++ b/src/queries/prisma/website.ts
@@ -27,9 +27,9 @@ export async function getSharedWebsite(shareId: string) {
export async function getWebsites(
criteria: WebsiteFindManyArgs,
- filters: PageParams,
+ pageParams: PageParams,
): Promise> {
- const { query } = filters;
+ const { query } = pageParams;
const where: Prisma.WebsiteWhereInput = {
...criteria.where,
@@ -42,7 +42,7 @@ export async function getWebsites(
deletedAt: null,
};
- return prisma.pagedQuery('website', { ...criteria, where }, filters);
+ return prisma.pagedQuery('website', { ...criteria, where }, pageParams);
}
export async function getAllWebsites(userId: string) {
diff --git a/yarn.lock b/yarn.lock
index 9b29fa74..1fe40135 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1126,13 +1126,6 @@
dependencies:
regenerator-runtime "^0.14.0"
-"@babel/runtime@^7.23.2":
- version "7.24.5"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c"
- integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==
- dependencies:
- regenerator-runtime "^0.14.0"
-
"@babel/template@^7.22.15", "@babel/template@^7.22.5":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
@@ -1206,17 +1199,17 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
-"@clickhouse/client-common@1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@clickhouse/client-common/-/client-common-1.0.2.tgz#0fe0a4b33101c08d85c1279e4d74b2a92d42d996"
- integrity sha512-5oI2URFsXlzoysv5lAxoTUAnAHjXnaJ+1Jz3HUARR06Hkbr1sN0pGxfGwgjEd8E/lI4+UNdNEZicG2rlFnWSaA==
+"@clickhouse/client-common@1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@clickhouse/client-common/-/client-common-1.3.0.tgz#9fe4b88eedb233770832cb1c0794f4ad9fbec75c"
+ integrity sha512-fApbhu52WSQlBU0gMZQxd2akuWbI1c9BcWjIbDDgtNZX2OggrIB7a4oI845ZGXpeZCZDI9ZqtkXzbYQYS0Yqew==
-"@clickhouse/client@^1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@clickhouse/client/-/client-1.0.2.tgz#7d9675e697ce697f1e6777f4c66ca6d3384e7325"
- integrity sha512-PaK0GLjIrlCpXevrp9gliOrurna6MjMMFBgZhDh6Zup8IuJCjQru4LkNsWUl3hJ2nua6+Ygag14iB8ILbeaIjg==
+"@clickhouse/client@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@clickhouse/client/-/client-1.3.0.tgz#298529b970a9ba2ae5e017258aaf6cf522cb2b51"
+ integrity sha512-baBiuwVpXg/DHCe9Y1pNf+tcE2ZalCAQqZsR9OhP7+01C3UqTjHeY4eYixNlpfZCb8c8R4GygdWJFbXF0aGklw==
dependencies:
- "@clickhouse/client-common" "1.0.2"
+ "@clickhouse/client-common" "1.3.0"
"@colors/colors@1.5.0":
version "1.5.0"
@@ -1565,14 +1558,6 @@
"@formatjs/intl-localematcher" "0.2.25"
tslib "^2.1.0"
-"@formatjs/ecma402-abstract@1.18.2":
- version "1.18.2"
- resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz#bf103712a406874eb1e387858d5be2371ab3aa14"
- integrity sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==
- dependencies:
- "@formatjs/intl-localematcher" "0.5.4"
- tslib "^2.4.0"
-
"@formatjs/ecma402-abstract@1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.4.0.tgz#ac6c17a8fffac43c6d68c849a7b732626d32654c"
@@ -1587,6 +1572,14 @@
dependencies:
tslib "^2.0.1"
+"@formatjs/ecma402-abstract@2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz#39197ab90b1c78b7342b129a56a7acdb8f512e17"
+ integrity sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==
+ dependencies:
+ "@formatjs/intl-localematcher" "0.5.4"
+ tslib "^2.4.0"
+
"@formatjs/fast-memoize@2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b"
@@ -1603,13 +1596,13 @@
"@formatjs/icu-skeleton-parser" "1.3.6"
tslib "^2.1.0"
-"@formatjs/icu-messageformat-parser@2.7.6":
- version "2.7.6"
- resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz#3d69806de056d2919d53dad895a5ff4851e4e9ff"
- integrity sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==
+"@formatjs/icu-messageformat-parser@2.7.8":
+ version "2.7.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz#f6d7643001e9bb5930d812f1f9a9856f30fa0343"
+ integrity sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==
dependencies:
- "@formatjs/ecma402-abstract" "1.18.2"
- "@formatjs/icu-skeleton-parser" "1.8.0"
+ "@formatjs/ecma402-abstract" "2.0.0"
+ "@formatjs/icu-skeleton-parser" "1.8.2"
tslib "^2.4.0"
"@formatjs/icu-skeleton-parser@1.3.6":
@@ -1620,29 +1613,29 @@
"@formatjs/ecma402-abstract" "1.11.4"
tslib "^2.1.0"
-"@formatjs/icu-skeleton-parser@1.8.0":
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz#5f3d3a620c687d6f8c180d80d1241e8f213acf79"
- integrity sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==
+"@formatjs/icu-skeleton-parser@1.8.2":
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz#2252c949ae84ee66930e726130ea66731a123c9f"
+ integrity sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==
dependencies:
- "@formatjs/ecma402-abstract" "1.18.2"
+ "@formatjs/ecma402-abstract" "2.0.0"
tslib "^2.4.0"
-"@formatjs/intl-displaynames@6.6.6":
- version "6.6.6"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.6.6.tgz#be9fea4d24f577bb1a9d0f3ef4f2dcdabb4fe42d"
- integrity sha512-Dg5URSjx0uzF8VZXtHb6KYZ6LFEEhCbAbKoYChYHEOnMFTw/ZU3jIo/NrujzQD2EfKPgQzIq73LOUvW6Z/LpFA==
+"@formatjs/intl-displaynames@6.6.8":
+ version "6.6.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.6.8.tgz#2f5afac8df83167f5a6ef8543600eaf1ef99c885"
+ integrity sha512-Lgx6n5KxN16B3Pb05z3NLEBQkGoXnGjkTBNCZI+Cn17YjHJ3fhCeEJJUqRlIZmJdmaXQhjcQVDp6WIiNeRYT5g==
dependencies:
- "@formatjs/ecma402-abstract" "1.18.2"
+ "@formatjs/ecma402-abstract" "2.0.0"
"@formatjs/intl-localematcher" "0.5.4"
tslib "^2.4.0"
-"@formatjs/intl-listformat@7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.5.5.tgz#e4c7d741f2201c65e7da71326726e61332c7161e"
- integrity sha512-XoI52qrU6aBGJC9KJddqnacuBbPlb/bXFN+lIFVFhQ1RnFHpzuFrlFdjD9am2O7ZSYsyqzYRpkVcXeT1GHkwDQ==
+"@formatjs/intl-listformat@7.5.7":
+ version "7.5.7"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.5.7.tgz#125e05105fabd1ae5f11881d6ab74484f2098ee4"
+ integrity sha512-MG2TSChQJQT9f7Rlv+eXwUFiG24mKSzmF144PLb8m8OixyXqn4+YWU+5wZracZGCgVTVmx8viCf7IH3QXoiB2g==
dependencies:
- "@formatjs/ecma402-abstract" "1.18.2"
+ "@formatjs/ecma402-abstract" "2.0.0"
"@formatjs/intl-localematcher" "0.5.4"
tslib "^2.4.0"
@@ -1668,17 +1661,17 @@
"@formatjs/ecma402-abstract" "1.4.0"
tslib "^2.0.1"
-"@formatjs/intl@2.10.2":
- version "2.10.2"
- resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.10.2.tgz#c074439ac2dbde4c2b3768b8108dfc3932b7fb30"
- integrity sha512-raPGWr3JRv3neXV78SqPFrGC05fIbhhNzVghHNxFde27ls2KkXiMhtP7HBybjGpikVSjjhdhaZto+4p1vmm9bQ==
+"@formatjs/intl@2.10.4":
+ version "2.10.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.10.4.tgz#e1819e0858fb05ca65923a020f346bc74e894e92"
+ integrity sha512-56483O+HVcL0c7VucAS2tyH020mt9XTozZO67cwtGg0a7KWDukS/FzW3OnvaHmTHDuYsoPIzO+ZHVfU6fT/bJw==
dependencies:
- "@formatjs/ecma402-abstract" "1.18.2"
+ "@formatjs/ecma402-abstract" "2.0.0"
"@formatjs/fast-memoize" "2.2.0"
- "@formatjs/icu-messageformat-parser" "2.7.6"
- "@formatjs/intl-displaynames" "6.6.6"
- "@formatjs/intl-listformat" "7.5.5"
- intl-messageformat "10.5.12"
+ "@formatjs/icu-messageformat-parser" "2.7.8"
+ "@formatjs/intl-displaynames" "6.6.8"
+ "@formatjs/intl-listformat" "7.5.7"
+ intl-messageformat "10.5.14"
tslib "^2.4.0"
"@formatjs/ts-transformer@3.9.4":
@@ -2002,66 +1995,66 @@
integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==
"@netlify/plugin-nextjs@^5.1.0":
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-5.2.2.tgz#3c283d335001f9e0fbcb4db75557e5fe1660db72"
- integrity sha512-jV/P7o8+v1XaEGb7wvFfkF1fSLggAxjg7WYoBPkD3R93bsI6xmCDKBcUJ/6g7lqECRXt4dGKApSFtGk/pUmAHw==
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/@netlify/plugin-nextjs/-/plugin-nextjs-5.3.3.tgz#414cb0f4c21e6b80d6127b824efb00ae2f732a89"
+ integrity sha512-QhvZLOHhPuTnh6TZ5G0/jtjAJ1Y52A67b39eygKv6znQUPti8p+8y2WulcntpCRzVp2stzEULMNPlnptna1ikg==
-"@next/env@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0"
- integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==
+"@next/env@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.4.tgz#5546813dc4f809884a37d257b254a5ce1b0248d7"
+ integrity sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==
-"@next/eslint-plugin-next@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz#287ad8620e7061ba01e8d3313d464db6d217b6df"
- integrity sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==
+"@next/eslint-plugin-next@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz#c7f965cb76f0b454e726ef0f69157c4fb4e28f53"
+ integrity sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==
dependencies:
glob "10.3.10"
-"@next/swc-darwin-arm64@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb"
- integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==
+"@next/swc-darwin-arm64@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz#da9f04c34a3d5f0b8401ed745768420e4a604036"
+ integrity sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==
-"@next/swc-darwin-x64@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c"
- integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==
+"@next/swc-darwin-x64@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz#46dedb29ec5503bf171a72a3ecb8aac6e738e9d6"
+ integrity sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==
-"@next/swc-linux-arm64-gnu@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf"
- integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==
+"@next/swc-linux-arm64-gnu@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz#c9697ab9eb422bd1d7ffd0eb0779cc2aefa9d4a1"
+ integrity sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==
-"@next/swc-linux-arm64-musl@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990"
- integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==
+"@next/swc-linux-arm64-musl@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz#cbbceb2008571c743b5a310a488d2e166d200a75"
+ integrity sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==
-"@next/swc-linux-x64-gnu@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593"
- integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==
+"@next/swc-linux-x64-gnu@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz#d79184223f857bacffb92f643cb2943a43632568"
+ integrity sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==
-"@next/swc-linux-x64-musl@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d"
- integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==
+"@next/swc-linux-x64-musl@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz#6b6c3e5ac02ca5e63394d280ec8ee607491902df"
+ integrity sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==
-"@next/swc-win32-arm64-msvc@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a"
- integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==
+"@next/swc-win32-arm64-msvc@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz#dbad3906e870dba84c5883d9d4c4838472e0697f"
+ integrity sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==
-"@next/swc-win32-ia32-msvc@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457"
- integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==
+"@next/swc-win32-ia32-msvc@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz#6074529b91ba49132922ce89a2e16d25d2ec235d"
+ integrity sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==
-"@next/swc-win32-x64-msvc@14.2.3":
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c"
- integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==
+"@next/swc-win32-x64-msvc@14.2.4":
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz#e65a1c6539a671f97bb86d5183d6e3a1733c29c7"
+ integrity sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -2089,51 +2082,51 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
-"@prisma/client@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.14.0.tgz#dadca5bb1137ddcebb454bbdaf89423823d3363f"
- integrity sha512-akMSuyvLKeoU4LeyBAUdThP/uhVP3GuLygFE3MlYzaCb3/J8SfsYBE5PkaFuLuVpLyA6sFoW+16z/aPhNAESqg==
+"@prisma/client@5.16.2":
+ version "5.16.2"
+ resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.16.2.tgz#21df4c092eac29dcc4431ebed8c92579ffc9d8bd"
+ integrity sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==
-"@prisma/debug@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.14.0.tgz#1227c705893c38284f7c63d72441480ebaa12605"
- integrity sha512-iq56qBZuFfX3fCxoxT8gBX33lQzomBU0qIUaEj1RebsKVz1ob/BVH1XSBwwwvRVtZEV1b7Fxx2eVu34Ge/mg3w==
+"@prisma/debug@5.16.2":
+ version "5.16.2"
+ resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.16.2.tgz#bf774f4768a3d1634887e6964fcfe04576dc7496"
+ integrity sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==
-"@prisma/engines-version@5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48":
- version "5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48"
- resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48.tgz#019c3c75a5c3276e580685fe48cdbfd181176858"
- integrity sha512-ip6pNkRo1UxWv+6toxNcYvItNYaqQjXdFNGJ+Nuk2eYtRoEdoF13wxo7/jsClJFFenMPVNVqXQDV0oveXnR1cA==
+"@prisma/engines-version@5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303":
+ version "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303"
+ resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz#63ceebefb7daa1eb17f250cad75d35999a50ee1b"
+ integrity sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==
-"@prisma/engines@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.14.0.tgz#2ee91dd2220a726c27c906fbea788bbb3efdac6e"
- integrity sha512-lgxkKZ6IEygVcw6IZZUlPIfLQ9hjSYAtHjZ5r64sCLDgVzsPFCi2XBBJgzPMkOQ5RHzUD4E/dVdpn9+ez8tk1A==
+"@prisma/engines@5.16.2":
+ version "5.16.2"
+ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.16.2.tgz#d624c816c25a5cbad7ca13c7842b71557b6020e0"
+ integrity sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==
dependencies:
- "@prisma/debug" "5.14.0"
- "@prisma/engines-version" "5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48"
- "@prisma/fetch-engine" "5.14.0"
- "@prisma/get-platform" "5.14.0"
+ "@prisma/debug" "5.16.2"
+ "@prisma/engines-version" "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303"
+ "@prisma/fetch-engine" "5.16.2"
+ "@prisma/get-platform" "5.16.2"
"@prisma/extension-read-replicas@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@prisma/extension-read-replicas/-/extension-read-replicas-0.3.0.tgz#2842a7c928f957c1dd58a6256104797596d43426"
integrity sha512-F9+rSmYday6GT2qjhJtkZcBOpLO5LtpvFcMGqrBDHf+78LEdSuxfFjOxYlNuqk4B+th62yxpbhfpmB9/Mca14Q==
-"@prisma/fetch-engine@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.14.0.tgz#45297c118d4ec3fea55129886edd5a429da1f6da"
- integrity sha512-VrheA9y9DMURK5vu8OJoOgQpxOhas3qF0IBHJ8G/0X44k82kc8E0w98HCn2nhnbOOMwbWsJWXfLC2/F8n5u0gQ==
+"@prisma/fetch-engine@5.16.2":
+ version "5.16.2"
+ resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz#e7e06cf246340e6ae06791f9133be275c5ee50e5"
+ integrity sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==
dependencies:
- "@prisma/debug" "5.14.0"
- "@prisma/engines-version" "5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48"
- "@prisma/get-platform" "5.14.0"
+ "@prisma/debug" "5.16.2"
+ "@prisma/engines-version" "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303"
+ "@prisma/get-platform" "5.16.2"
-"@prisma/get-platform@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.14.0.tgz#69112d3dde61905f59a65ed818f153e153ca40f0"
- integrity sha512-/yAyBvcEjRv41ynZrhdrPtHgk47xLRRq/o5eWGcUpBJ1YrUZTYB8EoPiopnP7iQrMATK8stXQdPOoVlrzuTQZw==
+"@prisma/get-platform@5.16.2":
+ version "5.16.2"
+ resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.16.2.tgz#f9b397ddf807b71411fd9d0b17374bc21e91cc40"
+ integrity sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==
dependencies:
- "@prisma/debug" "5.14.0"
+ "@prisma/debug" "5.16.2"
"@react-spring/animated@~9.7.3":
version "9.7.3"
@@ -2216,9 +2209,9 @@
slash "^4.0.0"
"@rollup/plugin-commonjs@^25.0.4":
- version "25.0.7"
- resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz#145cec7589ad952171aeb6a585bbeabd0fd3b4cf"
- integrity sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==
+ version "25.0.8"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz#c77e608ab112a666b7f2a6bea625c73224f7dd34"
+ integrity sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==
dependencies:
"@rollup/pluginutils" "^5.0.1"
commondir "^1.0.1"
@@ -2247,9 +2240,9 @@
resolve "^1.22.1"
"@rollup/plugin-replace@^5.0.2":
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz#33d5653dce6d03cb24ef98bef7f6d25b57faefdf"
- integrity sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==
+ version "5.0.7"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz#150c9ee9db8031d9e4580a61a0edeaaed3d37687"
+ integrity sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==
dependencies:
"@rollup/pluginutils" "^5.0.1"
magic-string "^0.30.3"
@@ -2273,9 +2266,9 @@
picomatch "^2.3.1"
"@rushstack/eslint-patch@^1.3.3":
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda"
- integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20"
+ integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==
"@sinclair/typebox@^0.27.8":
version "0.27.8"
@@ -2430,17 +2423,17 @@
"@swc/counter" "^0.1.3"
tslib "^2.4.0"
-"@tanstack/query-core@5.35.5":
- version "5.35.5"
- resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.35.5.tgz#7b4100dc9cc7fee314b8a1bcbf502a236d43ffe3"
- integrity sha512-OMWvlEqG01RfGj+XZb/piDzPp0eZkkHWSDHt2LvE/fd1zWburP/xwm0ghk6Iv8cuPlP+ACFkZviKXK0OVt6lhg==
+"@tanstack/query-core@5.48.0":
+ version "5.48.0"
+ resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.48.0.tgz#a3308ec925d8c16d64c789899d6c084c2fe30cbc"
+ integrity sha512-lZAfPPeVIqXCswE9SSbG33B6/91XOWt/Iq41bFeWb/mnHwQSIfFRbkS4bfs+WhIk9abRArF9Id2fp0Mgo+hq6Q==
"@tanstack/react-query@^5.28.6":
- version "5.35.5"
- resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.35.5.tgz#d41a087d58f42418824fa04aaca00ba93c99075c"
- integrity sha512-sppX7L+PVn5GBV3In6zzj0zcKfnZRKhXbX1MfIfKo1OjIq2GMaopvAFOP0x1bRYTUk2ikrdYcQYOozX7PWkb8A==
+ version "5.48.0"
+ resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.48.0.tgz#7890620272b48aeb278498dfe082f27518f3ac6d"
+ integrity sha512-GDExbjYWzvDokyRqMSWXdrPiYpp95Aig0oeMIrxTaruOJJgWiWfUP//OAaowm2RrRkGVsavSZdko/XmIrrV2Nw==
dependencies:
- "@tanstack/query-core" "5.35.5"
+ "@tanstack/query-core" "5.48.0"
"@trysound/sax@0.2.0":
version "0.2.0"
@@ -2525,21 +2518,16 @@
dependencies:
cypress "*"
-"@types/estree@*":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd"
- integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==
+"@types/estree@*", "@types/estree@^1.0.0":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
+ integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
"@types/estree@^0.0.50":
version "0.0.50"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
-"@types/estree@^1.0.0":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
- integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
-
"@types/fs-extra@^8.0.1":
version "8.1.4"
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.4.tgz#8171df1d16a80d69fc9c3aab07d7961349a5cb8b"
@@ -2653,9 +2641,9 @@
integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
"@types/node@*", "@types/node@^20.9.0":
- version "20.12.11"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be"
- integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==
+ version "20.14.9"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420"
+ integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==
dependencies:
undici-types "~5.26.4"
@@ -2704,9 +2692,9 @@
"@types/react" "*"
"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@^18.2.41":
- version "18.3.1"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.1.tgz#fed43985caa834a2084d002e4771e15dfcbdbe8e"
- integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==
+ version "18.3.3"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f"
+ integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==
dependencies:
"@types/prop-types" "*"
csstype "^3.0.2"
@@ -3209,14 +3197,14 @@ argparse@^2.0.1:
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-aria-query@^5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
- integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
+aria-query@~5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e"
+ integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==
dependencies:
- dequal "^2.0.3"
+ deep-equal "^2.0.5"
-array-buffer-byte-length@^1.0.1:
+array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
@@ -3229,7 +3217,7 @@ array-find-index@^1.0.1:
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==
-array-includes@^3.1.6, array-includes@^3.1.7:
+array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8:
version "3.1.8"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
@@ -3246,7 +3234,7 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-array.prototype.findlast@^1.2.4:
+array.prototype.findlast@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904"
integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==
@@ -3300,15 +3288,15 @@ array.prototype.toreversed@^1.1.2:
es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
-array.prototype.tosorted@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8"
- integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==
+array.prototype.tosorted@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc"
+ integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==
dependencies:
- call-bind "^1.0.5"
+ call-bind "^1.0.7"
define-properties "^1.2.1"
- es-abstract "^1.22.3"
- es-errors "^1.1.0"
+ es-abstract "^1.23.3"
+ es-errors "^1.3.0"
es-shim-unscopables "^1.0.2"
arraybuffer.prototype.slice@^1.0.3:
@@ -3392,21 +3380,21 @@ aws-sign2@~0.7.0:
integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
aws4@^1.8.0:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3"
- integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc"
+ integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==
-axe-core@=4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf"
- integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==
+axe-core@^4.9.1:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae"
+ integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==
-axobject-query@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a"
- integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==
+axobject-query@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1"
+ integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==
dependencies:
- dequal "^2.0.3"
+ deep-equal "^2.0.5"
babel-jest@^29.7.0:
version "29.7.0"
@@ -3565,7 +3553,7 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
-braces@^3.0.2:
+braces@^3.0.2, braces@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -3754,9 +3742,9 @@ charenc@0.0.2:
integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
chart.js@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.4.2.tgz#95962fa6430828ed325a480cc2d5f2b4e385ac31"
- integrity sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==
+ version "4.4.3"
+ resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.4.3.tgz#3b2e11e7010fefa99b07d0349236f5098e5226ad"
+ integrity sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==
dependencies:
"@kurkle/color" "^0.3.0"
@@ -3810,9 +3798,9 @@ cli-cursor@^4.0.0:
restore-cursor "^4.0.0"
cli-table3@~0.6.1:
- version "0.6.4"
- resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.4.tgz#d1c536b8a3f2e7bec58f67ac9e5769b1b30088b0"
- integrity sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f"
+ integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==
dependencies:
string-width "^4.2.0"
optionalDependencies:
@@ -4267,9 +4255,9 @@ cypress@*:
yauzl "^2.10.0"
cypress@^13.6.6:
- version "13.9.0"
- resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.9.0.tgz#b529cfa8f8c39ba163ed0501a25bb5b09c143652"
- integrity sha512-atNjmYfHsvTuCaxTxLZr9xGoHz53LLui3266WWxXJHY7+N6OdwJdg/feEa3T+buez9dmUXHT1izCOklqG82uCQ==
+ version "13.12.0"
+ resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.12.0.tgz#1a4ea89b7fa6855e32bc02eaf5e25fc45b9e273f"
+ integrity sha512-udzS2JilmI9ApO/UuqurEwOvThclin5ntz7K0BtnHBs+tg2Bl9QShLISXpSEMDv/u8b6mqdoAdyKeZiSqKWL8g==
dependencies:
"@cypress/request" "^3.0.0"
"@cypress/xvfb" "^1.2.4"
@@ -4461,7 +4449,7 @@ debounce@^1.2.1:
resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5"
integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
-debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
+debug@4.3.4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -4475,6 +4463,13 @@ debug@^3.1.0, debug@^3.2.7:
dependencies:
ms "^2.1.1"
+debug@^4.1.1, debug@^4.3.4:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
+ integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==
+ dependencies:
+ ms "2.1.2"
+
decamelize-keys@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8"
@@ -4498,6 +4493,30 @@ dedent@^1.0.0:
resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff"
integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==
+deep-equal@^2.0.5:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1"
+ integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ call-bind "^1.0.5"
+ es-get-iterator "^1.1.3"
+ get-intrinsic "^1.2.2"
+ is-arguments "^1.1.1"
+ is-array-buffer "^3.0.2"
+ is-date-object "^1.0.5"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ isarray "^2.0.5"
+ object-is "^1.1.5"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.5.1"
+ side-channel "^1.0.4"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.1"
+ which-typed-array "^1.1.13"
+
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -4517,7 +4536,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4:
es-errors "^1.3.0"
gopd "^1.0.1"
-define-properties@^1.2.0, define-properties@^1.2.1:
+define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
@@ -4559,11 +4578,6 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
-dequal@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
- integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
-
detect-browser@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca"
@@ -4731,9 +4745,9 @@ end-of-stream@^1.1.0:
once "^1.4.0"
enhanced-resolve@^5.12.0:
- version "5.16.1"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567"
- integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==
+ version "5.17.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5"
+ integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@@ -4763,7 +4777,7 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
-es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3:
+es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3:
version "1.23.3"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
@@ -4822,12 +4836,27 @@ es-define-property@^1.0.0:
dependencies:
get-intrinsic "^1.2.4"
-es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0:
+es-errors@^1.2.1, es-errors@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
-es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17:
+es-get-iterator@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
+ integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ is-arguments "^1.1.1"
+ is-map "^2.0.2"
+ is-set "^2.0.2"
+ is-string "^1.0.7"
+ isarray "^2.0.5"
+ stop-iteration-iterator "^1.0.0"
+
+es-iterator-helpers@^1.0.19:
version "1.0.19"
resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8"
integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==
@@ -4933,11 +4962,11 @@ escape-string-regexp@^4.0.0:
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-config-next@^14.0.4:
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.3.tgz#2fb0f7c4eccda530a4b5054438162b2303786d4f"
- integrity sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg==
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.4.tgz#eb0bedfe4a894bc2aea918214bb5243ee4fa7d4b"
+ integrity sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==
dependencies:
- "@next/eslint-plugin-next" "14.2.3"
+ "@next/eslint-plugin-next" "14.2.4"
"@rushstack/eslint-patch" "^1.3.3"
"@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0"
eslint-import-resolver-node "^0.3.6"
@@ -5032,26 +5061,26 @@ eslint-plugin-jest@^27.9.0:
"@typescript-eslint/utils" "^5.10.0"
eslint-plugin-jsx-a11y@^6.7.1:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2"
- integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==
+ version "6.9.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8"
+ integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==
dependencies:
- "@babel/runtime" "^7.23.2"
- aria-query "^5.3.0"
- array-includes "^3.1.7"
+ aria-query "~5.1.3"
+ array-includes "^3.1.8"
array.prototype.flatmap "^1.3.2"
ast-types-flow "^0.0.8"
- axe-core "=4.7.0"
- axobject-query "^3.2.1"
+ axe-core "^4.9.1"
+ axobject-query "~3.1.1"
damerau-levenshtein "^1.0.8"
emoji-regex "^9.2.2"
- es-iterator-helpers "^1.0.15"
- hasown "^2.0.0"
+ es-iterator-helpers "^1.0.19"
+ hasown "^2.0.2"
jsx-ast-utils "^3.3.5"
language-tags "^1.0.9"
minimatch "^3.1.2"
- object.entries "^1.1.7"
- object.fromentries "^2.0.7"
+ object.fromentries "^2.0.8"
+ safe-regex-test "^1.0.3"
+ string.prototype.includes "^2.0.0"
eslint-plugin-prettier@^4.0.0:
version "4.2.1"
@@ -5061,9 +5090,9 @@ eslint-plugin-prettier@^4.0.0:
prettier-linter-helpers "^1.0.0"
eslint-plugin-promise@^6.1.1:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816"
- integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.2.0.tgz#e24ab0e3c0a25fa227d98d9ff612156b5af15945"
+ integrity sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==
"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705":
version "4.6.2"
@@ -5071,28 +5100,28 @@ eslint-plugin-promise@^6.1.1:
integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==
eslint-plugin-react@^7.33.2:
- version "7.34.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997"
- integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==
+ version "7.34.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b"
+ integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==
dependencies:
- array-includes "^3.1.7"
- array.prototype.findlast "^1.2.4"
+ array-includes "^3.1.8"
+ array.prototype.findlast "^1.2.5"
array.prototype.flatmap "^1.3.2"
array.prototype.toreversed "^1.1.2"
- array.prototype.tosorted "^1.1.3"
+ array.prototype.tosorted "^1.1.4"
doctrine "^2.1.0"
- es-iterator-helpers "^1.0.17"
+ es-iterator-helpers "^1.0.19"
estraverse "^5.3.0"
jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.1.2"
- object.entries "^1.1.7"
- object.fromentries "^2.0.7"
- object.hasown "^1.1.3"
- object.values "^1.1.7"
+ object.entries "^1.1.8"
+ object.fromentries "^2.0.8"
+ object.hasown "^1.1.4"
+ object.values "^1.2.0"
prop-types "^15.8.1"
resolve "^2.0.0-next.5"
semver "^6.3.1"
- string.prototype.matchall "^4.0.10"
+ string.prototype.matchall "^4.0.11"
eslint-scope@^5.1.1:
version "5.1.1"
@@ -5489,9 +5518,9 @@ for-each@^0.3.3:
is-callable "^1.1.3"
foreground-child@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d"
- integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7"
+ integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==
dependencies:
cross-spawn "^7.0.0"
signal-exit "^4.0.1"
@@ -5609,7 +5638,7 @@ get-caller-file@^2.0.5:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
@@ -6039,7 +6068,7 @@ ini@^1.3.5:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-internal-slot@^1.0.7:
+internal-slot@^1.0.4, internal-slot@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
@@ -6068,14 +6097,14 @@ intl-messageformat-parser@^5.3.7:
dependencies:
"@formatjs/intl-numberformat" "^5.5.2"
-intl-messageformat@10.5.12:
- version "10.5.12"
- resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.12.tgz#a0c1a20da896b7a1f4ba1b59c8ba5d9943c29c3f"
- integrity sha512-izl0uxhy/melhw8gP2r8pGiVieviZmM4v5Oqx3c1/R7g9cwER2smmGfSjcIsp8Y3Q53bfciL/gkxacJRx/dUvg==
+intl-messageformat@10.5.14:
+ version "10.5.14"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.14.tgz#e5bb373f8a37b88fbe647d7b941f3ab2a37ed00a"
+ integrity sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==
dependencies:
- "@formatjs/ecma402-abstract" "1.18.2"
+ "@formatjs/ecma402-abstract" "2.0.0"
"@formatjs/fast-memoize" "2.2.0"
- "@formatjs/icu-messageformat-parser" "2.7.6"
+ "@formatjs/icu-messageformat-parser" "2.7.8"
tslib "^2.4.0"
ipaddr.js@^2.0.1:
@@ -6083,7 +6112,15 @@ ipaddr.js@^2.0.1:
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8"
integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
-is-array-buffer@^3.0.4:
+is-arguments@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-array-buffer@^3.0.2, is-array-buffer@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
@@ -6142,7 +6179,14 @@ is-ci@^3.0.1:
dependencies:
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.5.0:
+is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1:
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1"
+ integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==
+ dependencies:
+ hasown "^2.0.2"
+
+is-core-module@^2.5.0:
version "2.13.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
@@ -6222,7 +6266,7 @@ is-localhost-ip@^1.4.0:
resolved "https://registry.yarnpkg.com/is-localhost-ip/-/is-localhost-ip-1.4.0.tgz#dd66aaabcbb5dbbc943e00adad5f715d2c3b3a1d"
integrity sha512-cN7SzlY7BVxSeoJu5equjsZaKSgD4HCfXrTwu0Jgbq5BbT1BU+D7Lyi/l1KO8H0un0JTlxcQaT/GWVapu+DIDg==
-is-map@^2.0.3:
+is-map@^2.0.2, is-map@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
@@ -6294,7 +6338,7 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-set@^2.0.3:
+is-set@^2.0.2, is-set@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
@@ -6373,9 +6417,9 @@ isarray@^2.0.5:
integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
isbot@^5.1.1:
- version "5.1.6"
- resolved "https://registry.yarnpkg.com/isbot/-/isbot-5.1.6.tgz#579a48515e92a3e064da63a41709815d8e641a30"
- integrity sha512-Phksj1A0dBP/M/5xeOx0zWemKlZRQvrbNzI19/HWso0uodiOcR8YYCXN60IdzwbKsGj5LnxPkMy6FuBtgckMNw==
+ version "5.1.11"
+ resolved "https://registry.yarnpkg.com/isbot/-/isbot-5.1.11.tgz#55e91e887c806a5f07d18ce04c2efe194215ba36"
+ integrity sha512-Asuou7OsKVbATgXlrlqdeSRw4fYnD6CNcc0IXy1f5m1AImL2S6IP0xRcRRzjGjoARbegvnBnju9kk5z/Itf70Q==
isexe@^2.0.0:
version "2.0.0"
@@ -7033,9 +7077,9 @@ known-css-properties@^0.29.0:
integrity sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==
language-subtag-registry@^0.3.20:
- version "0.3.22"
- resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d"
- integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==
+ version "0.3.23"
+ resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7"
+ integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==
language-tags@^1.0.9:
version "1.0.9"
@@ -7290,9 +7334,9 @@ lower-case@^2.0.2:
tslib "^2.0.3"
lru-cache@^10.2.0:
- version "10.2.2"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878"
- integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==
+ version "10.3.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b"
+ integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==
lru-cache@^5.1.1:
version "5.1.1"
@@ -7308,13 +7352,20 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
-magic-string@^0.30.0, magic-string@^0.30.2, magic-string@^0.30.3:
+magic-string@^0.30.0, magic-string@^0.30.2:
version "0.30.5"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9"
integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
+magic-string@^0.30.3:
+ version "0.30.10"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e"
+ integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
make-dir@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
@@ -7357,11 +7408,11 @@ mathml-tag-names@^2.1.3:
integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
maxmind@^4.3.6:
- version "4.3.19"
- resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.3.19.tgz#da97391185b41373961685419f0f12dfd7b97ff9"
- integrity sha512-Bu/VEN7ZWAOCjifdZaXJQuN6/yO7+OK35pnJsqmz8sOndK3KQFvJoY+6HX09/MmLLqtCfa+sMK0iaQOaTejGNA==
+ version "4.3.20"
+ resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.3.20.tgz#1b85c4b0d9a8df072c5cbe50dc5c54c130a02889"
+ integrity sha512-xwnLGghs96DyNK3ANs1jzW8+JwS6pBQ3eTh3kNsi23n5wySZb9FgqCghmde5JZFOv23bxGehcyh6lT522llNKw==
dependencies:
- mmdb-lib "2.1.0"
+ mmdb-lib "2.1.1"
tiny-lru "11.2.6"
md5@^2.3.0:
@@ -7443,7 +7494,7 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-micromatch@4.0.5, micromatch@^4.0.4, micromatch@^4.0.5:
+micromatch@4.0.5, micromatch@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
@@ -7451,6 +7502,14 @@ micromatch@4.0.5, micromatch@^4.0.4, micromatch@^4.0.5:
braces "^3.0.2"
picomatch "^2.3.1"
+micromatch@^4.0.4:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5"
+ integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@@ -7500,9 +7559,9 @@ minimatch@^5.0.1:
brace-expansion "^2.0.1"
minimatch@^9.0.1:
- version "9.0.4"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51"
- integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
dependencies:
brace-expansion "^2.0.1"
@@ -7533,9 +7592,9 @@ minipass@^5.0.0:
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481"
- integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
+ integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minizlib@^2.1.1:
version "2.1.2"
@@ -7550,10 +7609,10 @@ mkdirp@^1.0.3:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-mmdb-lib@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/mmdb-lib/-/mmdb-lib-2.1.0.tgz#c2456caaf4c7ffa056f77575da6d40988e9e878b"
- integrity sha512-tdDTZmnI5G4UoSctv2KxM/3VQt2XRj4CmR5R4VsAWsOUcS3LysHR34wtixWm/pXxXdkBDuN92auxkC0T2+qd1Q==
+mmdb-lib@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/mmdb-lib/-/mmdb-lib-2.1.1.tgz#c0d0bd35dc1fca41f0ebd043e43227ab04eb1792"
+ integrity sha512-yx8H/1H5AfnufiLnzzPqPf4yr/dKU9IFT1rPVwSkrKWHsQEeVVd6+X+L0nUbXhlEFTu3y/7hu38CFmEVgzvyeg==
moment-timezone@^0.5.35:
version "0.5.45"
@@ -7601,12 +7660,12 @@ next-basics@^0.39.0:
jsonwebtoken "^9.0.0"
pure-rand "^6.0.2"
-next@14.2.3:
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d"
- integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==
+next@14.2.4:
+ version "14.2.4"
+ resolved "https://registry.yarnpkg.com/next/-/next-14.2.4.tgz#ef66c39c71e2d8ad0a3caa0383c8933f4663e4d1"
+ integrity sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==
dependencies:
- "@next/env" "14.2.3"
+ "@next/env" "14.2.4"
"@swc/helpers" "0.5.5"
busboy "1.6.0"
caniuse-lite "^1.0.30001579"
@@ -7614,15 +7673,15 @@ next@14.2.3:
postcss "8.4.31"
styled-jsx "5.1.1"
optionalDependencies:
- "@next/swc-darwin-arm64" "14.2.3"
- "@next/swc-darwin-x64" "14.2.3"
- "@next/swc-linux-arm64-gnu" "14.2.3"
- "@next/swc-linux-arm64-musl" "14.2.3"
- "@next/swc-linux-x64-gnu" "14.2.3"
- "@next/swc-linux-x64-musl" "14.2.3"
- "@next/swc-win32-arm64-msvc" "14.2.3"
- "@next/swc-win32-ia32-msvc" "14.2.3"
- "@next/swc-win32-x64-msvc" "14.2.3"
+ "@next/swc-darwin-arm64" "14.2.4"
+ "@next/swc-darwin-x64" "14.2.4"
+ "@next/swc-linux-arm64-gnu" "14.2.4"
+ "@next/swc-linux-arm64-musl" "14.2.4"
+ "@next/swc-linux-x64-gnu" "14.2.4"
+ "@next/swc-linux-x64-musl" "14.2.4"
+ "@next/swc-win32-arm64-msvc" "14.2.4"
+ "@next/swc-win32-ia32-msvc" "14.2.4"
+ "@next/swc-win32-x64-msvc" "14.2.4"
nice-try@^1.0.4:
version "1.0.5"
@@ -7743,9 +7802,17 @@ object-assign@^4, object-assign@^4.1.1:
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-inspect@^1.13.1:
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
- integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
+ integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+
+object-is@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07"
+ integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
object-keys@^1.1.1:
version "1.1.1"
@@ -7762,7 +7829,7 @@ object.assign@^4.1.4, object.assign@^4.1.5:
has-symbols "^1.0.3"
object-keys "^1.1.1"
-object.entries@^1.1.7:
+object.entries@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41"
integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==
@@ -7771,7 +7838,7 @@ object.entries@^1.1.7:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
-object.fromentries@^2.0.7:
+object.fromentries@^2.0.7, object.fromentries@^2.0.8:
version "2.0.8"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
@@ -7790,7 +7857,7 @@ object.groupby@^1.0.1:
define-properties "^1.2.1"
es-abstract "^1.23.2"
-object.hasown@^1.1.3:
+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==
@@ -7799,7 +7866,7 @@ object.hasown@^1.1.3:
es-abstract "^1.23.2"
es-object-atoms "^1.0.0"
-object.values@^1.1.6, object.values@^1.1.7:
+object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
@@ -7969,9 +8036,9 @@ path-parse@^1.0.7:
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-scurry@^1.10.1:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.0.tgz#332d64e9726bf667fb348e5a1c71005c09ad741a"
- integrity sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw==
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
dependencies:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
@@ -8659,12 +8726,12 @@ pretty-format@^29.0.0, pretty-format@^29.7.0:
ansi-styles "^5.0.0"
react-is "^18.0.0"
-prisma@5.14.0:
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.14.0.tgz#ffc4696a43b044b636c3303b7aa98c13c2ade4dd"
- integrity sha512-gCNZco7y5XtjrnQYeDJTiVZmT/ncqCr5RY1/Cf8X2wgLRmyh9ayPAGBNziI4qEE4S6SxCH5omQLVo9lmURaJ/Q==
+prisma@5.16.2:
+ version "5.16.2"
+ resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.16.2.tgz#f46f130550bc148e603d25e06e82263fa6ab68e8"
+ integrity sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==
dependencies:
- "@prisma/engines" "5.14.0"
+ "@prisma/engines" "5.16.2"
process@^0.11.10:
version "0.11.10"
@@ -8810,19 +8877,19 @@ react-hook-form@^7.34.2:
integrity sha512-F/TroLjTICipmHeFlMrLtNLceO2xr1jU3CyiNla5zdwsGUGu2UOxxR4UyJgLlhMwLW/Wzp4cpJ7CPfgJIeKdSg==
react-intl@^6.5.5:
- version "6.6.6"
- resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.6.6.tgz#67979f790263c5ebd95b6ea581110eea3e7b550f"
- integrity sha512-dKXQNUrhZTlCp8uelYW8PHiM4saNKyLmHCfsJYWK0N/kZ/Ien35wjPHB8x9yQcTJbeN/hBOmb4x16iKUrdL9MA==
+ version "6.6.8"
+ resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.6.8.tgz#cb60c90502d0025caf9f86ec298cdc4348da17c2"
+ integrity sha512-M0pkhzcgV31h++2901BiRXWl69hp2zPyLxRrSwRjd1ErXbNoubz/f4M6DrRTd4OiSUrT4ajRQzrmtS5plG4FtA==
dependencies:
- "@formatjs/ecma402-abstract" "1.18.2"
- "@formatjs/icu-messageformat-parser" "2.7.6"
- "@formatjs/intl" "2.10.2"
- "@formatjs/intl-displaynames" "6.6.6"
- "@formatjs/intl-listformat" "7.5.5"
+ "@formatjs/ecma402-abstract" "2.0.0"
+ "@formatjs/icu-messageformat-parser" "2.7.8"
+ "@formatjs/intl" "2.10.4"
+ "@formatjs/intl-displaynames" "6.6.8"
+ "@formatjs/intl-listformat" "7.5.7"
"@types/hoist-non-react-statics" "^3.3.1"
"@types/react" "16 || 17 || 18"
hoist-non-react-statics "^3.3.2"
- intl-messageformat "10.5.12"
+ intl-messageformat "10.5.14"
tslib "^2.4.0"
react-is@^16.13.1, react-is@^16.7.0:
@@ -9018,7 +9085,7 @@ regenerator-transform@^0.15.2:
dependencies:
"@babel/runtime" "^7.8.4"
-regexp.prototype.flags@^1.5.2:
+regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
@@ -9141,9 +9208,9 @@ reusify@^1.0.4:
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rfdc@^1.3.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
- integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca"
+ integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
@@ -9567,6 +9634,13 @@ stack-utils@^2.0.3:
dependencies:
escape-string-regexp "^2.0.0"
+stop-iteration-iterator@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4"
+ integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==
+ dependencies:
+ internal-slot "^1.0.4"
+
streamsearch@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
@@ -9617,7 +9691,15 @@ string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2:
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
-string.prototype.matchall@^4.0.10:
+string.prototype.includes@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f"
+ integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+
+string.prototype.matchall@^4.0.11:
version "4.0.11"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a"
integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==
@@ -9770,9 +9852,9 @@ stylelint-config-prettier@^9.0.3:
integrity sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==
stylelint-config-recommended@^14.0.0:
- version "14.0.0"
- resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz#b395c7014838d2aaca1755eebd914d0bb5274994"
- integrity sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==
+ version "14.0.1"
+ resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz#d25e86409aaf79ee6c6085c2c14b33c7e23c90c6"
+ integrity sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==
stylelint-scss@^6.0.0:
version "6.1.0"
@@ -10037,9 +10119,9 @@ ts-api-utils@^1.0.1:
integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
ts-jest@^29.1.2:
- version "29.1.2"
- resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.2.tgz#7613d8c81c43c8cb312c6904027257e814c40e09"
- integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==
+ version "29.1.5"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.5.tgz#d6c0471cc78bffa2cb4664a0a6741ef36cfe8f69"
+ integrity sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==
dependencies:
bs-logger "0.x"
fast-json-stable-stringify "2.x"
@@ -10084,11 +10166,16 @@ tslib@^1.8.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0:
+tslib@^2.0.1, tslib@^2.0.3:
version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+tslib@^2.1.0, tslib@^2.4.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
+ integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
+
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
@@ -10206,10 +10293,10 @@ typescript@^4.0, typescript@^4.5:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
-typescript@^5.4.3:
- version "5.4.5"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611"
- integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==
+typescript@^5.5.3:
+ version "5.5.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa"
+ integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==
unbox-primitive@^1.0.2:
version "1.0.2"
@@ -10415,7 +10502,7 @@ which-collection@^1.0.1:
is-weakmap "^2.0.2"
is-weakset "^2.0.3"
-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, which-typed-array@^1.1.9:
version "1.1.15"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
@@ -10607,8 +10694,8 @@ yup@^0.32.11:
toposort "^2.0.2"
zustand@^4.3.8:
- version "4.5.2"
- resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848"
- integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.4.tgz#63abdd81edfb190bc61e0bbae045cc4d52158a05"
+ integrity sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==
dependencies:
use-sync-external-store "1.2.0"