diff --git a/.gitignore b/.gitignore index f70cf5f3..b11f4509 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ node_modules /public/script.js /geo /dist -src/generated/prisma/ # misc .DS_Store diff --git a/db/clickhouse/migrations/07_add_distinct_id.sql b/db/clickhouse/migrations/07_add_distinct_id.sql new file mode 100644 index 00000000..e2356940 --- /dev/null +++ b/db/clickhouse/migrations/07_add_distinct_id.sql @@ -0,0 +1,103 @@ +-- add tag column +ALTER TABLE umami.website_event ADD COLUMN "distinct_id" String AFTER "tag"; +ALTER TABLE umami.website_event_stats_hourly ADD COLUMN "distinct_id" String AFTER "tag"; +ALTER TABLE umami.session_data ADD COLUMN "distinct_id" String AFTER "data_type"; + +-- update materialized view +DROP TABLE umami.website_event_stats_hourly_mv; + +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, + screen, + language, + country, + region, + city, + entry_url, + exit_url, + url_paths as url_path, + url_query, + utm_source, + utm_medium, + utm_campaign, + utm_content, + utm_term, + referrer_domain, + page_title, + gclid, + fbclid, + msclkid, + ttclid, + li_fat_id, + twclid, + event_type, + event_name, + views, + min_time, + max_time, + tag, + distinct_id, + timestamp as created_at +FROM (SELECT + website_id, + session_id, + visit_id, + hostname, + browser, + os, + device, + screen, + language, + country, + region, + 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(utm_source)) utm_source, + arrayFilter(x -> x != '', groupArray(utm_medium)) utm_medium, + arrayFilter(x -> x != '', groupArray(utm_campaign)) utm_campaign, + arrayFilter(x -> x != '', groupArray(utm_content)) utm_content, + arrayFilter(x -> x != '', groupArray(utm_term)) utm_term, + arrayFilter(x -> x != '', groupArray(referrer_domain)) referrer_domain, + arrayFilter(x -> x != '', groupArray(page_title)) page_title, + arrayFilter(x -> x != '', groupArray(gclid)) gclid, + arrayFilter(x -> x != '', groupArray(fbclid)) fbclid, + arrayFilter(x -> x != '', groupArray(msclkid)) msclkid, + arrayFilter(x -> x != '', groupArray(ttclid)) ttclid, + arrayFilter(x -> x != '', groupArray(li_fat_id)) li_fat_id, + arrayFilter(x -> x != '', groupArray(twclid)) twclid, + 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, + arrayFilter(x -> x != '', groupArray(tag)) tag, + distinct_id, + toStartOfHour(created_at) timestamp +FROM umami.website_event +GROUP BY website_id, + session_id, + visit_id, + hostname, + browser, + os, + device, + screen, + language, + country, + region, + city, + event_type, + distinct_id, + timestamp); \ No newline at end of file diff --git a/db/clickhouse/schema.sql b/db/clickhouse/schema.sql index 40268762..fef600e0 100644 --- a/db/clickhouse/schema.sql +++ b/db/clickhouse/schema.sql @@ -38,6 +38,7 @@ CREATE TABLE umami.website_event event_type UInt32, event_name String, tag String, + distinct_id String, created_at DateTime('UTC'), job_id Nullable(UUID) ) @@ -75,6 +76,7 @@ CREATE TABLE umami.session_data number_value Nullable(Decimal64(4)), date_value Nullable(DateTime('UTC')), data_type UInt32, + distinct_id String, created_at DateTime('UTC'), job_id Nullable(UUID) ) @@ -120,6 +122,7 @@ CREATE TABLE umami.website_event_stats_hourly min_time SimpleAggregateFunction(min, DateTime('UTC')), max_time SimpleAggregateFunction(max, DateTime('UTC')), tag SimpleAggregateFunction(groupArrayArray, Array(String)), + distinct_id, created_at Datetime('UTC') ) ENGINE = AggregatingMergeTree @@ -172,6 +175,7 @@ SELECT min_time, max_time, tag, + distinct_id, timestamp as created_at FROM (SELECT website_id, @@ -209,6 +213,7 @@ FROM (SELECT min(created_at) min_time, max(created_at) max_time, arrayFilter(x -> x != '', groupArray(tag)) tag, + distinct_id String, toStartOfHour(created_at) timestamp FROM umami.website_event GROUP BY website_id, @@ -224,6 +229,7 @@ GROUP BY website_id, region, city, event_type, + distinct_id, timestamp); -- projections diff --git a/db/mysql/migrations/10_add_distinct_id/migration.sql b/db/mysql/migrations/10_add_distinct_id/migration.sql new file mode 100644 index 00000000..fa3942e4 --- /dev/null +++ b/db/mysql/migrations/10_add_distinct_id/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE `session` ADD COLUMN `distinct_id` VARCHAR(50) NULL; + +-- AlterTable +ALTER TABLE `session_data` ADD COLUMN `distinct_id` VARCHAR(50) NULL; diff --git a/db/mysql/migrations/migration_lock.toml b/db/mysql/migrations/migration_lock.toml index 8a21669a..592fc0b3 100644 --- a/db/mysql/migrations/migration_lock.toml +++ b/db/mysql/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually # It should be added in your version-control system (e.g., Git) -provider = "mysql" \ No newline at end of file +provider = "mysql" diff --git a/db/mysql/schema.prisma b/db/mysql/schema.prisma index 5f7d6f36..2a5513ab 100644 --- a/db/mysql/schema.prisma +++ b/db/mysql/schema.prisma @@ -1,7 +1,5 @@ generator client { - provider = "prisma-client-js" - output = "../src/generated/prisma" - binaryTargets = ["native"] + provider = "prisma-client-js" } datasource db { @@ -30,17 +28,18 @@ model User { } model Session { - id String @id @unique @map("session_id") @db.VarChar(36) - websiteId String @map("website_id") @db.VarChar(36) - browser String? @db.VarChar(20) - os String? @db.VarChar(20) - device String? @db.VarChar(20) - screen String? @db.VarChar(11) - language String? @db.VarChar(35) - country String? @db.Char(2) - region String? @db.Char(20) - city String? @db.VarChar(50) - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) + id String @id @unique @map("session_id") @db.VarChar(36) + websiteId String @map("website_id") @db.VarChar(36) + browser String? @db.VarChar(20) + os String? @db.VarChar(20) + device String? @db.VarChar(20) + screen String? @db.VarChar(11) + language String? @db.VarChar(35) + country String? @db.Char(2) + region String? @db.Char(20) + city String? @db.VarChar(50) + distinctId String? @map("distinct_id") @db.VarChar(50) + createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) websiteEvent WebsiteEvent[] sessionData SessionData[] @@ -166,6 +165,7 @@ model SessionData { numberValue Decimal? @map("number_value") @db.Decimal(19, 4) dateValue DateTime? @map("date_value") @db.Timestamp(0) dataType Int @map("data_type") @db.UnsignedInt + distinctId String? @map("distinct_id") @db.VarChar(50) createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) website Website @relation(fields: [websiteId], references: [id]) diff --git a/db/postgresql/migrations/10_add_distinct_id/migration.sql b/db/postgresql/migrations/10_add_distinct_id/migration.sql new file mode 100644 index 00000000..654c23b0 --- /dev/null +++ b/db/postgresql/migrations/10_add_distinct_id/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "session" ADD COLUMN "distinct_id" VARCHAR(50); + +-- AlterTable +ALTER TABLE "session_data" ADD COLUMN "distinct_id" VARCHAR(50); diff --git a/db/postgresql/migrations/migration_lock.toml b/db/postgresql/migrations/migration_lock.toml index 648c57fd..044d57cd 100644 --- a/db/postgresql/migrations/migration_lock.toml +++ b/db/postgresql/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually # It should be added in your version-control system (e.g., Git) -provider = "postgresql" \ No newline at end of file +provider = "postgresql" diff --git a/db/postgresql/schema.prisma b/db/postgresql/schema.prisma index d7c5de08..69efa265 100644 --- a/db/postgresql/schema.prisma +++ b/db/postgresql/schema.prisma @@ -1,7 +1,5 @@ generator client { - provider = "prisma-client-js" - output = "../src/generated/prisma" - binaryTargets = ["native"] + provider = "prisma-client-js" } datasource db { @@ -30,17 +28,18 @@ model User { } model Session { - id String @id @unique @map("session_id") @db.Uuid - websiteId String @map("website_id") @db.Uuid - browser String? @db.VarChar(20) - os String? @db.VarChar(20) - device String? @db.VarChar(20) - screen String? @db.VarChar(11) - language String? @db.VarChar(35) - country String? @db.Char(2) - region String? @db.VarChar(20) - city String? @db.VarChar(50) - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) + id String @id @unique @map("session_id") @db.Uuid + websiteId String @map("website_id") @db.Uuid + browser String? @db.VarChar(20) + os String? @db.VarChar(20) + device String? @db.VarChar(20) + screen String? @db.VarChar(11) + language String? @db.VarChar(35) + country String? @db.Char(2) + region String? @db.VarChar(20) + city String? @db.VarChar(50) + distinctId String? @map("distinct_id") @db.VarChar(50) + createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) websiteEvent WebsiteEvent[] sessionData SessionData[] @@ -166,6 +165,7 @@ model SessionData { numberValue Decimal? @map("number_value") @db.Decimal(19, 4) dateValue DateTime? @map("date_value") @db.Timestamptz(6) dataType Int @map("data_type") @db.Integer + distinctId String? @map("distinct_id") @db.VarChar(50) createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) website Website @relation(fields: [websiteId], references: [id]) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69ec6a10..f5d3f00f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@clickhouse/client': - specifier: ^1.11.1 - version: 1.11.1 + specifier: ^1.10.1 + version: 1.11.0 '@date-fns/utc': specifier: ^1.2.0 version: 1.2.0 @@ -36,11 +36,8 @@ importers: specifier: ^9.7.3 version: 9.7.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tanstack/react-query': - specifier: ^5.74.11 - version: 5.74.11(react@19.1.0) - '@umami/react-zen': - specifier: ^0.88.0 - version: 0.88.0(@babel/core@7.26.10)(@types/react@19.1.2)(immer@9.0.21)(use-sync-external-store@1.5.0(react@19.1.0)) + specifier: ^5.28.6 + version: 5.74.3(react@19.1.0) '@umami/redis-client': specifier: ^0.27.0 version: 0.27.0 @@ -108,8 +105,8 @@ importers: specifier: ^1.4.0 version: 1.4.0 isbot: - specifier: ^5.1.27 - version: 5.1.27 + specifier: ^5.1.16 + version: 5.1.26 jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 @@ -190,8 +187,8 @@ importers: specifier: ^4.2.29 version: 4.8.4(ts-jest@29.3.2(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.25.3)(jest@29.7.0(@types/node@22.15.3)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.8.3)))(typescript@5.8.3)) '@netlify/plugin-nextjs': - specifier: ^5.10.7 - version: 5.10.7 + specifier: ^5.10.6 + version: 5.10.6 '@rollup/plugin-alias': specifier: ^5.0.0 version: 5.1.1(rollup@3.29.5) @@ -220,14 +217,17 @@ importers: specifier: ^29.5.14 version: 29.5.14 '@types/node': - specifier: ^22.15.3 - version: 22.15.3 + specifier: ^22.13.4 + version: 22.14.1 '@types/react': specifier: ^19.0.8 version: 19.1.2 '@types/react-dom': specifier: ^19.0.2 version: 19.1.2(@types/react@19.1.2) + '@types/react-intl': + specifier: ^3.0.0 + version: 3.0.0(react@19.1.0)(typescript@5.8.3) '@types/react-window': specifier: ^1.8.8 version: 1.8.8 @@ -244,8 +244,8 @@ importers: specifier: ^13.6.6 version: 13.17.0 esbuild: - specifier: ^0.25.3 - version: 0.25.3 + specifier: ^0.25.0 + version: 0.25.2 eslint: specifier: ^8.33.0 version: 8.57.1 @@ -349,47 +349,6 @@ importers: specifier: ^5.5.3 version: 5.8.3 - dist: - dependencies: - '@tanstack/react-query': - specifier: ^4.33.0 - version: 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: - specifier: ^2.3.1 - version: 2.5.1 - colord: - specifier: ^2.9.2 - version: 2.9.3 - date-fns-tz: - specifier: ^1.1.4 - version: 1.3.8(date-fns@2.30.0) - immer: - specifier: ^9.0.12 - version: 9.0.21 - moment-timezone: - specifier: ^0.5.35 - version: 0.5.48 - next: - specifier: ^13.4.0 - version: 13.5.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-basics: - specifier: ^0.36.0 - version: 0.36.0(next@13.5.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - react-intl: - specifier: ^5.24.7 - version: 5.25.1(react@18.3.1)(typescript@4.9.5) - zustand: - specifier: ^4.3.8 - version: 4.5.6(@types/react@19.1.2)(immer@9.0.21)(react@18.3.1) - - src/generated/prisma: {} - packages: '@ampproject/remapping@2.3.0': @@ -1547,12 +1506,6 @@ packages: '@formatjs/ecma402-abstract@2.2.4': resolution: {integrity: sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==} - '@formatjs/ecma402-abstract@2.3.4': - resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==} - - '@formatjs/fast-memoize@1.2.1': - resolution: {integrity: sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==} - '@formatjs/fast-memoize@2.2.3': resolution: {integrity: sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==} @@ -1617,6 +1570,14 @@ packages: typescript: optional: true + '@formatjs/intl@2.2.1': + resolution: {integrity: sha512-vgvyUOOrzqVaOFYzTf2d3+ToSkH2JpR7x/4U1RyoHQLmvEaTQvXJ7A2qm1Iy3brGNXC/+/7bUlc3lpH+h/LOJA==} + peerDependencies: + typescript: ^4.5 + peerDependenciesMeta: + typescript: + optional: true + '@formatjs/ts-transformer@2.13.0': resolution: {integrity: sha512-mu7sHXZk1NWZrQ3eUqugpSYo8x5/tXkrI4uIbFqCEC0eNgQaIcoKgVeDFgDAcgG+cEme2atAUYSFF+DFWC4org==} peerDependencies: @@ -1907,68 +1868,38 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@13.5.9': - resolution: {integrity: sha512-DwdeJqP7v8wmoyTWPbPVodTwCybBZa02xjSJ6YQFIFZFZ7dFgrieKW4Eo0GoIcOJq5+JxkQyejmI+8zwDp3pwA==} + '@next/swc-darwin-x64@15.3.0': + resolution: {integrity: sha512-m+eO21yg80En8HJ5c49AOQpFDq+nP51nu88ZOMCorvw3g//8g1JSUsEiPSiFpJo1KCTQ+jm9H0hwXK49H/RmXg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.3.1': - resolution: {integrity: sha512-q+aw+cJ2ooVYdCEqZVk+T4Ni10jF6Fo5DfpEV51OupMaV5XL6pf3GCzrk6kSSZBsMKZtVC1Zm/xaNBFpA6bJ2g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@13.5.9': - resolution: {integrity: sha512-wdQsKsIsGSNdFojvjW3Ozrh8Q00+GqL3wTaMjDkQxVtRbAqfFBtrLPO0IuWChVUP2UeuQcHpVeUvu0YgOP00+g==} + '@next/swc-linux-arm64-gnu@15.3.0': + resolution: {integrity: sha512-H0Kk04ZNzb6Aq/G6e0un4B3HekPnyy6D+eUBYPJv9Abx8KDYgNMWzKt4Qhj57HXV3sTTjsfc1Trc1SxuhQB+Tg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.3.1': - resolution: {integrity: sha512-wBQ+jGUI3N0QZyWmmvRHjXjTWFy8o+zPFLSOyAyGFI94oJi+kK/LIZFJXeykvgXUk1NLDAEFDZw/NVINhdk9FQ==} + '@next/swc-linux-arm64-musl@15.3.0': + resolution: {integrity: sha512-k8GVkdMrh/+J9uIv/GpnHakzgDQhrprJ/FbGQvwWmstaeFG06nnAoZCJV+wO/bb603iKV1BXt4gHG+s2buJqZA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@13.5.9': - resolution: {integrity: sha512-6VpS+bodQqzOeCwGxoimlRoosiWlSc0C224I7SQWJZoyJuT1ChNCo+45QQH+/GtbR/s7nhaUqmiHdzZC9TXnXA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@15.3.1': - resolution: {integrity: sha512-IIxXEXRti/AulO9lWRHiCpUUR8AR/ZYLPALgiIg/9ENzMzLn3l0NSxVdva7R/VDcuSEBo0eGVCe3evSIHNz0Hg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@13.5.9': - resolution: {integrity: sha512-XxG3yj61WDd28NA8gFASIR+2viQaYZEFQagEodhI/R49gXWnYhiflTeeEmCn7Vgnxa/OfK81h1gvhUZ66lozpw==} + '@next/swc-linux-x64-gnu@15.3.0': + resolution: {integrity: sha512-ZMQ9yzDEts/vkpFLRAqfYO1wSpIJGlQNK9gZ09PgyjBJUmg8F/bb8fw2EXKgEaHbCc4gmqMpDfh+T07qUphp9A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.1': - resolution: {integrity: sha512-bfI4AMhySJbyXQIKH5rmLJ5/BP7bPwuxauTvVEiJ/ADoddaA9fgyNNCcsbu9SlqfHDoZmfI6g2EjzLwbsVTr5A==} + '@next/swc-linux-x64-musl@15.3.0': + resolution: {integrity: sha512-RFwq5VKYTw9TMr4T3e5HRP6T4RiAzfDJ6XsxH8j/ZeYq2aLsBqCkFzwMI0FmnSsLaUbOb46Uov0VvN3UciHX5A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@13.5.9': - resolution: {integrity: sha512-/dnscWqfO3+U8asd+Fc6dwL2l9AZDl7eKtPNKW8mKLh4Y4wOpjJiamhe8Dx+D+Oq0GYVjuW0WwjIxYWVozt2bA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@15.3.1': - resolution: {integrity: sha512-FeAbR7FYMWR+Z+M5iSGytVryKHiAsc0x3Nc3J+FD5NVbD5Mqz7fTSy8CYliXinn7T26nDMbpExRUI/4ekTvoiA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@13.5.9': - resolution: {integrity: sha512-T/iPnyurOK5a4HRUcxAlss8uzoEf5h9tkd+W2dSWAfzxv8WLKlUgbfk+DH43JY3Gc2xK5URLuXrxDZ2mGfk/jw==} + '@next/swc-win32-arm64-msvc@15.3.0': + resolution: {integrity: sha512-a7kUbqa/k09xPjfCl0RSVAvEjAkYBYxUzSVAzk2ptXiNEL+4bDBo9wNC43G/osLA/EOGzG4CuNRFnQyIHfkRgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -2046,302 +1977,11 @@ packages: peerDependencies: '@prisma/client': ^6.5.0 - '@prisma/fetch-engine@6.7.0': - resolution: {integrity: sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==} + '@prisma/fetch-engine@6.6.0': + resolution: {integrity: sha512-Ohfo8gKp05LFLZaBlPUApM0M7k43a0jmo86YY35u1/4t+vuQH9mRGU7jGwVzGFY3v+9edeb/cowb1oG4buM1yw==} - '@prisma/get-platform@6.7.0': - resolution: {integrity: sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==} - - '@react-aria/autocomplete@3.0.0-beta.2': - resolution: {integrity: sha512-oxsFCIGj5yooQkZzdqjvsdfr9fOlmAq4v6njIOAyQFsta3H0yQiv+YU3XnrnCBxVX+Mz/mZtZgfhAA9JBDukHg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/breadcrumbs@3.5.23': - resolution: {integrity: sha512-4uLxuAgPfXds8sBc/Cg0ml7LKWzK+YTwHL7xclhQUkPO32rzlHDl+BJ5cyWhvZgGUf8JJXbXhD5VlJJzbbl8Xg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/button@3.13.0': - resolution: {integrity: sha512-BEcTQb7Q8ZrAtn0scPDv/ErZoGC1FI0sLk0UTPGskuh/RV9ZZGFbuSWTqOwV8w5CS6VMvPjH6vaE8hS7sb5DIw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/calendar@3.8.0': - resolution: {integrity: sha512-9vms/fWjJPZkJcMxciwWWOjGy/Q0nqI6FV0pYbMZbqepkzglEaVd98kl506r/4hLhWKwLdTfqCgbntRecj8jBg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/checkbox@3.15.4': - resolution: {integrity: sha512-ZkDJFs2EfMBXVIpBSo4ouB+NXyr2LRgZNp2x8/v+7n3aTmMU8j2PzT+Ra2geTQbC0glMP7UrSg4qZblqrxEBcQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/collections@3.0.0-rc.0': - resolution: {integrity: sha512-WcRcE3wKtbprOJlBaMbdYS5Suu2KIGq1gVT2fLXVbmDY0CjGemqp2m5aDblQOO8pxvsAqHV8pyznkhANTnK1CQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/color@3.0.6': - resolution: {integrity: sha512-ik4Db9hrN1yIT0CQMB888ktBmrwA/kNhkfiDACtoUHv8Ev+YEpmagnmih9vMyW2vcnozYJpnn/aCMl59J5uMew==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/combobox@3.12.2': - resolution: {integrity: sha512-EgddiF8VnAjB4EynJERPn4IoDMUabI8GiKOQZ6Ar3MlRWxQnUfxPpZwXs8qWR3dPCzYUt2PhBinhBMjyR1yRIw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/datepicker@3.14.2': - resolution: {integrity: sha512-O7fdzcqIJ7i/+8SGYvx4tloTZgK4Ws8OChdbFcd2rZoRPqxM50M6J+Ota8hTet2wIhojUXnM3x2na3EvoucBXA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/dialog@3.5.24': - resolution: {integrity: sha512-tw0WH89gVpHMI5KUQhuzRE+IYCc9clRfDvCppuXNueKDrZmrQKbeoU6d0b5WYRsBur2+d7ErtvpLzHVqE1HzfA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/disclosure@3.0.4': - resolution: {integrity: sha512-HXGVLA06BH0b/gN8dCTzWATwMikz8D+ahRxZiI0HDZxLADWGsSPqRXKN0GNAiBKbvPtvAbrwslE3pktk/SlU/w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/dnd@3.9.2': - resolution: {integrity: sha512-pPYygmJTjSPV2K/r48TvF75WuddG8d8nlIxAXSW22++WKqZ0z+eun6gDUXoKeB2rgY7sVfLqpRdnPV52AnBX+Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/focus@3.20.2': - resolution: {integrity: sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/form@3.0.15': - resolution: {integrity: sha512-kk8AnLz+EOgnn3sTaXYmtw+YzVDc1of/+xAkuOupQi6zQFnNRjc99JlDbKHoUZ39urMl+8lsp/1b9VPPhNrBNw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/grid@3.13.0': - resolution: {integrity: sha512-RcuJYA4fyJ83MH3SunU+P5BGkx3LJdQ6kxwqwWGIuI9eUKc7uVbqvN9WN3fI+L0QfxqBFmh7ffRxIdQn7puuzw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/gridlist@3.12.0': - resolution: {integrity: sha512-KSpnSBYQ7ozGQNaRR2NGq7Fl2zIv5w9KNyO9V/IE2mxUNfX6fwqUPoANFcy9ySosksE7pPnFtuYIB+TQtUjYqQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/i18n@3.12.8': - resolution: {integrity: sha512-V/Nau9WuwTwxfFffQL4URyKyY2HhRlu9zmzkF2Hw/j5KmEQemD+9jfaLueG2CJu85lYL06JrZXUdnhZgKnqMkA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/interactions@3.25.0': - resolution: {integrity: sha512-GgIsDLlO8rDU/nFn6DfsbP9rfnzhm8QFjZkB9K9+r+MTSCn7bMntiWQgMM+5O6BiA8d7C7x4zuN4bZtc0RBdXQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/label@3.7.17': - resolution: {integrity: sha512-Fz7IC2LQT2Y/sAoV+gFEXoULtkznzmK2MmeTv5shTNjeTxzB1BhQbD4wyCypi7eGsnD/9Zy+8viULCsIUbvjWw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/landmark@3.0.2': - resolution: {integrity: sha512-KVXa9s3fSgo/PiUjdbnPh3a1yS4t2bMZeVBPPzYAgQ4wcU2WjuLkhviw+5GWSWRfT+jpIMV7R/cmyvr0UHvRfg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/link@3.8.0': - resolution: {integrity: sha512-gpDD6t3FqtFR9QjSIKNpmSR3tS4JG2anVKx2wixuRDHO6Ddexxv4SBzsE1+230p+FlFGjftFa2lEgQ7RNjZrmA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/listbox@3.14.3': - resolution: {integrity: sha512-wzelam1KENUvKjsTq8gfrOW2/iab8SyIaSXfFvGmWW82XlDTlW+oQeA39tvOZktMVGspr+xp8FySY09rtz6UXw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/live-announcer@3.4.2': - resolution: {integrity: sha512-6+yNF9ZrZ4YJ60Oxy2gKI4/xy6WUv1iePDCFJkgpNVuOEYi8W8czff8ctXu/RPB25OJx5v2sCw9VirRogTo2zA==} - - '@react-aria/menu@3.18.2': - resolution: {integrity: sha512-90k+Ke1bhFWhR2zuRI6OwKWQrCpOD99n+9jhG96JZJZlNo5lB+5kS+ufG1LRv5GBnCug0ciLQmPMAfguVsCjEQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/meter@3.4.22': - resolution: {integrity: sha512-A/30vrtJO0xqctS/ngE1Lp/w3Aq3MPcpdRHU5E06EUYotzRzHFE9sNmezWslkZ3NfYwA/mxLvgmrsOJSR0Hx6A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/numberfield@3.11.13': - resolution: {integrity: sha512-F73BVdIRV8VvKl0omhGaf0E7mdJ7pdPjDP3wYNf410t55BXPxmndItUKpGfxSbl8k6ZYLvQyOqkD6oWSfZXpZw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/overlays@3.27.0': - resolution: {integrity: sha512-2vZVgL7FrloN5Rh8sAhadGADJbuWg69DdSJB3fd2/h5VvcEhnIfNPu9Ma5XmdkApDoTboIEsKZ4QLYwRl98w6w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/progress@3.4.22': - resolution: {integrity: sha512-wK2hath4C9HKgmjCH+iSrAs86sUKqqsYKbEKk9/Rj9rzXqHyaEK9EG0YZDnSjd8kX+N9hYcs5MfJl6AZMH4juQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/radio@3.11.2': - resolution: {integrity: sha512-6AFJHXMewJBgHNhqkN1qjgwwx6kmagwYD+3Z+hNK1UHTsKe1Uud5/IF7gPFCqlZeKxA+Lvn9gWiqJrQbtD2+wg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/searchfield@3.8.3': - resolution: {integrity: sha512-t1DW3nUkPHyZhFhUbT+TdhvI8yZYvUPCuwl0FyraMRCQ4+ww5Ieu4n8JB9IGYmIUB/GWEbZlDHplu4s3efmliA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/select@3.15.4': - resolution: {integrity: sha512-CipqXgdOfWsiHw/chfqd8t9IQpvehP+3uKLJx3ic4Uyj+FT/SxVmmjX0gyvVbZd00ltFCMJYO2xYKQUlbW2AtQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/selection@3.24.0': - resolution: {integrity: sha512-RfGXVc04zz41NVIW89/a3quURZ4LT/GJLkiajQK2VjhisidPdrAWkcfjjWJj0n+tm5gPWbi9Rs5R/Rc8mrvq8Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/separator@3.4.8': - resolution: {integrity: sha512-ncuOSTBF/qbNumnW/IRz+xyr+Ud85eCF0Expw4XWhKjAZfzJd86MxPY5ZsxE7pYLOcRWdOSIH1/obwwwSz8ALQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/slider@3.7.18': - resolution: {integrity: sha512-GBVv5Rpvj/6JH2LnF1zVAhBmxGiuq7R8Ekqyr5kBrCc2ToF3PrTjfGc/mlh0eEtbj+NvAcnlgTx1/qosYt1sGw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/spinbutton@3.6.14': - resolution: {integrity: sha512-oSKe9p0Q/7W39eXRnLxlwJG5dQo4ffosRT3u2AtOcFkk2Zzj+tSQFzHQ4202nrWdzRnQ2KLTgUUNnUvXf0BJcg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/ssr@3.9.8': - resolution: {integrity: sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/switch@3.7.2': - resolution: {integrity: sha512-vaREbp1gFjv+jEMXoXpNK7JYFO/jhwnSYAwEINNWnwf54IGeHvTPaB2NwolYSFvP4HAj8TKYbGFUSz7RKLhLgw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/table@3.17.2': - resolution: {integrity: sha512-wsF3JqiAKcol1sfeNqTxyzH6+nxu0sAfyuh+XQfp1tvSGx15NifYeNKovNX4EPpUVkAI7jL5Le+eYeYYGELfnw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/tabs@3.10.2': - resolution: {integrity: sha512-rpEgh//Gnew3le49tQVFOQ6ZyacJdaNUDXHt0ocguXb+2UrKtH54M8oIAE7E8KaB1puQlFXRs+Rjlr1rOlmjEQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/tag@3.5.2': - resolution: {integrity: sha512-xZ5Df0x+xcDg6UTDvnjP4pu+XrmYVaYcqzF7RGoCD1KyRCHU5Czg9p+888NB0K+vnJHfNsQh6rmMhDUydXu9eg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/textfield@3.17.2': - resolution: {integrity: sha512-4KINB0HueYUHUgvi/ThTP27hu4Mv5ujG55pH3dmSRD4Olu/MRy1m/Psq72o8LTf4bTOM9ZP1rKccUg6xfaMidA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/toast@3.0.2': - resolution: {integrity: sha512-iaiHDE1CKYM3BbNEp3A2Ed8YAlpXUGyY6vesKISdHEZ2lJ7r+1hbcFoTNdG8HfbB8Lz5vw8Wd2o+ZmQ2tnDY9Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/toggle@3.11.2': - resolution: {integrity: sha512-JOg8yYYCjLDnEpuggPo9GyXFaT/B238d3R8i/xQ6KLelpi3fXdJuZlFD6n9NQp3DJbE8Wj+wM5/VFFAi3cISpw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/toolbar@3.0.0-beta.15': - resolution: {integrity: sha512-PNGpNIKIsCW8rxI9XXSADlLrSpikILJKKECyTRw9KwvXDRc44pezvdjGHCNinQcKsQoy5BtkK5cTSAyVqzzTXQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/tooltip@3.8.2': - resolution: {integrity: sha512-ctVTgh1LXvmr1ve3ehAWfvlJR7nHYZeqhl/g1qnA+983LQtc1IF9MraCs92g0m7KpBwCihuA+aYwTPsUHfKfXg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/tree@3.0.2': - resolution: {integrity: sha512-gr06Y1760+kdlDeUcGNR+PCuJMtlrdtNMGG1Z0fSygy8y7/zVdTOLQp0c1Q3pjL2nr7Unjz/H1xSgERParHsbg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/utils@3.28.2': - resolution: {integrity: sha512-J8CcLbvnQgiBn54eeEvQQbIOfBF3A1QizxMw9P4cl9MkeR03ug7RnjTIdJY/n2p7t59kLeAB3tqiczhcj+Oi5w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/virtualizer@4.1.4': - resolution: {integrity: sha512-SBKD2K+kBc3aLMVEqnBXjpqLhUSyvoi1ubSgUS5KMIqgyn44OWn5zKTsj9SIPZot6buSlgV2700TIWDhEJzWlw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/visually-hidden@3.8.22': - resolution: {integrity: sha512-EO3R8YTKZ7HkLl9k1Y2uBKYBgpJagth4/4W7mfpJZE24A3fQnCP8zx1sweXiAm0mirR4J6tNaK7Ia8ssP5TpOw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@prisma/get-platform@6.6.0': + resolution: {integrity: sha512-3qCwmnT4Jh5WCGUrkWcc6VZaw0JY7eWN175/pcb5Z6FiLZZ3ygY93UX0WuV41bG51a6JN/oBH0uywJ90Y+V5eA==} '@react-spring/animated@9.7.5': resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==} @@ -2748,6 +2388,15 @@ packages: rollup: optional: true + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} @@ -2860,32 +2509,11 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@tanstack/query-core@5.74.3': + resolution: {integrity: sha512-Mqk+5o3qTuAiZML248XpNH8r2cOzl15+LTbUsZQEwvSvn1GU4VQhvqzAbil36p+MBxpr/58oBSnRzhrBevDhfg==} - '@swc/helpers@0.5.2': - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} - - '@tanstack/query-core@4.36.1': - resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} - - '@tanstack/query-core@5.74.9': - resolution: {integrity: sha512-qmjXpWyigDw4SfqdSBy24FzRvpBPXlaSbl92N77lcrL+yvVQLQkf0T6bQNbTxl9IEB/SvVFhhVZoIlQvFnNuuw==} - - '@tanstack/react-query@4.36.1': - resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - - '@tanstack/react-query@5.74.11': - resolution: {integrity: sha512-FFhn9ZiYRUOsxLAWZYxVfQTpVE7UWRaAeHJIWVDHKlmZZGc16rMHW9KrFZ8peC4hA71QUf/shJD8dPSMqDnRmA==} + '@tanstack/react-query@5.74.3': + resolution: {integrity: sha512-QrycUn0wxjVPzITvQvOxFRdhlAwIoOQSuav7qWD4SWCoKCdLbyRZ2vji2GuBq/glaxbF4wBx3fqcYRDOt8KDTA==} peerDependencies: react: ^18 || ^19 @@ -2981,8 +2609,8 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react-dom@19.1.2': - resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} + '@types/react-dom@19.1.3': + resolution: {integrity: sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==} peerDependencies: '@types/react': ^19.0.0 @@ -3562,6 +3190,9 @@ packages: caniuse-lite@1.0.30001715: resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + caniuse-lite@1.0.30001716: + resolution: {integrity: sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==} + caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -6500,26 +6131,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-hook-form@7.56.1: - resolution: {integrity: sha512-qWAVokhSpshhcEuQDSANHx3jiAEFzu2HAaaQIzi/r9FNPm1ioAvuJSD4EuZzWd7Al7nTRKcKPnBKO7sRn+zavQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - - react-icons@5.5.0: - resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} - peerDependencies: - react: '*' - - react-intl@5.25.1: - resolution: {integrity: sha512-pkjdQDvpJROoXLMltkP/5mZb0/XqrqLoPGKUCfbdkP8m6U9xbK40K51Wu+a4aQqTEvEK5lHBk0fWzUV72SJ3Hg==} - peerDependencies: - react: ^16.3.0 || 17 || 18 - typescript: ^4.5 - peerDependenciesMeta: - typescript: - optional: true - react-intl@6.8.9: resolution: {integrity: sha512-TUfj5E7lyUDvz/GtovC9OMh441kBr08rtIbgh3p0R8iF3hVY+V2W9Am7rb8BpJ/29BH1utJOqOOhmvEVh3GfZg==} peerDependencies: @@ -8808,9 +8419,7 @@ snapshots: '@fontsource/inter@4.5.15': {} - '@fontsource/jetbrains-mono@5.2.5': {} - - '@formatjs/cli@4.8.4(ts-jest@29.3.2(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.25.3)(jest@29.7.0(@types/node@22.15.3)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.8.3)))(typescript@5.8.3))': + '@formatjs/cli@4.8.4(ts-jest@29.3.2(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.25.2)(jest@29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)))(typescript@5.8.3))': dependencies: '@formatjs/icu-messageformat-parser': 2.1.0 '@formatjs/ts-transformer': 3.9.4(ts-jest@29.3.2(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.25.3)(jest@29.7.0(@types/node@22.15.3)(ts-node@10.9.2(@types/node@22.15.3)(typescript@5.8.3)))(typescript@5.8.3)) @@ -8850,17 +8459,6 @@ snapshots: '@formatjs/intl-localematcher': 0.5.8 tslib: 2.8.1 - '@formatjs/ecma402-abstract@2.3.4': - dependencies: - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/intl-localematcher': 0.6.1 - decimal.js: 10.5.0 - tslib: 2.8.1 - - '@formatjs/fast-memoize@1.2.1': - dependencies: - tslib: 2.8.1 - '@formatjs/fast-memoize@2.2.3': dependencies: tslib: 2.8.1 @@ -8908,6 +8506,12 @@ snapshots: '@formatjs/intl-localematcher': 0.2.25 tslib: 2.8.1 + '@formatjs/intl-displaynames@5.4.3': + dependencies: + '@formatjs/ecma402-abstract': 1.11.4 + '@formatjs/intl-localematcher': 0.2.25 + tslib: 2.8.1 + '@formatjs/intl-displaynames@6.8.5': dependencies: '@formatjs/ecma402-abstract': 2.2.4 @@ -9333,55 +8937,28 @@ snapshots: dependencies: glob: 10.3.10 - '@next/swc-darwin-arm64@13.5.9': + '@next/swc-darwin-arm64@15.3.0': optional: true - '@next/swc-darwin-arm64@15.3.1': + '@next/swc-darwin-x64@15.3.0': optional: true - '@next/swc-darwin-x64@13.5.9': + '@next/swc-linux-arm64-gnu@15.3.0': optional: true - '@next/swc-darwin-x64@15.3.1': + '@next/swc-linux-arm64-musl@15.3.0': optional: true - '@next/swc-linux-arm64-gnu@13.5.9': + '@next/swc-linux-x64-gnu@15.3.0': optional: true - '@next/swc-linux-arm64-gnu@15.3.1': + '@next/swc-linux-x64-musl@15.3.0': optional: true - '@next/swc-linux-arm64-musl@13.5.9': + '@next/swc-win32-arm64-msvc@15.3.0': optional: true - '@next/swc-linux-arm64-musl@15.3.1': - optional: true - - '@next/swc-linux-x64-gnu@13.5.9': - optional: true - - '@next/swc-linux-x64-gnu@15.3.1': - optional: true - - '@next/swc-linux-x64-musl@13.5.9': - optional: true - - '@next/swc-linux-x64-musl@15.3.1': - optional: true - - '@next/swc-win32-arm64-msvc@13.5.9': - optional: true - - '@next/swc-win32-arm64-msvc@15.3.1': - optional: true - - '@next/swc-win32-ia32-msvc@13.5.9': - optional: true - - '@next/swc-win32-x64-msvc@13.5.9': - optional: true - - '@next/swc-win32-x64-msvc@15.3.1': + '@next/swc-win32-x64-msvc@15.3.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -9413,662 +8990,30 @@ snapshots: transitivePeerDependencies: - supports-color - '@prisma/debug@6.7.0': {} + '@prisma/debug@6.6.0': {} - '@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed': {} + '@prisma/engines-version@6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a': {} - '@prisma/engines@6.7.0': + '@prisma/engines@6.6.0': dependencies: - '@prisma/debug': 6.7.0 - '@prisma/engines-version': 6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed - '@prisma/fetch-engine': 6.7.0 - '@prisma/get-platform': 6.7.0 + '@prisma/debug': 6.6.0 + '@prisma/engines-version': 6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a + '@prisma/fetch-engine': 6.6.0 + '@prisma/get-platform': 6.6.0 - '@prisma/extension-read-replicas@0.4.1(@prisma/client@6.7.0(prisma@6.7.0(typescript@5.8.3))(typescript@5.8.3))': + '@prisma/extension-read-replicas@0.4.1(@prisma/client@6.6.0(prisma@6.6.0(typescript@5.8.3))(typescript@5.8.3))': dependencies: - '@prisma/client': 6.7.0(prisma@6.7.0(typescript@5.8.3))(typescript@5.8.3) + '@prisma/client': 6.6.0(prisma@6.6.0(typescript@5.8.3))(typescript@5.8.3) - '@prisma/fetch-engine@6.7.0': + '@prisma/fetch-engine@6.6.0': dependencies: - '@prisma/debug': 6.7.0 - '@prisma/engines-version': 6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed - '@prisma/get-platform': 6.7.0 + '@prisma/debug': 6.6.0 + '@prisma/engines-version': 6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a + '@prisma/get-platform': 6.6.0 - '@prisma/get-platform@6.7.0': + '@prisma/get-platform@6.6.0': dependencies: - '@prisma/debug': 6.7.0 - - '@react-aria/autocomplete@3.0.0-beta.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/combobox': 3.12.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/listbox': 3.14.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/searchfield': 3.8.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/textfield': 3.17.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/autocomplete': 3.0.0-beta.1(react@19.1.0) - '@react-stately/combobox': 3.10.4(react@19.1.0) - '@react-types/autocomplete': 3.0.0-alpha.30(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/breadcrumbs@3.5.23(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/link': 3.8.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/breadcrumbs': 3.7.12(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/button@3.13.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/toolbar': 3.0.0-beta.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/toggle': 3.8.3(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/calendar@3.8.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@internationalized/date': 3.8.0 - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/live-announcer': 3.4.2 - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/calendar': 3.8.0(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/calendar': 3.7.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/checkbox@3.15.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/form': 3.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/toggle': 3.11.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/checkbox': 3.6.13(react@19.1.0) - '@react-stately/form': 3.1.3(react@19.1.0) - '@react-stately/toggle': 3.8.3(react@19.1.0) - '@react-types/checkbox': 3.9.3(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/collections@3.0.0-rc.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/ssr': 3.9.8(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - use-sync-external-store: 1.5.0(react@19.1.0) - - '@react-aria/color@3.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/numberfield': 3.11.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/slider': 3.7.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/spinbutton': 3.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/textfield': 3.17.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/visually-hidden': 3.8.22(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/color': 3.8.4(react@19.1.0) - '@react-stately/form': 3.1.3(react@19.1.0) - '@react-types/color': 3.0.4(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/combobox@3.12.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/listbox': 3.14.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/live-announcer': 3.4.2 - '@react-aria/menu': 3.18.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/overlays': 3.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/textfield': 3.17.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/collections': 3.12.3(react@19.1.0) - '@react-stately/combobox': 3.10.4(react@19.1.0) - '@react-stately/form': 3.1.3(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/combobox': 3.13.4(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/datepicker@3.14.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@internationalized/date': 3.8.0 - '@internationalized/number': 3.6.1 - '@internationalized/string': 3.2.6 - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/form': 3.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/spinbutton': 3.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/datepicker': 3.14.0(react@19.1.0) - '@react-stately/form': 3.1.3(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/calendar': 3.7.0(react@19.1.0) - '@react-types/datepicker': 3.12.0(react@19.1.0) - '@react-types/dialog': 3.5.17(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/dialog@3.5.24(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/overlays': 3.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/dialog': 3.5.17(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/disclosure@3.0.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/ssr': 3.9.8(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/disclosure': 3.0.3(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/dnd@3.9.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@internationalized/string': 3.2.6 - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/live-announcer': 3.4.2 - '@react-aria/overlays': 3.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/dnd': 3.5.3(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/focus@3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - clsx: 2.1.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/form@3.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/form': 3.1.3(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/grid@3.13.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/live-announcer': 3.4.2 - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/collections': 3.12.3(react@19.1.0) - '@react-stately/grid': 3.11.1(react@19.1.0) - '@react-stately/selection': 3.20.1(react@19.1.0) - '@react-types/checkbox': 3.9.3(react@19.1.0) - '@react-types/grid': 3.3.1(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/gridlist@3.12.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/grid': 3.13.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/collections': 3.12.3(react@19.1.0) - '@react-stately/list': 3.12.1(react@19.1.0) - '@react-stately/tree': 3.8.9(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/i18n@3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@internationalized/date': 3.8.0 - '@internationalized/message': 3.1.7 - '@internationalized/number': 3.6.1 - '@internationalized/string': 3.2.6 - '@react-aria/ssr': 3.9.8(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/interactions@3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/ssr': 3.9.8(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/flags': 3.1.1 - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/label@3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/landmark@3.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - use-sync-external-store: 1.5.0(react@19.1.0) - - '@react-aria/link@3.8.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/link': 3.6.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/listbox@3.14.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/collections': 3.12.3(react@19.1.0) - '@react-stately/list': 3.12.1(react@19.1.0) - '@react-types/listbox': 3.6.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/live-announcer@3.4.2': - dependencies: - '@swc/helpers': 0.5.17 - - '@react-aria/menu@3.18.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/overlays': 3.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/collections': 3.12.3(react@19.1.0) - '@react-stately/menu': 3.9.3(react@19.1.0) - '@react-stately/selection': 3.20.1(react@19.1.0) - '@react-stately/tree': 3.8.9(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/menu': 3.10.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/meter@3.4.22(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/progress': 3.4.22(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/meter': 3.4.8(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/numberfield@3.11.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/spinbutton': 3.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/textfield': 3.17.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/form': 3.1.3(react@19.1.0) - '@react-stately/numberfield': 3.9.11(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/numberfield': 3.8.10(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/overlays@3.27.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/ssr': 3.9.8(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/visually-hidden': 3.8.22(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/overlays': 3.6.15(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/overlays': 3.8.14(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/progress@3.4.22(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/progress': 3.5.11(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/radio@3.11.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/form': 3.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/radio': 3.10.12(react@19.1.0) - '@react-types/radio': 3.8.8(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/searchfield@3.8.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/textfield': 3.17.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/searchfield': 3.5.11(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/searchfield': 3.6.1(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/select@3.15.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/form': 3.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/listbox': 3.14.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/menu': 3.18.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/visually-hidden': 3.8.22(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/select': 3.6.12(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/select': 3.9.11(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/selection@3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/selection': 3.20.1(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/separator@3.4.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/slider@3.7.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/slider': 3.6.3(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@react-types/slider': 3.7.10(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/spinbutton@3.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/live-announcer': 3.4.2 - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/ssr@3.9.8(react@19.1.0)': - dependencies: - '@swc/helpers': 0.5.17 - react: 19.1.0 - - '@react-aria/switch@3.7.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/toggle': 3.11.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/toggle': 3.8.3(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@react-types/switch': 3.5.10(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/table@3.17.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/grid': 3.13.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/live-announcer': 3.4.2 - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/visually-hidden': 3.8.22(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/collections': 3.12.3(react@19.1.0) - '@react-stately/flags': 3.1.1 - '@react-stately/table': 3.14.1(react@19.1.0) - '@react-types/checkbox': 3.9.3(react@19.1.0) - '@react-types/grid': 3.3.1(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@react-types/table': 3.12.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/tabs@3.10.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/tabs': 3.8.1(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@react-types/tabs': 3.3.14(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/tag@3.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/gridlist': 3.12.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/list': 3.12.1(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/textfield@3.17.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/form': 3.0.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/label': 3.7.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/form': 3.1.3(react@19.1.0) - '@react-stately/utils': 3.10.6(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@react-types/textfield': 3.12.1(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/toast@3.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/landmark': 3.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/toast': 3.1.0(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/toggle@3.11.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/toggle': 3.8.3(react@19.1.0) - '@react-types/checkbox': 3.9.3(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/toolbar@3.0.0-beta.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/focus': 3.20.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/tooltip@3.8.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/tooltip': 3.5.3(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@react-types/tooltip': 3.4.16(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/tree@3.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/gridlist': 3.12.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/selection': 3.24.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/tree': 3.8.9(react@19.1.0) - '@react-types/button': 3.12.0(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/utils@3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/ssr': 3.9.8(react@19.1.0) - '@react-stately/flags': 3.1.1 - '@react-stately/utils': 3.10.6(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - clsx: 2.1.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/virtualizer@4.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/i18n': 3.12.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-stately/virtualizer': 4.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@react-aria/visually-hidden@3.8.22(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@react-aria/interactions': 3.25.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-aria/utils': 3.28.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-types/shared': 3.29.0(react@19.1.0) - '@swc/helpers': 0.5.17 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@prisma/debug': 6.6.0 '@react-spring/animated@9.7.5(react@19.1.0)': dependencies: @@ -10584,6 +9529,14 @@ snapshots: optionalDependencies: rollup: 3.29.5 + '@rollup/plugin-terser@0.4.4(rollup@3.29.5)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.39.0 + optionalDependencies: + rollup: 3.29.5 + '@rollup/pluginutils@5.1.4(rollup@3.29.5)': dependencies: '@types/estree': 1.0.7 @@ -10721,29 +9674,11 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.17': + '@tanstack/query-core@5.74.3': {} + + '@tanstack/react-query@5.74.3(react@19.1.0)': dependencies: - tslib: 2.8.1 - - '@swc/helpers@0.5.2': - dependencies: - tslib: 2.8.1 - - '@tanstack/query-core@4.36.1': {} - - '@tanstack/query-core@5.74.9': {} - - '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/query-core': 4.36.1 - react: 18.3.1 - use-sync-external-store: 1.5.0(react@18.3.1) - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - - '@tanstack/react-query@5.74.11(react@19.1.0)': - dependencies: - '@tanstack/query-core': 5.74.9 + '@tanstack/query-core': 5.74.3 react: 19.1.0 '@trysound/sax@0.2.0': {} @@ -10845,7 +9780,7 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/react-dom@19.1.2(@types/react@19.1.2)': + '@types/react-dom@19.1.3(@types/react@19.1.2)': dependencies: '@types/react': 19.1.2 @@ -11542,7 +10477,7 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001715 + caniuse-lite: 1.0.30001714 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -11550,6 +10485,8 @@ snapshots: caniuse-lite@1.0.30001715: {} + caniuse-lite@1.0.30001716: {} + caseless@0.12.0: {} chalk@2.4.2: @@ -13095,6 +12032,13 @@ snapshots: '@formatjs/icu-messageformat-parser': 2.1.0 tslib: 2.8.1 + intl-messageformat@9.13.0: + dependencies: + '@formatjs/ecma402-abstract': 1.11.4 + '@formatjs/fast-memoize': 1.2.1 + '@formatjs/icu-messageformat-parser': 2.1.0 + tslib: 2.8.1 + ipaddr.js@2.2.0: {} is-array-buffer@3.0.5: @@ -14091,47 +13035,13 @@ snapshots: natural-compare@1.4.0: {} - next-basics@0.36.0(next@13.5.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.3.0(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - bcryptjs: 2.4.3 - jsonwebtoken: 9.0.2 - next: 13.5.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - pure-rand: 6.1.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - next@13.5.11(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 13.5.11 - '@swc/helpers': 0.5.2 - busboy: 1.6.0 - caniuse-lite: 1.0.30001715 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.26.10)(react@18.3.1) - watchpack: 2.4.0 - optionalDependencies: - '@next/swc-darwin-arm64': 13.5.9 - '@next/swc-darwin-x64': 13.5.9 - '@next/swc-linux-arm64-gnu': 13.5.9 - '@next/swc-linux-arm64-musl': 13.5.9 - '@next/swc-linux-x64-gnu': 13.5.9 - '@next/swc-linux-x64-musl': 13.5.9 - '@next/swc-win32-arm64-msvc': 13.5.9 - '@next/swc-win32-ia32-msvc': 13.5.9 - '@next/swc-win32-x64-msvc': 13.5.9 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@15.3.1(@babel/core@7.26.10)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@next/env': 15.3.1 + '@next/env': 15.3.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001715 + caniuse-lite: 1.0.30001714 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -14985,30 +13895,6 @@ snapshots: dependencies: react: 19.1.0 - react-hook-form@7.56.1(react@19.1.0): - dependencies: - react: 19.1.0 - - react-icons@5.5.0(react@19.1.0): - dependencies: - react: 19.1.0 - - react-intl@5.25.1(react@18.3.1)(typescript@4.9.5): - dependencies: - '@formatjs/ecma402-abstract': 1.11.4 - '@formatjs/icu-messageformat-parser': 2.1.0 - '@formatjs/intl': 2.2.1(typescript@4.9.5) - '@formatjs/intl-displaynames': 5.4.3 - '@formatjs/intl-listformat': 6.5.3 - '@types/hoist-non-react-statics': 3.3.6 - '@types/react': 18.3.20 - hoist-non-react-statics: 3.3.2 - intl-messageformat: 9.13.0 - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - typescript: 4.9.5 - react-intl@6.8.9(react@19.1.0)(typescript@5.8.3): dependencies: '@formatjs/ecma402-abstract': 2.2.4 diff --git a/scripts/data-migrations/convert-utm-clid-columns.sql b/scripts/data-migrations/convert-utm-clid-columns.sql new file mode 100644 index 00000000..5a4ac4ca --- /dev/null +++ b/scripts/data-migrations/convert-utm-clid-columns.sql @@ -0,0 +1,48 @@ +----------------------------------------------------- +-- postgreSQL +----------------------------------------------------- +UPDATE "website_event" we +SET fbclid = url.fbclid, + gclid = url.gclid, + li_fat_id = url.li_fat_id, + msclkid = url.msclkid, + ttclid = url.ttclid, + twclid = url.twclid, + utm_campaign = url.utm_campaign, + utm_content = url.utm_content, + utm_medium = url.utm_medium, + utm_source = url.utm_source, + utm_term = url.utm_term +FROM (SELECT event_id, website_id, session_id, + (regexp_matches(url_query, '(?:[&?]|^)fbclid=([^&]+)', 'i'))[1] AS fbclid, + (regexp_matches(url_query, '(?:[&?]|^)gclid=([^&]+)', 'i'))[1] AS gclid, + (regexp_matches(url_query, '(?:[&?]|^)li_fat_id=([^&]+)', 'i'))[1] AS li_fat_id, + (regexp_matches(url_query, '(?:[&?]|^)msclkid=([^&]+)', 'i'))[1] AS msclkid, + (regexp_matches(url_query, '(?:[&?]|^)ttclid=([^&]+)', 'i'))[1] AS ttclid, + (regexp_matches(url_query, '(?:[&?]|^)twclid=([^&]+)', 'i'))[1] AS twclid, + (regexp_matches(url_query, '(?:[&?]|^)utm_campaign=([^&]+)', 'i'))[1] AS utm_campaign, + (regexp_matches(url_query, '(?:[&?]|^)utm_content=([^&]+)', 'i'))[1] AS utm_content, + (regexp_matches(url_query, '(?:[&?]|^)utm_medium=([^&]+)', 'i'))[1] AS utm_medium, + (regexp_matches(url_query, '(?:[&?]|^)utm_source=([^&]+)', 'i'))[1] AS utm_source, + (regexp_matches(url_query, '(?:[&?]|^)utm_term=([^&]+)', 'i'))[1] AS utm_term + FROM "website_event") url +WHERE we.event_id = url.event_id + and we.session_id = url.session_id + and we.website_id = url.website_id; + +----------------------------------------------------- +-- mySQL +----------------------------------------------------- +UPDATE `website_event` +SET fbclid = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)fbclid=[^&]+'), '=', -1), '&', 1), + gclid = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)gclid=[^&]+'), '=', -1), '&', 1), + li_fat_id = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)li_fat_id=[^&]+'), '=', -1), '&', 1), + msclkid = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)msclkid=[^&]+'), '=', -1), '&', 1), + ttclid = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)ttclid=[^&]+'), '=', -1), '&', 1), + twclid = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)twclid=[^&]+'), '=', -1), '&', 1), + utm_campaign = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)utm_campaign=[^&]+'), '=', -1), '&', 1), + utm_content = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)utm_content=[^&]+'), '=', -1), '&', 1), + utm_medium = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)utm_medium=[^&]+'), '=', -1), '&', 1), + utm_source = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)utm_source=[^&]+'), '=', -1), '&', 1), + utm_term = SUBSTRING_INDEX(SUBSTRING_INDEX(REGEXP_SUBSTR(url_query, '(?:[&?]|^)utm_term=[^&]+'), '=', -1), '&', 1) +WHERE 1 = 1; \ No newline at end of file diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx index 65ef00d7..84a722ac 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx @@ -14,7 +14,7 @@ export function SessionsDataTable({ const queryResult = useWebsiteSessionsQuery(websiteId); return ( - children}> + children}> {({ data }) => } ); diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx index ddb4318d..c1c5d45a 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx @@ -17,6 +17,11 @@ export function SessionInfo({ data }) { + + + {data?.distinctId} + + {formatTimezoneDate(data?.lastAt, 'PPPPpp')} diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts index 582b05ff..b35a67b7 100644 --- a/src/app/api/send/route.ts +++ b/src/app/api/send/route.ts @@ -121,6 +121,7 @@ export async function POST(request: Request) { country, region, city, + distinctId: id, }); } catch (e: any) { if (!e.message.toLowerCase().includes('unique constraint')) { @@ -144,7 +145,7 @@ export async function POST(request: Request) { const base = hostname ? `https://${hostname}` : 'https://localhost'; const currentUrl = new URL(url, base); - let urlPath = currentUrl.pathname; + let urlPath = currentUrl.pathname === '/undefined' ? '' : currentUrl.pathname; const urlQuery = currentUrl.search.substring(1); const urlDomain = currentUrl.hostname.replace(/^www./, ''); @@ -215,6 +216,7 @@ export async function POST(request: Request) { region, city, tag, + distinctId: id, createdAt, }); } @@ -228,6 +230,7 @@ export async function POST(request: Request) { websiteId, sessionId, sessionData: data, + distinctId: id, createdAt, }); } diff --git a/src/components/messages.ts b/src/components/messages.ts index 666b4353..f9ddd24a 100644 --- a/src/components/messages.ts +++ b/src/components/messages.ts @@ -132,6 +132,7 @@ export const labels = defineMessages({ all: { id: 'label.all', defaultMessage: 'All' }, session: { id: 'label.session', defaultMessage: 'Session' }, sessions: { id: 'label.sessions', defaultMessage: 'Sessions' }, + distinctId: { id: 'label.distinct-id', defaultMessage: 'Distinct ID' }, pageNotFound: { id: 'message.page-not-found', defaultMessage: 'Page not found' }, activity: { id: 'label.activity', defaultMessage: 'Activity' }, dismiss: { id: 'label.dismiss', defaultMessage: 'Dismiss' }, diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 5c1ceab3..c6b9ad4b 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -33,17 +33,7 @@ export const FILTER_REFERRERS = 'filter-referrers'; export const FILTER_PAGES = 'filter-pages'; export const UNIT_TYPES = ['year', 'month', 'hour', 'day', 'minute']; -export const EVENT_COLUMNS = [ - 'url', - 'entry', - 'exit', - 'referrer', - 'title', - 'query', - 'event', - 'tag', - 'region', -]; +export const EVENT_COLUMNS = ['url', 'entry', 'exit', 'referrer', 'title', 'query', 'event', 'tag']; export const SESSION_COLUMNS = [ 'browser', @@ -53,6 +43,7 @@ export const SESSION_COLUMNS = [ 'language', 'country', 'city', + 'region', 'host', ]; diff --git a/src/queries/sql/events/saveEvent.ts b/src/queries/sql/events/saveEvent.ts index a61f665d..e9b73635 100644 --- a/src/queries/sql/events/saveEvent.ts +++ b/src/queries/sql/events/saveEvent.ts @@ -39,6 +39,7 @@ export async function saveEvent(args: { region?: string; city?: string; tag?: string; + distinctId?: string; createdAt?: Date; }) { return runQuery({ @@ -182,6 +183,7 @@ async function clickhouseQuery(data: { region?: string; city?: string; tag?: string; + distinctId?: string; createdAt?: Date; }) { const { @@ -211,6 +213,7 @@ async function clickhouseQuery(data: { region, city, tag, + distinctId, createdAt, ...args } = data; @@ -247,6 +250,7 @@ async function clickhouseQuery(data: { event_type: eventName ? EVENT_TYPE.customEvent : EVENT_TYPE.pageView, event_name: eventName ? eventName?.substring(0, EVENT_NAME_LENGTH) : null, tag: tag, + distinct_id: distinctId, created_at: getUTCString(createdAt), }; diff --git a/src/queries/sql/sessions/createSession.ts b/src/queries/sql/sessions/createSession.ts index 745adcc4..9d1402b1 100644 --- a/src/queries/sql/sessions/createSession.ts +++ b/src/queries/sql/sessions/createSession.ts @@ -2,7 +2,19 @@ import { Prisma } from '@prisma/client'; import prisma from '@/lib/prisma'; export async function createSession(data: Prisma.SessionCreateInput) { - const { id, websiteId, browser, os, device, screen, language, country, region, city } = data; + const { + id, + websiteId, + browser, + os, + device, + screen, + language, + country, + region, + city, + distinctId, + } = data; return prisma.client.session.create({ data: { @@ -16,6 +28,7 @@ export async function createSession(data: Prisma.SessionCreateInput) { country, region, city, + distinctId, }, }); } diff --git a/src/queries/sql/sessions/getWebsiteSession.ts b/src/queries/sql/sessions/getWebsiteSession.ts index d53ea3e5..97850a2c 100644 --- a/src/queries/sql/sessions/getWebsiteSession.ts +++ b/src/queries/sql/sessions/getWebsiteSession.ts @@ -15,6 +15,7 @@ async function relationalQuery(websiteId: string, sessionId: string) { return rawQuery( ` select id, + distinct_id as "distinctId", website_id as "websiteId", hostname, browser, @@ -33,6 +34,7 @@ async function relationalQuery(websiteId: string, sessionId: string) { sum(${getTimestampDiffSQL('min_time', 'max_time')}) as "totaltime" from (select session.session_id as id, + session.distinct_id, website_event.visit_id, session.website_id, website_event.hostname, @@ -52,8 +54,8 @@ async function relationalQuery(websiteId: string, sessionId: string) { join website_event on website_event.session_id = session.session_id where session.website_id = {{websiteId::uuid}} and session.session_id = {{sessionId::uuid}} - group by session.session_id, visit_id, session.website_id, website_event.hostname, session.browser, session.os, session.device, session.screen, session.language, session.country, session.region, session.city) t - group by id, website_id, hostname, browser, os, device, screen, language, country, region, city; + group by session.session_id, session.distinct_id, visit_id, session.website_id, website_event.hostname, session.browser, session.os, session.device, session.screen, session.language, session.country, session.region, session.city) t + group by id, distinct_id, website_id, hostname, browser, os, device, screen, language, country, region, city; `, { websiteId, sessionId }, ).then(result => result?.[0]); @@ -66,6 +68,7 @@ async function clickhouseQuery(websiteId: string, sessionId: string) { ` select id, websiteId, + distinctId, hostname, browser, os, @@ -83,6 +86,7 @@ async function clickhouseQuery(websiteId: string, sessionId: string) { sum(max_time-min_time) as totaltime from (select session_id as id, + distinct_id as distinctId, visit_id, website_id as websiteId, hostname, @@ -101,8 +105,8 @@ async function clickhouseQuery(websiteId: string, sessionId: string) { from website_event_stats_hourly where website_id = {websiteId:UUID} and session_id = {sessionId:UUID} - group by session_id, visit_id, website_id, hostname, browser, os, device, screen, language, country, region, city) t - group by id, websiteId, hostname, browser, os, device, screen, language, country, region, city; + group by session_id, distinct_id, visit_id, website_id, hostname, browser, os, device, screen, language, country, region, city) t + group by id, websiteId, distinctId, hostname, browser, os, device, screen, language, country, region, city; `, { websiteId, sessionId }, ).then(result => result?.[0]); diff --git a/src/queries/sql/sessions/getWebsiteSessions.ts b/src/queries/sql/sessions/getWebsiteSessions.ts index ca11700b..ff702537 100644 --- a/src/queries/sql/sessions/getWebsiteSessions.ts +++ b/src/queries/sql/sessions/getWebsiteSessions.ts @@ -1,5 +1,5 @@ import clickhouse from '@/lib/clickhouse'; -import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import { CLICKHOUSE, getDatabaseType, POSTGRESQL, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; import { PageParams, QueryFilters } from '@/lib/types'; @@ -14,10 +14,14 @@ export async function getWebsiteSessions( async function relationalQuery(websiteId: string, filters: QueryFilters, pageParams: PageParams) { const { pagedRawQuery, parseFilters } = prisma; + const { search } = pageParams; const { filterQuery, params } = await parseFilters(websiteId, { ...filters, }); + const db = getDatabaseType(); + const like = db === POSTGRESQL ? 'ilike' : 'like'; + return pagedRawQuery( ` with sessions as ( @@ -43,6 +47,15 @@ async function relationalQuery(websiteId: string, filters: QueryFilters, pagePar where website_event.website_id = {{websiteId::uuid}} and website_event.created_at between {{startDate}} and {{endDate}} ${filterQuery} + ${ + search + ? `and (distinct_id ${like} {{search}} + or city ${like} {{search}} + or browser ${like} {{search}} + or os ${like} {{search}} + or device ${like} {{search}})` + : '' + } group by session.session_id, session.website_id, website_event.hostname, @@ -58,7 +71,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters, pagePar limit 1000) select * from sessions `, - params, + { ...params, search: `%${search}%` }, pageParams, ); } @@ -66,6 +79,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters, pagePar async function clickhouseQuery(websiteId: string, filters: QueryFilters, pageParams?: PageParams) { const { pagedQuery, parseFilters, getDateStringSQL } = clickhouse; const { params, dateQuery, filterQuery } = await parseFilters(websiteId, filters); + const { search } = pageParams; return pagedQuery( ` @@ -91,12 +105,21 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters, pagePar where website_id = {websiteId:UUID} ${dateQuery} ${filterQuery} + ${ + search + ? `and ((positionCaseInsensitive(distinct_id, {search:String}) > 0) + or (positionCaseInsensitive(city, {search:String}) > 0) + or (positionCaseInsensitive(browser, {search:String}) > 0) + or (positionCaseInsensitive(os, {search:String}) > 0) + or (positionCaseInsensitive(device, {search:String}) > 0))` + : '' + } group by session_id, website_id, hostname, browser, os, device, screen, language, country, region, city order by lastAt desc limit 1000) select * from sessions `, - params, + { ...params, search }, pageParams, ); } diff --git a/src/queries/sql/sessions/saveSessionData.ts b/src/queries/sql/sessions/saveSessionData.ts index a060e9a8..46ad3cf6 100644 --- a/src/queries/sql/sessions/saveSessionData.ts +++ b/src/queries/sql/sessions/saveSessionData.ts @@ -11,6 +11,7 @@ export async function saveSessionData(data: { websiteId: string; sessionId: string; sessionData: DynamicData; + distinctId?: string; createdAt?: Date; }) { return runQuery({ @@ -23,10 +24,11 @@ export async function relationalQuery(data: { websiteId: string; sessionId: string; sessionData: DynamicData; + distinctId?: string; createdAt?: Date; }) { const { client } = prisma; - const { websiteId, sessionId, sessionData, createdAt } = data; + const { websiteId, sessionId, sessionData, distinctId, createdAt } = data; const jsonKeys = flattenJSON(sessionData); @@ -39,6 +41,7 @@ export async function relationalQuery(data: { numberValue: a.dataType === DATA_TYPE.number ? a.value : null, dateValue: a.dataType === DATA_TYPE.date ? new Date(a.value) : null, dataType: a.dataType, + distinctId, createdAt, })); @@ -80,9 +83,10 @@ async function clickhouseQuery(data: { websiteId: string; sessionId: string; sessionData: DynamicData; + distinctId?: string; createdAt?: Date; }) { - const { websiteId, sessionId, sessionData, createdAt } = data; + const { websiteId, sessionId, sessionData, distinctId, createdAt } = data; const { insert, getUTCString } = clickhouse; const { sendMessage } = kafka; @@ -98,6 +102,7 @@ async function clickhouseQuery(data: { string_value: getStringValue(value, dataType), number_value: dataType === DATA_TYPE.number ? value : null, date_value: dataType === DATA_TYPE.date ? getUTCString(value) : null, + distinct_id: distinctId, created_at: getUTCString(createdAt), }; });