From 46388f8b41a644d84199343793189dfcacde7d5d Mon Sep 17 00:00:00 2001 From: Maxime-J Date: Sat, 15 Nov 2025 15:32:06 +0100 Subject: [PATCH 01/45] Include prisma engine in Docker image --- Dockerfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 39887e46..32300687 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,10 +42,7 @@ RUN set -x \ && apk add --no-cache curl # Script dependencies -RUN pnpm add npm-run-all dotenv chalk semver prisma@6.18.0 @prisma/adapter-pg@6.18.0 - -# Permissions for prisma -RUN chown -R nextjs:nodejs node_modules/.pnpm/ +RUN pnpm --allow-build='@prisma/engines' add npm-run-all dotenv chalk semver prisma@6.18.0 @prisma/adapter-pg@6.18.0 COPY --from=builder --chown=nextjs:nodejs /app/public ./public COPY --from=builder /app/prisma ./prisma From e6586c60b19e46f4f397841382f049389406e12e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:44:11 +0000 Subject: [PATCH 02/45] Bump js-yaml from 3.14.1 to 3.14.2 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.1 to 3.14.2. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 3.14.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ca04cd9..86b5e4c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -364,8 +364,6 @@ importers: specifier: ^5.9.3 version: 5.9.3 - dist: {} - packages: '@ampproject/remapping@2.3.0': From af958b64625848513c7e7eb674e2264fa8afda55 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Thu, 20 Nov 2025 11:24:59 -0800 Subject: [PATCH 03/45] fix DateDistance null logic --- src/components/common/DateDistance.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/common/DateDistance.tsx b/src/components/common/DateDistance.tsx index 65bec387..e8bd2784 100644 --- a/src/components/common/DateDistance.tsx +++ b/src/components/common/DateDistance.tsx @@ -7,7 +7,7 @@ export function DateDistance({ date }: { date: Date }) { const { formatTimezoneDate } = useTimezone(); const { dateLocale } = useLocale(); - if (!isInvalidDate(date)) { + if (isInvalidDate(date)) { return null; } From 15fda927ce22b559059f043fcec785c1ec87cb24 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 20 Nov 2025 20:56:16 -0800 Subject: [PATCH 04/45] Switched to biome. --- .eslintignore | 1 - .eslintrc.json | 51 -- .prettierignore | 2 - .prettierrc.json | 7 - biome.json | 52 ++ next.config.ts | 2 +- package.json | 31 +- pnpm-lock.yaml | 1193 ++++------------------------------------- src/lib/clickhouse.ts | 4 +- src/lib/request.ts | 4 +- src/lib/storage.ts | 4 +- 11 files changed, 184 insertions(+), 1167 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.json delete mode 100644 .prettierignore delete mode 100644 .prettierrc.json create mode 100644 biome.json diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index e4163d65..00000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -/src/generated/ diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index d0f2ba18..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "env": { - "browser": true, - "es2020": true, - "node": true, - "jquery": true, - "jest": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": 11, - "sourceType": "module" - }, - "extends": [ - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "eslint:recommended", - "plugin:prettier/recommended", - "plugin:import/errors", - "plugin:import/typescript", - "plugin:css-modules/recommended", - "plugin:cypress/recommended", - "prettier", - "next" - ], - "plugins": ["@typescript-eslint", "prettier", "promise", "css-modules", "cypress"], - "rules": { - "no-console": "error", - "react/display-name": "off", - "react-hooks/exhaustive-deps": "off", - "react/react-in-jsx-scope": "off", - "react/prop-types": "off", - "import/no-anonymous-default-export": "off", - "import/no-named-as-default": "off", - "css-modules/no-unused-class": "off", - "@next/next/no-img-element": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/no-unused-vars": ["error", { "ignoreRestSiblings": true }], - "@typescript-eslint/no-namespace": ["error", { "allowDeclarations": true }], - "@typescript-eslint/triple-slash-reference": "off" - }, - "globals": { - "React": "writable" - } -} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 1922c864..00000000 --- a/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -/public/script.js -/src/generated/ diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 1193784d..00000000 --- a/.prettierrc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "arrowParens": "avoid", - "endOfLine": "lf", - "printWidth": 100, - "singleQuote": true, - "trailingComma": "all" -} diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..847b1dc0 --- /dev/null +++ b/biome.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.6/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "includes": ["**", "!!**/dist"] + }, + "formatter": { + "enabled": true, + "lineWidth": 100, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "a11y": "off", + "correctness": { + "useExhaustiveDependencies": "off" + }, + "style": { + "noDescendingSpecificity": "off" + }, + "suspicious": { + "noExplicitAny": "off" + }, + "performance": { + "noImgElement": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "trailingCommas": "all", + "arrowParentheses": "asNeeded" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/next.config.ts b/next.config.ts index b2b1c18d..99dcca0d 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,5 +1,5 @@ import 'dotenv/config'; -import pkg from './package.json' assert { type: 'json' }; +import pkg from './package.json' with { type: 'json' }; const TRACKER_SCRIPT = '/script.js'; diff --git a/package.json b/package.json index fd31320e..bff7d758 100644 --- a/package.json +++ b/package.json @@ -42,24 +42,18 @@ "download-country-names": "node scripts/download-country-names.js", "download-language-names": "node scripts/download-language-names.js", "change-password": "node scripts/change-password.js", - "lint": "next lint --quiet", "prepare": "node -e \"if (process.env.NODE_ENV !== 'production'){process.exit(1)} \" || husky install", "postbuild": "node scripts/postbuild.js", "test": "jest", "cypress-open": "cypress open cypress run", - "cypress-run": "cypress run cypress run" + "cypress-run": "cypress run cypress run", + "lint": "biome lint .", + "format": "biome format --write .", + "check": "biome check --apply" }, "lint-staged": { - "**/*.{js,jsx,ts,tsx}": [ - "prettier --write", - "eslint" - ], - "**/*.css": [ - "stylelint --fix", - "prettier --write" - ], - "**/*.json": [ - "prettier --write" + "**/*.{js,jsx,ts,tsx,json,css}": [ + "npm run format" ] }, "cacheDirectories": [ @@ -78,7 +72,7 @@ "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", "@tanstack/react-query": "^5.90.5", - "@umami/react-zen": "^0.207.0", + "@umami/react-zen": "^0.208.0", "@umami/redis-client": "^0.29.0", "bcryptjs": "^3.0.2", "chalk": "^5.6.2", @@ -132,6 +126,7 @@ "zustand": "^5.0.8" }, "devDependencies": { + "@biomejs/biome": "^2.3.6", "@formatjs/cli": "^4.2.29", "@netlify/plugin-nextjs": "^5.14.4", "@rollup/plugin-alias": "^5.0.0", @@ -151,15 +146,6 @@ "babel-plugin-react-compiler": "19.1.0-rc.2", "cross-env": "^10.1.0", "cypress": "^13.6.6", - "eslint": "^8.33.0", - "eslint-config-next": "^14.2.33", - "eslint-config-prettier": "^10.1.8", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-css-modules": "^2.12.0", - "eslint-plugin-cypress": "^2.15.1", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-prettier": "^5.5.3", "extract-react-intl-messages": "^4.1.1", "husky": "^9.1.7", "jest": "^29.7.0", @@ -168,7 +154,6 @@ "postcss-flexbugs-fixes": "^5.0.2", "postcss-import": "^15.1.0", "postcss-preset-env": "7.8.3", - "prettier": "^3.6.2", "prompts": "2.4.2", "rollup": "^4.52.5", "rollup-plugin-copy": "^3.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4d0c432..bb72c418 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,8 +45,8 @@ importers: specifier: ^5.90.5 version: 5.90.5(react@19.2.0) '@umami/react-zen': - specifier: ^0.207.0 - version: 0.207.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + specifier: ^0.208.0 + version: 0.208.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) '@umami/redis-client': specifier: ^0.29.0 version: 0.29.0 @@ -201,6 +201,9 @@ importers: specifier: ^5.0.8 version: 5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) devDependencies: + '@biomejs/biome': + specifier: ^2.3.6 + version: 2.3.6 '@formatjs/cli': specifier: ^4.2.29 version: 4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)) @@ -258,33 +261,6 @@ importers: cypress: specifier: ^13.6.6 version: 13.17.0 - eslint: - specifier: ^8.33.0 - version: 8.57.1 - eslint-config-next: - specifier: ^14.2.33 - version: 14.2.33(eslint@8.57.1)(typescript@5.9.3) - eslint-config-prettier: - specifier: ^10.1.8 - version: 10.1.8(eslint@8.57.1) - eslint-import-resolver-alias: - specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.32.0) - eslint-plugin-css-modules: - specifier: ^2.12.0 - version: 2.12.0(eslint@8.57.1) - eslint-plugin-cypress: - specifier: ^2.15.1 - version: 2.15.2(eslint@8.57.1) - eslint-plugin-import: - specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - eslint-plugin-jest: - specifier: ^27.9.0 - version: 27.9.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3) - eslint-plugin-prettier: - specifier: ^5.5.3 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) extract-react-intl-messages: specifier: ^4.1.1 version: 4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)) @@ -309,9 +285,6 @@ importers: postcss-preset-env: specifier: 7.8.3 version: 7.8.3(postcss@8.5.6) - prettier: - specifier: ^3.6.2 - version: 3.6.2 prompts: specifier: 2.4.2 version: 2.4.2 @@ -541,6 +514,59 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@biomejs/biome@2.3.6': + resolution: {integrity: sha512-oqUhWyU6tae0MFsr/7iLe++QWRg+6jtUhlx9/0GmCWDYFFrK366sBLamNM7D9Y+c7YSynUFKr8lpEp1r6Sk7eA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.3.6': + resolution: {integrity: sha512-P4JWE5d8UayBxYe197QJwyW4ZHp0B+zvRIGCusOm1WbxmlhpAQA1zEqQuunHgSIzvyEEp4TVxiKGXNFZPg7r9Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.3.6': + resolution: {integrity: sha512-I4rTebj+F/L9K93IU7yTFs8nQ6EhaCOivxduRha4w4WEZK80yoZ8OAdR1F33m4yJ/NfUuTUbP/Wjs+vKjlCoWA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.3.6': + resolution: {integrity: sha512-oK1NpIXIixbJ/4Tcx40cwiieqah6rRUtMGOHDeK2ToT7yUFVEvXUGRKqH0O4hqZ9tW8TcXNZKfgRH6xrsjVtGg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.3.6': + resolution: {integrity: sha512-JjYy83eVBnvuINZiqyFO7xx72v8Srh4hsgaacSBCjC22DwM6+ZvnX1/fj8/SBiLuUOfZ8YhU2pfq2Dzakeyg1A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.3.6': + resolution: {integrity: sha512-QvxB8GHQeaO4FCtwJpJjCgJkbHBbWxRHUxQlod+xeaYE6gtJdSkYkuxdKAQUZEOIsec+PeaDAhW9xjzYbwmOFA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.3.6': + resolution: {integrity: sha512-ZjPXzy5yN9wusIoX+8Zp4p6cL8r0NzJCXg/4r1KLVveIPXd2jKVlqZ6ZyzEq385WwU3OX5KOwQYLQsOc788waQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.3.6': + resolution: {integrity: sha512-YM7hLHpwjdt8R7+O2zS1Vo2cKgqEeptiXB1tWW1rgjN5LlpZovBVKtg7zfwfRrFx3i08aNZThYpTcowpTlczug==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.3.6': + resolution: {integrity: sha512-psgNEYgMAobY5h+QHRBVR9xvg2KocFuBKm6axZWB/aD12NWhQjiVFQUjV6wMXhlH4iT0Q9c3yK5JFRiDC/rzHA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@clickhouse/client-common@1.12.1': resolution: {integrity: sha512-ccw1N6hB4+MyaAHIaWBwGZ6O2GgMlO99FlMj0B0UEGfjxM9v5dYVYql6FpP19rMwrVAroYs/IgX2vyZEBvzQLg==} @@ -869,20 +895,11 @@ packages: peerDependencies: '@dicebear/core': ^9.0.0 - '@emnapi/core@1.4.5': - resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/runtime@1.5.0': resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/runtime@1.7.0': - resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==} - - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -1559,9 +1576,6 @@ packages: '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@netlify/plugin-nextjs@5.14.4': resolution: {integrity: sha512-HnMHG0tksVoS2E6ImcX9o/EcVH1dckb8ZL1FyghKRsEPYCo+20hQ6zncd5EEOW7K22UN+n1EprCROWUmsbhYMg==} engines: {node: '>=18.0.0'} @@ -1572,9 +1586,6 @@ packages: '@next/env@15.5.6': resolution: {integrity: sha512-3qBGRW+sCGzgbpc5TS1a0p7eNxnOarGVQhZxfvTdnV0gFI61lX7QNtQ4V1TSREctXzYn5NetbUsLvyqwLFJM6Q==} - '@next/eslint-plugin-next@14.2.33': - resolution: {integrity: sha512-DQTJFSvlB+9JilwqMKJ3VPByBNGxAGFTfJ7BuFj25cVcbBy7jm88KfUN+dngM4D3+UxZ8ER2ft+WH9JccMvxyg==} - '@next/swc-darwin-arm64@15.5.3': resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} engines: {node: '>= 10'} @@ -1683,18 +1694,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@prisma/adapter-pg@6.18.0': resolution: {integrity: sha512-eBtBOL1z2Sh0Rc2hwa4dmwoNeFs5T69tsA62AkhBvnzNfTcr/YfLeJae/wjNmvRttYDPmdiuhqZCRPNY1+8fOA==} @@ -2591,12 +2594,6 @@ packages: cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@rushstack/eslint-patch@1.12.0': - resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -2731,9 +2728,6 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2788,9 +2782,6 @@ packages: resolution: {integrity: sha512-PEHY3ohqolHqAzDyB1+31tFaAMnoLN7x/JgdcGmNZ2uvtEJ6rlFCUYNQc0Xe754xxCYLNGZbLUGydSE6tS4S9A==} deprecated: This is a stub types definition. json-stable-stringify provides its own type definitions, so you do not need this installed. - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/minimatch@6.0.0': resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. @@ -2825,9 +2816,6 @@ packages: resolution: {integrity: sha512-454hrj5gz/FXcUE20ygfEiN4DxZ1sprUo0V1gqIqkNZ/CzoEzAZEll2uxMsuyz6BYjiQan4Aa65xbTemfzW9hQ==} deprecated: This is a stub types definition. schema-utils provides its own type definitions, so you do not need this installed. - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@types/sinonjs__fake-timers@8.1.1': resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} @@ -2870,10 +2858,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@8.46.2': resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2891,35 +2875,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@8.46.2': resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.46.2': resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@8.46.2': resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2927,16 +2892,12 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@8.46.2': resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@umami/react-zen@0.207.0': - resolution: {integrity: sha512-TUllF5mKQ+IBepIgT0xvJo/bGBEdPDfGiATyjuuxe2/SwO3LDINbmPUSFpWrjxtUaigiEI0JaQsklSLkirEKPg==} + '@umami/react-zen@0.208.0': + resolution: {integrity: sha512-r04tOJzwMSQj/De27csFZw70EDWq4avEo3bgUnJYc+Hpeunmy/avWRifgFCzdMwqumcf6xPOeEnfHoUdhMsHQQ==} '@umami/redis-client@0.29.0': resolution: {integrity: sha512-Jaqh++jskqDB7ny75pfC02OvKp1JTS4asGDsFrRL3qy8sxL3PAl9+/mybCJe4/6vWrXDJKqpgkSfUDJq2bFjyw==} @@ -2944,101 +2905,6 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} - cpu: [arm64] - os: [darwin] - - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} - cpu: [x64] - os: [darwin] - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} - cpu: [ppc64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} - cpu: [s390x] - os: [linux] - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} - cpu: [arm64] - os: [win32] - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} - cpu: [x64] - os: [win32] - '@vue/compiler-core@3.5.18': resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} @@ -3152,10 +3018,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -3164,34 +3026,10 @@ packages: resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} engines: {node: '>=0.10.0'} - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -3207,9 +3045,6 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -3245,14 +3080,6 @@ packages: aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} - engines: {node: '>=4'} - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3407,8 +3234,8 @@ packages: caniuse-lite@1.0.30001741: resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} - caniuse-lite@1.0.30001754: - resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + caniuse-lite@1.0.30001756: + resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -3781,9 +3608,6 @@ packages: d3-zoom@2.0.0: resolution: {integrity: sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==} - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} @@ -3931,10 +3755,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -4042,10 +3862,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -4054,10 +3870,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} @@ -4083,140 +3895,12 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@14.2.33: - resolution: {integrity: sha512-e2W+waB+I5KuoALAtKZl3WVDU4Q1MS6gF/gdcwHh0WOAkHf4TZI6dPjd25wKhlZFAsFrVKy24Z7/IwOhn8dHBw==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-import-resolver-alias@1.1.2: - resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} - engines: {node: '>= 4'} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.10.1: - resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-css-modules@2.12.0: - resolution: {integrity: sha512-ruFBdad69ABrbCDCh5mXj7UzNmrvytfzPACjyvZWIAjFZAG8BXpYSbqmE8gU5wF+pIzV3jU2CWhLvfekXT/IgQ==} - engines: {node: '>=4.0.0'} - peerDependencies: - eslint: '>=2.0.0' - - eslint-plugin-cypress@2.15.2: - resolution: {integrity: sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==} - peerDependencies: - eslint: '>= 3.2.1' - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jest@27.9.0: - resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-prettier@5.5.4: - resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - eslint-plugin-promise@6.6.0: resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: - resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4252,10 +3936,6 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -4330,9 +4010,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -4513,9 +4190,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - getos@3.2.1: resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} @@ -4534,15 +4208,14 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -4587,11 +4260,6 @@ packages: globjoin@0.1.4: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - gonzales-pe@4.3.0: - resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} - engines: {node: '>=0.6.0'} - hasBin: true - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -4797,9 +4465,6 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} - is-bun-module@2.0.0: - resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -5005,14 +4670,6 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -5224,10 +4881,6 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -5250,10 +4903,6 @@ packages: resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} engines: {'0': node >=0.6.0} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -5284,13 +4933,6 @@ packages: known-css-properties@0.36.0: resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - lazy-ass@1.6.0: resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} engines: {node: '> 0.8'} @@ -5619,11 +5261,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.3.3: - resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5748,22 +5385,6 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} @@ -6438,20 +6059,11 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} - hasBin: true - pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -6554,8 +6166,8 @@ packages: peerDependencies: react: '>=16.13.1' - react-hook-form@7.66.0: - resolution: {integrity: sha512-xXBqsWGKrY46ZqaHDo+ZUYiMUgi8suYu5kdrS20EG8KiL7VRQitEbNjm+UcrDYrNi1YLyfpmAeGjCZYXLT9YBw==} + react-hook-form@7.66.1: + resolution: {integrity: sha512-2KnjpgG2Rhbi+CIiIBQQ9Df6sMGH5ExNyFl4Hw9qO7pIqMBR8Bvu9RQyjl3JM4vehzCh9soiNUM/xYMswb2EiA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -6706,9 +6318,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -6718,10 +6327,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -6986,9 +6591,6 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' @@ -7028,21 +6630,10 @@ packages: resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} engines: {node: '>=20'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - string.prototype.padend@3.1.6: resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} engines: {node: '>= 0.4'} - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -7185,10 +6776,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} - engines: {node: ^14.18.0 || >=16.0.0} - table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} @@ -7333,12 +6920,6 @@ packages: '@swc/wasm': optional: true - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -7361,12 +6942,6 @@ packages: typescript: optional: true - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -7472,9 +7047,6 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -7888,6 +7460,41 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@biomejs/biome@2.3.6': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.3.6 + '@biomejs/cli-darwin-x64': 2.3.6 + '@biomejs/cli-linux-arm64': 2.3.6 + '@biomejs/cli-linux-arm64-musl': 2.3.6 + '@biomejs/cli-linux-x64': 2.3.6 + '@biomejs/cli-linux-x64-musl': 2.3.6 + '@biomejs/cli-win32-arm64': 2.3.6 + '@biomejs/cli-win32-x64': 2.3.6 + + '@biomejs/cli-darwin-arm64@2.3.6': + optional: true + + '@biomejs/cli-darwin-x64@2.3.6': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.3.6': + optional: true + + '@biomejs/cli-linux-arm64@2.3.6': + optional: true + + '@biomejs/cli-linux-x64-musl@2.3.6': + optional: true + + '@biomejs/cli-linux-x64@2.3.6': + optional: true + + '@biomejs/cli-win32-arm64@2.3.6': + optional: true + + '@biomejs/cli-win32-x64@2.3.6': + optional: true + '@clickhouse/client-common@1.12.1': {} '@clickhouse/client@1.12.1': @@ -8182,28 +7789,12 @@ snapshots: dependencies: '@dicebear/core': 9.2.4 - '@emnapi/core@1.4.5': - dependencies: - '@emnapi/wasi-threads': 1.0.4 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.4.5': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.0.4': + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true @@ -8616,7 +8207,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.7.0 + '@emnapi/runtime': 1.7.1 optional: true '@img/sharp-win32-arm64@0.34.3': @@ -8894,23 +8485,12 @@ snapshots: '@kurkle/color@0.3.4': {} - '@napi-rs/wasm-runtime@0.2.12': - dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 - '@tybys/wasm-util': 0.10.0 - optional: true - '@netlify/plugin-nextjs@5.14.4': {} '@next/env@15.5.3': {} '@next/env@15.5.6': {} - '@next/eslint-plugin-next@14.2.33': - dependencies: - glob: 10.3.10 - '@next/swc-darwin-arm64@15.5.3': optional: true @@ -8971,13 +8551,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nolyfill/is-core-module@1.0.39': {} - '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': {} - '@prisma/adapter-pg@6.18.0': dependencies: '@prisma/driver-adapter-utils': 6.18.0 @@ -10289,10 +9865,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true - '@rtsao/scc@1.1.0': {} - - '@rushstack/eslint-patch@1.12.0': {} - '@sinclair/typebox@0.27.8': {} '@sinclair/typebox@0.34.40': {} @@ -10435,11 +10007,6 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@tybys/wasm-util@0.10.0': - dependencies: - tslib: 2.8.1 - optional: true - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.3 @@ -10508,8 +10075,6 @@ snapshots: dependencies: json-stable-stringify: 1.3.0 - '@types/json5@0.0.29': {} - '@types/minimatch@6.0.0': dependencies: minimatch: 10.0.3 @@ -10542,8 +10107,6 @@ snapshots: dependencies: schema-utils: 2.7.1 - '@types/semver@7.7.0': {} - '@types/sinonjs__fake-timers@8.1.1': {} '@types/sizzle@2.3.9': {} @@ -10601,11 +10164,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@8.46.2': dependencies: '@typescript-eslint/types': 8.46.2 @@ -10627,24 +10185,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@8.46.2': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.3(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.3 - tsutils: 3.21.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) @@ -10661,21 +10203,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.0 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) - eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@8.46.2(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) @@ -10687,31 +10214,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.46.2': dependencies: '@typescript-eslint/types': 8.46.2 eslint-visitor-keys: 4.2.1 - '@umami/react-zen@0.207.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': + '@umami/react-zen@0.208.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 '@internationalized/date': 3.10.0 '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-spring/web': 9.7.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) classnames: 2.5.1 - glob: 10.4.5 + glob: 10.5.0 highlight.js: 11.11.1 lucide-react: 0.511.0(react@19.2.0) next: 15.5.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-aria-components: 1.13.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react-dom: 19.2.0(react@19.2.0) - react-hook-form: 7.66.0(react@19.2.0) + react-hook-form: 7.66.1(react@19.2.0) react-icons: 5.5.0(react@19.2.0) thenby: 1.3.4 zustand: 5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) @@ -10735,65 +10257,6 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - optional: true - - '@unrs/resolver-binding-android-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - optional: true - '@vue/compiler-core@3.5.18': dependencies: '@babel/parser': 7.28.3 @@ -10924,8 +10387,6 @@ snapshots: argparse@2.0.1: {} - aria-query@5.3.2: {} - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -10933,60 +10394,8 @@ snapshots: array-find-index@1.0.2: {} - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - array-union@2.1.0: {} - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 @@ -11005,8 +10414,6 @@ snapshots: assert-plus@1.0.0: {} - ast-types-flow@0.0.8: {} - astral-regex@2.0.0: {} async-function@1.0.0: {} @@ -11035,10 +10442,6 @@ snapshots: aws4@1.13.2: {} - axe-core@4.10.3: {} - - axobject-query@4.1.0: {} - babel-jest@29.7.0(@babel/core@7.28.3): dependencies: '@babel/core': 7.28.3 @@ -11242,7 +10645,7 @@ snapshots: caniuse-lite@1.0.30001741: {} - caniuse-lite@1.0.30001754: {} + caniuse-lite@1.0.30001756: {} caseless@0.12.0: {} @@ -11667,8 +11070,6 @@ snapshots: d3-selection: 2.0.0 d3-transition: 2.0.0(d3-selection@2.0.0) - damerau-levenshtein@1.0.8: {} - dashdash@1.14.1: dependencies: assert-plus: 1.0.0 @@ -11796,10 +11197,6 @@ snapshots: dependencies: path-type: 4.0.0 - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -11961,25 +11358,6 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -11991,10 +11369,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 @@ -12038,182 +11412,10 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@14.2.33(eslint@8.57.1)(typescript@5.9.3): - dependencies: - '@next/eslint-plugin-next': 14.2.33 - '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - - eslint-config-prettier@10.1.8(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0): - dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7(supports-color@8.1.1) - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - get-tsconfig: 4.10.1 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.14 - unrs-resolver: 1.11.1 - optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): - dependencies: - debug: 3.2.7(supports-color@8.1.1) - optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-plugin-css-modules@2.12.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - gonzales-pe: 4.3.0 - lodash: 4.17.21 - - eslint-plugin-cypress@2.15.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - globals: 13.24.0 - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7(supports-color@8.1.1) - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@8.57.1)(typescript@5.9.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3): - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - jest: 29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.10.3 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - - eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): - dependencies: - eslint: 8.57.1 - prettier: 3.6.2 - prettier-linter-helpers: 1.0.0 - synckit: 0.11.11 - optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@8.57.1) - eslint-plugin-promise@6.6.0(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react@7.37.5(eslint@8.57.1): - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 @@ -12282,8 +11484,6 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-walker@0.6.1: {} @@ -12388,8 +11588,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -12585,10 +11783,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.1: - dependencies: - resolve-pkg-maps: 1.0.0 - getos@3.2.1: dependencies: async: 3.2.6 @@ -12614,15 +11808,16 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: + glob@10.4.5: dependencies: foreground-child: 3.3.1 - jackspeak: 2.3.6 + jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 + package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@10.4.5: + glob@10.5.0: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 @@ -12702,10 +11897,6 @@ snapshots: globjoin@0.1.4: {} - gonzales-pe@4.3.0: - dependencies: - minimist: 1.2.8 - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -12882,10 +12073,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-bun-module@2.0.0: - dependencies: - semver: 7.7.3 - is-callable@1.2.7: {} is-ci@3.0.1: @@ -13072,21 +12259,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -13488,10 +12660,6 @@ snapshots: json-stringify-safe@5.0.1: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} jsonfile@4.0.0: @@ -13526,13 +12694,6 @@ snapshots: json-schema: 0.4.0 verror: 1.10.0 - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - jszip@3.10.1: dependencies: lie: 3.3.0 @@ -13566,12 +12727,6 @@ snapshots: known-css-properties@0.36.0: optional: true - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - lazy-ass@1.6.0: {} leven@3.1.0: {} @@ -13895,8 +13050,6 @@ snapshots: nanoid@3.3.11: {} - napi-postinstall@0.3.3: {} - natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -13929,7 +13082,7 @@ snapshots: dependencies: '@next/env': 15.5.6 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001754 + caniuse-lite: 1.0.30001756 postcss: 8.4.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -14033,33 +13186,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - ohash@2.0.11: {} once@1.4.0: @@ -14693,14 +13819,8 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - prettier@2.8.8: {} - prettier@3.6.2: {} - pretty-bytes@5.6.0: {} pretty-format@29.7.0: @@ -14866,7 +13986,7 @@ snapshots: '@babel/runtime': 7.28.3 react: 19.2.0 - react-hook-form@7.66.0(react@19.2.0): + react-hook-form@7.66.1(react@19.2.0): dependencies: react: 19.2.0 @@ -15068,8 +14188,6 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.3: {} resolve@1.22.10: @@ -15078,12 +14196,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -15458,8 +14570,6 @@ snapshots: safer-buffer: 2.1.2 tweetnacl: 0.14.5 - stable-hash@0.0.5: {} - stable@0.1.8: {} stack-utils@2.0.6: @@ -15503,28 +14613,6 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - string.prototype.padend@3.1.6: dependencies: call-bind: 1.0.8 @@ -15532,11 +14620,6 @@ snapshots: es-abstract: 1.24.0 es-object-atoms: 1.1.1 - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 @@ -15731,10 +14814,6 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 - synckit@0.11.11: - dependencies: - '@pkgr/core': 0.2.9 - table@6.9.0: dependencies: ajv: 8.17.1 @@ -15871,15 +14950,6 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@1.14.1: {} - tslib@2.8.1: {} tsup@8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): @@ -15910,11 +14980,6 @@ snapshots: - tsx - yaml - tsutils@3.21.0(typescript@5.9.3): - dependencies: - tslib: 1.14.1 - typescript: 5.9.3 - tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -16010,30 +15075,6 @@ snapshots: universalify@2.0.1: {} - unrs-resolver@1.11.1: - dependencies: - napi-postinstall: 0.3.3 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - untildify@4.0.0: {} update-browserslist-db@1.1.3(browserslist@4.25.2): diff --git a/src/lib/clickhouse.ts b/src/lib/clickhouse.ts index 4880e122..f2ebbb72 100644 --- a/src/lib/clickhouse.ts +++ b/src/lib/clickhouse.ts @@ -1,10 +1,10 @@ -import { ClickHouseClient, createClient } from '@clickhouse/client'; +import { type ClickHouseClient, createClient } from '@clickhouse/client'; import { formatInTimeZone } from 'date-fns-tz'; import debug from 'debug'; import { CLICKHOUSE } from '@/lib/db'; import { DEFAULT_PAGE_SIZE, FILTER_COLUMNS, OPERATORS } from './constants'; import { filtersObjectToArray } from './params'; -import { QueryFilters, QueryOptions } from './types'; +import type { QueryFilters, QueryOptions } from './types'; export const CLICKHOUSE_DATE_FORMATS = { utc: '%Y-%m-%dT%H:%i:%SZ', diff --git a/src/lib/request.ts b/src/lib/request.ts index 97086c2f..32db8e95 100644 --- a/src/lib/request.ts +++ b/src/lib/request.ts @@ -1,12 +1,12 @@ +import { z } from 'zod'; import { checkAuth } from '@/lib/auth'; import { DEFAULT_PAGE_SIZE, FILTER_COLUMNS } from '@/lib/constants'; import { getAllowedUnits, getMinimumUnit, maxDate, parseDateRange } from '@/lib/date'; import { fetchWebsite } from '@/lib/load'; import { filtersArrayToObject } from '@/lib/params'; import { badRequest, unauthorized } from '@/lib/response'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; import { getWebsiteSegment } from '@/queries/prisma'; -import { z } from 'zod'; export async function parseRequest( request: Request, diff --git a/src/lib/storage.ts b/src/lib/storage.ts index fd19b3b6..19681a2d 100644 --- a/src/lib/storage.ts +++ b/src/lib/storage.ts @@ -1,4 +1,4 @@ -export function setItem(key: string, data: any, session?: boolean): void { +export function setItem(key: string, data: any, session?: boolean) { if (typeof window !== 'undefined' && data) { return (session ? sessionStorage : localStorage).setItem(key, JSON.stringify(data)); } @@ -18,7 +18,7 @@ export function getItem(key: string, session?: boolean): any { } } -export function removeItem(key: string, session?: boolean): void { +export function removeItem(key: string, session?: boolean) { if (typeof window !== 'undefined') { return (session ? sessionStorage : localStorage).removeItem(key); } From bc737268b6766626ba482a1f385a53e044ab8041 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Fri, 21 Nov 2025 13:43:54 -0800 Subject: [PATCH 05/45] remove relationMode from schema file --- prisma/schema.prisma | 1 - 1 file changed, 1 deletion(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index aeb11648..e333355a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -7,7 +7,6 @@ generator client { datasource db { provider = "postgresql" url = env("DATABASE_URL") - relationMode = "prisma" } model User { From ffa97d34e213bc719709738ceb1483ca69120e35 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Fri, 21 Nov 2025 14:34:12 -0800 Subject: [PATCH 06/45] Fix Revenue country sums error Closes #3769 --- .../(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx index c56eca68..a5d3b101 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx @@ -137,7 +137,7 @@ export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) { metric={formatMessage(labels.revenue)} data={data?.country.map(({ name, value }: { name: string; value: number }) => ({ label: name, - count: value, + count: Number(value), percent: (value / data?.total.sum) * 100, }))} currency={currency} From 94321192b813591c122b4b281bb3ba65d63cf631 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Fri, 21 Nov 2025 14:43:58 -0800 Subject: [PATCH 07/45] Allow view-only to still join team Closes #3764 --- src/app/(main)/teams/TeamsHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(main)/teams/TeamsHeader.tsx b/src/app/(main)/teams/TeamsHeader.tsx index 053fbe26..c45bc85c 100644 --- a/src/app/(main)/teams/TeamsHeader.tsx +++ b/src/app/(main)/teams/TeamsHeader.tsx @@ -18,7 +18,7 @@ export function TeamsHeader({ return ( - {allowJoin && user.role !== ROLES.viewOnly && } + {allowJoin && } {allowCreate && user.role !== ROLES.viewOnly && } From b9d52af21521e477dbbedcf0aae74cfcc6856845 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 21 Nov 2025 21:35:11 -0800 Subject: [PATCH 08/45] Updated prisma. --- package.json | 8 +- pnpm-lock.yaml | 494 +++++++++++++++--- prisma.config.ts | 8 + prisma/schema.prisma | 1 - public/site.webmanifest | 34 +- scripts/build-geo.js | 56 +- src/app/(main)/App.tsx | 16 +- .../(reports)/journeys/Journey.module.css | 2 +- src/components/metrics/MetricLabel.tsx | 7 +- src/lib/__tests__/charts.test.ts | 22 +- src/lib/prisma.ts | 6 +- src/queries/prisma/pixel.ts | 4 +- src/styles/global.css | 2 +- 13 files changed, 493 insertions(+), 167 deletions(-) create mode 100644 prisma.config.ts diff --git a/package.json b/package.json index bff7d758..d8ca9cfd 100644 --- a/package.json +++ b/package.json @@ -66,13 +66,13 @@ "@dicebear/core": "^9.2.3", "@fontsource/inter": "^5.2.8", "@hello-pangea/dnd": "^17.0.0", - "@prisma/adapter-pg": "^6.18.0", - "@prisma/client": "^6.18.0", + "@prisma/adapter-pg": "^7.0.0", + "@prisma/client": "^7.0.0", "@prisma/extension-read-replicas": "^0.4.1", "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", "@tanstack/react-query": "^5.90.5", - "@umami/react-zen": "^0.208.0", + "@umami/react-zen": "^0.210.0", "@umami/redis-client": "^0.29.0", "bcryptjs": "^3.0.2", "chalk": "^5.6.2", @@ -107,7 +107,7 @@ "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", "pg": "^8.16.3", - "prisma": "^6.18.0", + "prisma": "^7.0.0", "pure-rand": "^7.0.1", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb72c418..92a8bd32 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,14 +27,14 @@ importers: specifier: ^17.0.0 version: 17.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@prisma/adapter-pg': - specifier: ^6.18.0 - version: 6.18.0 + specifier: ^7.0.0 + version: 7.0.0 '@prisma/client': - specifier: ^6.18.0 - version: 6.18.0(prisma@6.18.0(typescript@5.9.3))(typescript@5.9.3) + specifier: ^7.0.0 + version: 7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) '@prisma/extension-read-replicas': specifier: ^0.4.1 - version: 0.4.1(@prisma/client@6.18.0(prisma@6.18.0(typescript@5.9.3))(typescript@5.9.3)) + version: 0.4.1(@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)) '@react-spring/web': specifier: ^10.0.3 version: 10.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -45,8 +45,8 @@ importers: specifier: ^5.90.5 version: 5.90.5(react@19.2.0) '@umami/react-zen': - specifier: ^0.208.0 - version: 0.208.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + specifier: ^0.210.0 + version: 0.210.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) '@umami/redis-client': specifier: ^0.29.0 version: 0.29.0 @@ -150,8 +150,8 @@ importers: specifier: ^8.16.3 version: 8.16.3 prisma: - specifier: ^6.18.0 - version: 6.18.0(typescript@5.9.3) + specifier: ^7.0.0 + version: 7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) pure-rand: specifier: ^7.0.1 version: 7.0.1 @@ -567,6 +567,18 @@ packages: cpu: [x64] os: [win32] + '@chevrotain/cst-dts-gen@10.5.0': + resolution: {integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==} + + '@chevrotain/gast@10.5.0': + resolution: {integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==} + + '@chevrotain/types@10.5.0': + resolution: {integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==} + + '@chevrotain/utils@10.5.0': + resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==} + '@clickhouse/client-common@1.12.1': resolution: {integrity: sha512-ccw1N6hB4+MyaAHIaWBwGZ6O2GgMlO99FlMj0B0UEGfjxM9v5dYVYql6FpP19rMwrVAroYs/IgX2vyZEBvzQLg==} @@ -895,6 +907,20 @@ packages: peerDependencies: '@dicebear/core': ^9.0.0 + '@electric-sql/pglite-socket@0.0.6': + resolution: {integrity: sha512-6RjmgzphIHIBA4NrMGJsjNWK4pu+bCWJlEWlwcxFTVY3WT86dFpKwbZaGWZV6C5Rd7sCk1Z0CI76QEfukLAUXw==} + hasBin: true + peerDependencies: + '@electric-sql/pglite': 0.3.2 + + '@electric-sql/pglite-tools@0.2.7': + resolution: {integrity: sha512-9dAccClqxx4cZB+Ar9B+FZ5WgxDc/Xvl9DPrTWv+dYTf0YNubLzi4wHHRGRGhrJv15XwnyKcGOZAP1VXSneSUg==} + peerDependencies: + '@electric-sql/pglite': 0.3.2 + + '@electric-sql/pglite@0.3.2': + resolution: {integrity: sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==} + '@emnapi/runtime@1.5.0': resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} @@ -1060,12 +1086,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1076,6 +1096,10 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1160,6 +1184,12 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 + '@hono/node-server@1.14.2': + resolution: {integrity: sha512-GHjpOeHYbr9d1vkID2sNUYkl5IxumyhDrUJB7wBp7jvqYwPFt+oNKsAPBRcdSbV7kIrXhouLE199ks1QcK4r7A==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1576,6 +1606,10 @@ packages: '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + '@mrleebo/prisma-ast@0.12.1': + resolution: {integrity: sha512-JwqeCQ1U3fvccttHZq7Tk0m/TMC6WcFAQZdukypW3AzlJYKYTGNVd1ANU2GuhKnv4UQuOFj3oAl0LLG/gxFN1w==} + engines: {node: '>=16'} + '@netlify/plugin-nextjs@5.14.4': resolution: {integrity: sha512-HnMHG0tksVoS2E6ImcX9o/EcVH1dckb8ZL1FyghKRsEPYCo+20hQ6zncd5EEOW7K22UN+n1EprCROWUmsbhYMg==} engines: {node: '>=18.0.0'} @@ -1698,46 +1732,68 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@prisma/adapter-pg@6.18.0': - resolution: {integrity: sha512-eBtBOL1z2Sh0Rc2hwa4dmwoNeFs5T69tsA62AkhBvnzNfTcr/YfLeJae/wjNmvRttYDPmdiuhqZCRPNY1+8fOA==} + '@prisma/adapter-pg@7.0.0': + resolution: {integrity: sha512-cis1Ib+TVbtSi2VU5Zm1fSmAcA8jg7KwUTbJ6LcWIm1eww380utXM8G23F3UCEPOJO4HiKt6adP/Q1hukjAkgw==} - '@prisma/client@6.18.0': - resolution: {integrity: sha512-jnL2I9gDnPnw4A+4h5SuNn8Gc+1mL1Z79U/3I9eE2gbxJG1oSA+62ByPW4xkeDgwE0fqMzzpAZ7IHxYnLZ4iQA==} - engines: {node: '>=18.18'} + '@prisma/client-runtime-utils@7.0.0': + resolution: {integrity: sha512-PAiFgMBPrLSaakBwUpML5NevipuKSL3rtNr8pZ8CZ3OBXo0BFcdeGcBIKw/CxJP6H4GNa4+l5bzJPrk8Iq6tDw==} + + '@prisma/client@7.0.0': + resolution: {integrity: sha512-FM1NtJezl0zH3CybLxcbJwShJt7xFGSRg+1tGhy3sCB8goUDnxnBR+RC/P35EAW8gjkzx7kgz7bvb0MerY2VSw==} + engines: {node: ^20.19 || ^22.12 || ^24.0} peerDependencies: prisma: '*' - typescript: '>=5.1.0' + typescript: '>=5.4.0' peerDependenciesMeta: prisma: optional: true typescript: optional: true - '@prisma/config@6.18.0': - resolution: {integrity: sha512-rgFzspCpwsE+q3OF/xkp0fI2SJ3PfNe9LLMmuSVbAZ4nN66WfBiKqJKo/hLz3ysxiPQZf8h1SMf2ilqPMeWATQ==} + '@prisma/config@7.0.0': + resolution: {integrity: sha512-TDASB57hyGUwHB0IPCSkoJcXFrJOKA1+R/1o4np4PbS+E0F5MiY5aAyUttO0mSuNQaX7t8VH/GkDemffF1mQzg==} - '@prisma/debug@6.18.0': - resolution: {integrity: sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==} + '@prisma/debug@6.8.2': + resolution: {integrity: sha512-4muBSSUwJJ9BYth5N8tqts8JtiLT8QI/RSAzEogwEfpbYGFo9mYsInsVo8dqXdPO2+Rm5OG5q0qWDDE3nyUbVg==} - '@prisma/driver-adapter-utils@6.18.0': - resolution: {integrity: sha512-9wgSriEKs4j1ePxlv1/RNfJV9Gu5rzG37Neshg+DfrCcUY3amroERvTjyR04w5J1THdGdOTgGL9VdJcVaKRMmQ==} + '@prisma/debug@7.0.0': + resolution: {integrity: sha512-SdS3qzfMASHtWimywtkiRcJtrHzacbmMVhElko3DYUZSB0TTLqRYWpddRBJdeGgSLmy1FD55p7uGzIJ+MtfhMg==} - '@prisma/engines-version@6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f': - resolution: {integrity: sha512-T7Af4QsJQnSgWN1zBbX+Cha5t4qjHRxoeoWpK4JugJzG/ipmmDMY5S+O0N1ET6sCBNVkf6lz+Y+ZNO9+wFU8pQ==} + '@prisma/dev@0.13.0': + resolution: {integrity: sha512-QMmF6zFeUF78yv1HYbHvod83AQnl7u6NtKyDhTRZOJup3h1icWs8R7RUVxBJZvM2tBXNAMpLQYYM/8kPlOPegA==} - '@prisma/engines@6.18.0': - resolution: {integrity: sha512-i5RzjGF/ex6AFgqEe2o1IW8iIxJGYVQJVRau13kHPYEL1Ck8Zvwuzamqed/1iIljs5C7L+Opiz5TzSsUebkriA==} + '@prisma/driver-adapter-utils@7.0.0': + resolution: {integrity: sha512-ZEvzFaIapnfNKFPgZu/Zy4g6jfO5C0ZmMp+IjO9hNKNDwVKrDlBKw7F3Y9oRK0U0kfb9lKWP4Dz7DgtKs4TTbA==} + + '@prisma/engines-version@6.20.0-16.next-0c19ccc313cf9911a90d99d2ac2eb0280c76c513': + resolution: {integrity: sha512-7bzyN8Gp9GbDFbTDzVUH9nFcgRWvsWmjrGgBJvIC/zEoAuv/lx62gZXgAKfjn/HoPkxz/dS+TtsnduFx8WA+cw==} + + '@prisma/engines@7.0.0': + resolution: {integrity: sha512-ojCL3OFLMCz33UbU9XwH32jwaeM+dWb8cysTuY8eK6ZlMKXJdy6ogrdG3MGB3meKLGdQBmOpUUGJ7eLIaxbrcg==} '@prisma/extension-read-replicas@0.4.1': resolution: {integrity: sha512-mCMDloqUKUwx2o5uedTs1FHX3Nxdt1GdRMoeyp1JggjiwOALmIYWhxfIN08M2BZ0w8SKwvJqicJZMjkQYkkijw==} peerDependencies: '@prisma/client': ^6.5.0 - '@prisma/fetch-engine@6.18.0': - resolution: {integrity: sha512-TdaBvTtBwP3IoqVYoGIYpD4mWlk0pJpjTJjir/xLeNWlwog7Sl3bD2J0jJ8+5+q/6RBg+acb9drsv5W6lqae7A==} + '@prisma/fetch-engine@7.0.0': + resolution: {integrity: sha512-qcyWTeWDjVDaDQSrVIymZU1xCYlvmwCzjA395lIuFjUESOH3YQCb8i/hpd4vopfq3fUR4v6+MjjtIGvnmErQgw==} - '@prisma/get-platform@6.18.0': - resolution: {integrity: sha512-uXNJCJGhxTCXo2B25Ta91Rk1/Nmlqg9p7G9GKh8TPhxvAyXCvMNQoogj4JLEUy+3ku8g59cpyQIKFhqY2xO2bg==} + '@prisma/get-platform@6.8.2': + resolution: {integrity: sha512-vXSxyUgX3vm1Q70QwzwkjeYfRryIvKno1SXbIqwSptKwqKzskINnDUcx85oX+ys6ooN2ATGSD0xN2UTfg6Zcow==} + + '@prisma/get-platform@7.0.0': + resolution: {integrity: sha512-zyhzrAa+y/GfyCzTnuk0D9lfkvDzo7IbsNyuhTqhPu/AN0txm0x26HAR4tJLismla/fHf5fBzYwSivYSzkpakg==} + + '@prisma/query-plan-executor@6.18.0': + resolution: {integrity: sha512-jZ8cfzFgL0jReE1R10gT8JLHtQxjWYLiQ//wHmVYZ2rVkFHoh0DT8IXsxcKcFlfKN7ak7k6j0XMNn2xVNyr5cA==} + + '@prisma/studio-core-licensed@0.8.0': + resolution: {integrity: sha512-SXCcgFvo/SC6/11kEOaQghJgCWNEWZUvPYKn/gpvMB9HLSG/5M8If7dWZtEQHhchvl8bh9A89Hw6mEKpsXFimA==} + peerDependencies: + '@types/react': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 '@react-aria/autocomplete@3.0.0-rc.3': resolution: {integrity: sha512-vemf7h3hvIDk3MxiiPryysfYgJDg8R72X46dRIeg0+cXKYxjPYou64/DTucSV2z5J6RC5JalINu0jIDaLhEILw==} @@ -2896,8 +2952,8 @@ packages: resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@umami/react-zen@0.208.0': - resolution: {integrity: sha512-r04tOJzwMSQj/De27csFZw70EDWq4avEo3bgUnJYc+Hpeunmy/avWRifgFCzdMwqumcf6xPOeEnfHoUdhMsHQQ==} + '@umami/react-zen@0.210.0': + resolution: {integrity: sha512-nQ8EfrSleuXMPBVabr6rDoH2VS0ca41A3V2OCQbG4HqgLJ5+Mj8gHT/aLqUz5EKNBAmMy0/XxPNAgsHwwoxrCQ==} '@umami/redis-client@0.29.0': resolution: {integrity: sha512-Jaqh++jskqDB7ny75pfC02OvKp1JTS4asGDsFrRL3qy8sxL3PAl9+/mybCJe4/6vWrXDJKqpgkSfUDJq2bFjyw==} @@ -3077,6 +3133,10 @@ packages: aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + aws-ssl-profiles@1.1.2: + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} + engines: {node: '>= 6.0.0'} + aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} @@ -3270,6 +3330,9 @@ packages: resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} engines: {node: '>= 0.8.0'} + chevrotain@10.5.0: + resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -3718,6 +3781,10 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} @@ -3983,8 +4050,8 @@ packages: resolution: {integrity: sha512-OKe7cdic4qbfWd/CcgwJvvCrNX2KWfuMZee9AfJHL1gTYmvqjBjZG1a2NwfhspBzxzlXwsN75WWpKTYfsJpBxg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - exsolve@1.0.7: - resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -4147,6 +4214,9 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + generic-names@4.0.0: resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} @@ -4174,6 +4244,9 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -4267,6 +4340,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + grammex@3.1.11: + resolution: {integrity: sha512-HNwLkgRg9SqTAd1N3Uh/MnKwTBTzwBxTOPbXQ8pb0tpwydjk90k4zRE8JUn9fMUiRwKtXFZ1TWFmms3dZHN+Fg==} + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -4317,6 +4393,10 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hono@4.7.10: + resolution: {integrity: sha512-QkACju9MiN59CKSY5JsGZCYmPZkA6sIW6OFCUp7qDjZu6S6KHtJHhAc9Uy9mV9F8PJ1/HQ3ybZF2yjCa/73fvQ==} + engines: {node: '>=16.9.0'} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -4335,6 +4415,9 @@ packages: resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} engines: {node: '>=0.10'} + http-status-codes@2.3.0: + resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -4348,6 +4431,10 @@ packages: engines: {node: '>=18'} hasBin: true + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + icss-replace-symbols@1.1.0: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} @@ -4577,6 +4664,9 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -4845,6 +4935,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} @@ -5062,6 +5156,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -5083,6 +5180,14 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru.min@1.1.3: + resolution: {integrity: sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==} + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + lucide-react@0.511.0: resolution: {integrity: sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==} peerDependencies: @@ -5249,9 +5354,17 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mysql2@3.15.3: + resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} + engines: {node: '>= 8.0'} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + nano-spawn@2.0.0: resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} @@ -6055,6 +6168,10 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} + postgres@3.4.7: + resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} + engines: {node: '>=12'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -6076,13 +6193,16 @@ packages: resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - prisma@6.18.0: - resolution: {integrity: sha512-bXWy3vTk8mnRmT+SLyZBQoC2vtV9Z8u7OHvEu+aULYxwiop/CPiFZ+F56KsNRNf35jw+8wcu8pmLsjxpBxAO9g==} - engines: {node: '>=18.18'} + prisma@7.0.0: + resolution: {integrity: sha512-VZObZ1pQV/OScarYg68RYUx61GpFLH2mJGf9fUX4XxQxTst/6ZK7nkY86CSZ3zBW6U9lKRTsBrZWVz20X5G/KQ==} + engines: {node: ^20.19 || ^22.12 || ^24.0} hasBin: true peerDependencies: - typescript: '>=5.1.0' + better-sqlite3: '>=9.0.0' + typescript: '>=5.4.0' peerDependenciesMeta: + better-sqlite3: + optional: true typescript: optional: true @@ -6104,6 +6224,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + proxy-from-env@1.0.0: resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} @@ -6288,10 +6411,16 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regexp-to-ast@0.5.0: + resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + remeda@2.21.3: + resolution: {integrity: sha512-XXrZdLA10oEOQhLLzEJEiFFSKi21REGAkHdImIb4rt/XXy8ORGXh5HCcpUOsElfPNDb+X6TA/+wkh+p2KffYmg==} + request-ip@3.3.0: resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==} @@ -6335,6 +6464,10 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6439,6 +6572,9 @@ packages: engines: {node: '>=10'} hasBin: true + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + serialize-error@12.0.0: resolution: {integrity: sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==} engines: {node: '>=18'} @@ -6586,6 +6722,10 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} @@ -6599,6 +6739,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -6822,8 +6965,9 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} @@ -7093,6 +7237,14 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + valibot@1.1.0: + resolution: {integrity: sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -7241,6 +7393,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zeptomatch@2.0.2: + resolution: {integrity: sha512-H33jtSKf8Ijtb5BW6wua3G5DhnFjbFML36eFu+VdOoVY4HD9e7ggjqdM6639B+L87rjnR6Y+XeRzBXZdy52B/g==} + zod@4.1.12: resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} @@ -7495,6 +7650,21 @@ snapshots: '@biomejs/cli-win32-x64@2.3.6': optional: true + '@chevrotain/cst-dts-gen@10.5.0': + dependencies: + '@chevrotain/gast': 10.5.0 + '@chevrotain/types': 10.5.0 + lodash: 4.17.21 + + '@chevrotain/gast@10.5.0': + dependencies: + '@chevrotain/types': 10.5.0 + lodash: 4.17.21 + + '@chevrotain/types@10.5.0': {} + + '@chevrotain/utils@10.5.0': {} + '@clickhouse/client-common@1.12.1': {} '@clickhouse/client@1.12.1': @@ -7789,6 +7959,16 @@ snapshots: dependencies: '@dicebear/core': 9.2.4 + '@electric-sql/pglite-socket@0.0.6(@electric-sql/pglite@0.3.2)': + dependencies: + '@electric-sql/pglite': 0.3.2 + + '@electric-sql/pglite-tools@0.2.7(@electric-sql/pglite@0.3.2)': + dependencies: + '@electric-sql/pglite': 0.3.2 + + '@electric-sql/pglite@0.3.2': {} + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 @@ -7879,11 +8059,6 @@ snapshots: '@esbuild/win32-x64@0.25.11': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -7891,6 +8066,8 @@ snapshots: '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -7899,7 +8076,7 @@ snapshots: globals: 13.24.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -8033,6 +8210,10 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@hono/node-server@1.14.2(hono@4.7.10)': + dependencies: + hono: 4.7.10 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -8485,6 +8666,11 @@ snapshots: '@kurkle/color@0.3.4': {} + '@mrleebo/prisma-ast@0.12.1': + dependencies: + chevrotain: 10.5.0 + lilconfig: 2.1.0 + '@netlify/plugin-nextjs@5.14.4': {} '@next/env@15.5.3': {} @@ -8554,20 +8740,24 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@prisma/adapter-pg@6.18.0': + '@prisma/adapter-pg@7.0.0': dependencies: - '@prisma/driver-adapter-utils': 6.18.0 + '@prisma/driver-adapter-utils': 7.0.0 pg: 8.16.3 postgres-array: 3.0.4 transitivePeerDependencies: - pg-native - '@prisma/client@6.18.0(prisma@6.18.0(typescript@5.9.3))(typescript@5.9.3)': + '@prisma/client-runtime-utils@7.0.0': {} + + '@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@prisma/client-runtime-utils': 7.0.0 optionalDependencies: - prisma: 6.18.0(typescript@5.9.3) + prisma: 7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) typescript: 5.9.3 - '@prisma/config@6.18.0': + '@prisma/config@7.0.0': dependencies: c12: 3.1.0 deepmerge-ts: 7.1.5 @@ -8576,34 +8766,70 @@ snapshots: transitivePeerDependencies: - magicast - '@prisma/debug@6.18.0': {} + '@prisma/debug@6.8.2': {} - '@prisma/driver-adapter-utils@6.18.0': + '@prisma/debug@7.0.0': {} + + '@prisma/dev@0.13.0(typescript@5.9.3)': dependencies: - '@prisma/debug': 6.18.0 + '@electric-sql/pglite': 0.3.2 + '@electric-sql/pglite-socket': 0.0.6(@electric-sql/pglite@0.3.2) + '@electric-sql/pglite-tools': 0.2.7(@electric-sql/pglite@0.3.2) + '@hono/node-server': 1.14.2(hono@4.7.10) + '@mrleebo/prisma-ast': 0.12.1 + '@prisma/get-platform': 6.8.2 + '@prisma/query-plan-executor': 6.18.0 + foreground-child: 3.3.1 + get-port-please: 3.1.2 + hono: 4.7.10 + http-status-codes: 2.3.0 + pathe: 2.0.3 + proper-lockfile: 4.1.2 + remeda: 2.21.3 + std-env: 3.9.0 + valibot: 1.1.0(typescript@5.9.3) + zeptomatch: 2.0.2 + transitivePeerDependencies: + - typescript - '@prisma/engines-version@6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f': {} - - '@prisma/engines@6.18.0': + '@prisma/driver-adapter-utils@7.0.0': dependencies: - '@prisma/debug': 6.18.0 - '@prisma/engines-version': 6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f - '@prisma/fetch-engine': 6.18.0 - '@prisma/get-platform': 6.18.0 + '@prisma/debug': 7.0.0 - '@prisma/extension-read-replicas@0.4.1(@prisma/client@6.18.0(prisma@6.18.0(typescript@5.9.3))(typescript@5.9.3))': - dependencies: - '@prisma/client': 6.18.0(prisma@6.18.0(typescript@5.9.3))(typescript@5.9.3) + '@prisma/engines-version@6.20.0-16.next-0c19ccc313cf9911a90d99d2ac2eb0280c76c513': {} - '@prisma/fetch-engine@6.18.0': + '@prisma/engines@7.0.0': dependencies: - '@prisma/debug': 6.18.0 - '@prisma/engines-version': 6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f - '@prisma/get-platform': 6.18.0 + '@prisma/debug': 7.0.0 + '@prisma/engines-version': 6.20.0-16.next-0c19ccc313cf9911a90d99d2ac2eb0280c76c513 + '@prisma/fetch-engine': 7.0.0 + '@prisma/get-platform': 7.0.0 - '@prisma/get-platform@6.18.0': + '@prisma/extension-read-replicas@0.4.1(@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3))': dependencies: - '@prisma/debug': 6.18.0 + '@prisma/client': 7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + + '@prisma/fetch-engine@7.0.0': + dependencies: + '@prisma/debug': 7.0.0 + '@prisma/engines-version': 6.20.0-16.next-0c19ccc313cf9911a90d99d2ac2eb0280c76c513 + '@prisma/get-platform': 7.0.0 + + '@prisma/get-platform@6.8.2': + dependencies: + '@prisma/debug': 6.8.2 + + '@prisma/get-platform@7.0.0': + dependencies: + '@prisma/debug': 7.0.0 + + '@prisma/query-plan-executor@6.18.0': {} + + '@prisma/studio-core-licensed@0.8.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@types/react': 19.2.2 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) '@react-aria/autocomplete@3.0.0-rc.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: @@ -10219,7 +10445,7 @@ snapshots: '@typescript-eslint/types': 8.46.2 eslint-visitor-keys: 4.2.1 - '@umami/react-zen@0.208.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': + '@umami/react-zen@0.210.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 '@internationalized/date': 3.10.0 @@ -10440,6 +10666,8 @@ snapshots: aws-sign2@0.7.0: {} + aws-ssl-profiles@1.1.2: {} + aws4@1.13.2: {} babel-jest@29.7.0(@babel/core@7.28.3): @@ -10585,7 +10813,7 @@ snapshots: confbox: 0.2.2 defu: 6.1.4 dotenv: 16.6.1 - exsolve: 1.0.7 + exsolve: 1.0.8 giget: 2.0.0 jiti: 2.6.1 ohash: 2.0.11 @@ -10675,6 +10903,15 @@ snapshots: check-more-types@2.24.0: {} + chevrotain@10.5.0: + dependencies: + '@chevrotain/cst-dts-gen': 10.5.0 + '@chevrotain/gast': 10.5.0 + '@chevrotain/types': 10.5.0 + '@chevrotain/utils': 10.5.0 + lodash: 4.17.21 + regexp-to-ast: 0.5.0 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -11173,6 +11410,8 @@ snapshots: delayed-stream@1.0.0: {} + denque@2.1.0: {} + destr@2.0.5: {} detect-browser@5.3.0: {} @@ -11427,8 +11666,8 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 @@ -11456,7 +11695,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 + js-yaml: 4.1.1 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -11545,7 +11784,7 @@ snapshots: jest-mock: 30.0.5 jest-util: 30.0.5 - exsolve@1.0.7: {} + exsolve@1.0.8: {} extend@3.0.2: {} @@ -11739,6 +11978,10 @@ snapshots: functions-have-names@1.2.3: {} + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + generic-names@4.0.0: dependencies: loader-utils: 3.3.1 @@ -11766,6 +12009,8 @@ snapshots: get-package-type@0.1.0: {} + get-port-please@3.1.2: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -11901,6 +12146,8 @@ snapshots: graceful-fs@4.2.11: {} + grammex@3.1.11: {} + graphemer@1.4.0: {} handlebars@4.7.8: @@ -11944,6 +12191,8 @@ snapshots: dependencies: react-is: 16.13.1 + hono@4.7.10: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -11960,12 +12209,18 @@ snapshots: jsprim: 2.0.2 sshpk: 1.18.0 + http-status-codes@2.3.0: {} + human-signals@1.1.1: {} human-signals@2.1.0: {} husky@9.1.7: {} + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + icss-replace-symbols@1.1.0: {} icss-utils@5.1.0(postcss@8.5.6): @@ -12157,6 +12412,8 @@ snapshots: is-plain-object@5.0.0: {} + is-property@1.0.2: {} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.8 @@ -12632,6 +12889,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsbn@0.1.1: {} jsesc@3.1.0: {} @@ -12856,6 +13117,8 @@ snapshots: strip-ansi: 7.1.2 wrap-ansi: 9.0.2 + long@5.3.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -12879,6 +13142,10 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@7.18.3: {} + + lru.min@1.1.3: {} + lucide-react@0.511.0(react@19.2.0): dependencies: react: 19.2.0 @@ -13040,12 +13307,28 @@ snapshots: ms@2.1.3: {} + mysql2@3.15.3: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.0 + long: 5.3.2 + lru.min: 1.1.3 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 + named-placeholders@1.1.3: + dependencies: + lru-cache: 7.18.3 + nano-spawn@2.0.0: {} nanoid@3.3.11: {} @@ -13169,7 +13452,7 @@ snapshots: consola: 3.4.2 pathe: 2.0.3 pkg-types: 2.3.0 - tinyexec: 1.0.1 + tinyexec: 1.0.2 object-assign@4.1.1: {} @@ -13371,7 +13654,7 @@ snapshots: pkg-types@2.3.0: dependencies: confbox: 0.2.2 - exsolve: 1.0.7 + exsolve: 1.0.8 pathe: 2.0.3 possible-typed-array-names@1.1.0: {} @@ -13817,6 +14100,8 @@ snapshots: dependencies: xtend: 4.0.2 + postgres@3.4.7: {} + prelude-ls@1.2.1: {} prettier@2.8.8: {} @@ -13835,14 +14120,21 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@6.18.0(typescript@5.9.3): + prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: - '@prisma/config': 6.18.0 - '@prisma/engines': 6.18.0 + '@prisma/config': 7.0.0 + '@prisma/dev': 0.13.0(typescript@5.9.3) + '@prisma/engines': 7.0.0 + '@prisma/studio-core-licensed': 0.8.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + mysql2: 3.15.3 + postgres: 3.4.7 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: + - '@types/react' - magicast + - react + - react-dom process-nextick-args@2.0.1: {} @@ -13861,6 +14153,12 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + proxy-from-env@1.0.0: {} pump@3.0.3: @@ -14161,6 +14459,8 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regexp-to-ast@0.5.0: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -14170,6 +14470,10 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + remeda@2.21.3: + dependencies: + type-fest: 4.41.0 + request-ip@3.3.0: {} request-progress@3.0.0: @@ -14206,6 +14510,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + retry@0.12.0: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -14343,6 +14649,8 @@ snapshots: semver@7.7.3: {} + seq-queue@0.0.5: {} + serialize-error@12.0.0: dependencies: type-fest: 4.41.0 @@ -14558,6 +14866,8 @@ snapshots: sprintf-js@1.0.3: {} + sqlstring@2.3.3: {} + sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -14576,6 +14886,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + std-env@3.9.0: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -14866,7 +15178,7 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.0.1: {} + tinyexec@1.0.2: {} tinyglobby@0.2.14: dependencies: @@ -15113,6 +15425,10 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + valibot@1.1.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -15295,6 +15611,10 @@ snapshots: yocto-queue@0.1.0: {} + zeptomatch@2.0.2: + dependencies: + grammex: 3.1.11 + zod@4.1.12: {} zustand@5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): diff --git a/prisma.config.ts b/prisma.config.ts new file mode 100644 index 00000000..8ce899ad --- /dev/null +++ b/prisma.config.ts @@ -0,0 +1,8 @@ +import 'dotenv/config'; +import { defineConfig, env } from 'prisma/config'; + +export default defineConfig({ + datasource: { + url: env('DATABASE_URL'), + }, +}); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index aeb11648..66932e33 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -6,7 +6,6 @@ generator client { datasource db { provider = "postgresql" - url = env("DATABASE_URL") relationMode = "prisma" } diff --git a/public/site.webmanifest b/public/site.webmanifest index b20abb7c..fa99de77 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -1,19 +1,19 @@ { - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" } diff --git a/scripts/build-geo.js b/scripts/build-geo.js index f0aedeba..74902511 100644 --- a/scripts/build-geo.js +++ b/scripts/build-geo.js @@ -50,21 +50,23 @@ const downloadDirect = (url, originalUrl) => https.get(url, res => { // Follow redirects if (res.statusCode === 301 || res.statusCode === 302) { - downloadDirect(res.headers.location, originalUrl || url).then(resolve).catch(reject); + downloadDirect(res.headers.location, originalUrl || url) + .then(resolve) + .catch(reject); return; } - + const filename = path.join(dest, path.basename(originalUrl || url)); const fileStream = fs.createWriteStream(filename); - + res.pipe(fileStream); - + fileStream.on('finish', () => { fileStream.close(); console.log('Saved geo database:', filename); resolve(); }); - + fileStream.on('error', e => { reject(e); }); @@ -78,27 +80,29 @@ if (isDirectMmdb) { process.exit(1); }); } else { - downloadCompressed(url).then( - res => - new Promise((resolve, reject) => { - res.on('entry', entry => { - if (entry.path.endsWith('.mmdb')) { - const filename = path.join(dest, path.basename(entry.path)); - entry.pipe(fs.createWriteStream(filename)); + downloadCompressed(url) + .then( + res => + new Promise((resolve, reject) => { + res.on('entry', entry => { + if (entry.path.endsWith('.mmdb')) { + const filename = path.join(dest, path.basename(entry.path)); + entry.pipe(fs.createWriteStream(filename)); - console.log('Saved geo database:', filename); - } - }); + console.log('Saved geo database:', filename); + } + }); - res.on('error', e => { - reject(e); - }); - res.on('finish', () => { - resolve(); - }); - }), - ).catch(e => { - console.error('Failed to download geo database:', e); - process.exit(1); - }); + res.on('error', e => { + reject(e); + }); + res.on('finish', () => { + resolve(); + }); + }), + ) + .catch(e => { + console.error('Failed to download geo database:', e); + process.exit(1); + }); } diff --git a/src/app/(main)/App.tsx b/src/app/(main)/App.tsx index 33f0e1f3..eada680a 100644 --- a/src/app/(main)/App.tsx +++ b/src/app/(main)/App.tsx @@ -1,13 +1,13 @@ 'use client'; -import { Grid, Loading, Column, Row } from '@umami/react-zen'; +import { Column, Grid, Loading, Row } from '@umami/react-zen'; import Script from 'next/script'; -import { UpdateNotice } from './UpdateNotice'; -import { SideNav } from '@/app/(main)/SideNav'; -import { useLoginQuery, useConfig, useNavigation } from '@/components/hooks'; -import { MobileNav } from '@/app/(main)/MobileNav'; import { useEffect } from 'react'; -import { removeItem, setItem } from '@/lib/storage'; +import { MobileNav } from '@/app/(main)/MobileNav'; +import { SideNav } from '@/app/(main)/SideNav'; +import { useConfig, useLoginQuery, useNavigation } from '@/components/hooks'; import { LAST_TEAM_CONFIG } from '@/lib/constants'; +import { removeItem, setItem } from '@/lib/storage'; +import { UpdateNotice } from './UpdateNotice'; export function App({ children }) { const { user, isLoading, error } = useLoginQuery(); @@ -27,7 +27,9 @@ export function App({ children }) { } if (error) { - window.location.href = `${process.env.basePath || ''}/login`; + window.location.href = config.cloudMode + ? `${process.env.cloudUrl}/login` + : `${process.env.basePath || ''}/login`; return null; } diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.module.css b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.module.css index df293bc1..63643f13 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.module.css +++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.module.css @@ -208,7 +208,7 @@ .start:before, .end:before { - content: ''; + content: ""; position: absolute; border-radius: 100%; border: 3px solid var(--journey-line-color); diff --git a/src/components/metrics/MetricLabel.tsx b/src/components/metrics/MetricLabel.tsx index c2f1ea06..c755516c 100644 --- a/src/components/metrics/MetricLabel.tsx +++ b/src/components/metrics/MetricLabel.tsx @@ -137,11 +137,6 @@ export function MetricLabel({ type, data }: MetricLabelProps) { return formatValue(label, 'language'); default: - return ( - - ); + return ; } } diff --git a/src/lib/__tests__/charts.test.ts b/src/lib/__tests__/charts.test.ts index 601ee63d..e81be161 100644 --- a/src/lib/__tests__/charts.test.ts +++ b/src/lib/__tests__/charts.test.ts @@ -14,23 +14,21 @@ describe('renderNumberLabels', () => { expect(renderNumberLabels(input)).toBe(expected); }); - test.each([['12500', '12.5k']])( - "formats numbers ≥ 10K as 'X.Xk' (%s → %s)", - (input, expected) => { - expect(renderNumberLabels(input)).toBe(expected); - }, - ); + test.each([ + ['12500', '12.5k'], + ])("formats numbers ≥ 10K as 'X.Xk' (%s → %s)", (input, expected) => { + expect(renderNumberLabels(input)).toBe(expected); + }); test.each([['1500', '1.50k']])("formats numbers ≥ 1K as 'X.XXk' (%s → %s)", (input, expected) => { expect(renderNumberLabels(input)).toBe(expected); }); - test.each([['999', '999']])( - 'calls formatNumber for values < 1000 (%s → %s)', - (input, expected) => { - expect(renderNumberLabels(input)).toBe(expected); - }, - ); + test.each([ + ['999', '999'], + ])('calls formatNumber for values < 1000 (%s → %s)', (input, expected) => { + expect(renderNumberLabels(input)).toBe(expected); + }); test.each([ ['0', '0'], diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 2242069c..94970584 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -1,10 +1,10 @@ -import debug from 'debug'; import { PrismaPg } from '@prisma/adapter-pg'; import { readReplicas } from '@prisma/extension-read-replicas'; +import debug from 'debug'; import { PrismaClient } from '@/generated/prisma/client'; -import { SESSION_COLUMNS, OPERATORS, DEFAULT_PAGE_SIZE, FILTER_COLUMNS } from './constants'; -import { QueryOptions, QueryFilters, Operator } from './types'; +import { DEFAULT_PAGE_SIZE, FILTER_COLUMNS, OPERATORS, SESSION_COLUMNS } from './constants'; import { filtersObjectToArray } from './params'; +import type { Operator, QueryFilters, QueryOptions } from './types'; const log = debug('umami:prisma'); diff --git a/src/queries/prisma/pixel.ts b/src/queries/prisma/pixel.ts index 36efe01d..4c9e132d 100644 --- a/src/queries/prisma/pixel.ts +++ b/src/queries/prisma/pixel.ts @@ -1,6 +1,6 @@ -import { Prisma } from '@/generated/prisma/client'; +import type { Prisma } from '@/generated/prisma/client'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export async function findPixel(criteria: Prisma.PixelFindUniqueArgs) { return prisma.client.pixel.findUnique(criteria); diff --git a/src/styles/global.css b/src/styles/global.css index d63ebf38..e9fca9fd 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -8,7 +8,7 @@ body { min-height: 100vh; } -html[style*='padding-right'] { +html[style*="padding-right"] { padding-right: 0 !important; } From 099c8bf1b4c542eb4ae139536b02c407ba0904c3 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Sat, 22 Nov 2025 22:24:52 -0800 Subject: [PATCH 09/45] Revert "remove relationMode from schema file" This reverts commit bc737268b6766626ba482a1f385a53e044ab8041. --- prisma/schema.prisma | 1 + 1 file changed, 1 insertion(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e6a49d88..66932e33 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -6,6 +6,7 @@ generator client { datasource db { provider = "postgresql" + relationMode = "prisma" } model User { From 67981db524257a1dfd43e737c8cd416d3a713765 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Sat, 22 Nov 2025 22:28:24 -0800 Subject: [PATCH 10/45] Remove no longer applicable CloudFlare header test Closes #3773 --- src/lib/__tests__/detect.test.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/lib/__tests__/detect.test.ts b/src/lib/__tests__/detect.test.ts index f02ac839..0395aef5 100644 --- a/src/lib/__tests__/detect.test.ts +++ b/src/lib/__tests__/detect.test.ts @@ -17,12 +17,6 @@ test('getIpAddress: Standard header', () => { expect(getIpAddress(new Headers({ 'x-forwarded-for': IP }))).toEqual(IP); }); -test('getIpAddress: CloudFlare header is lower priority than standard header', () => { - expect(getIpAddress(new Headers({ 'cf-connecting-ip': BAD_IP, 'x-forwarded-for': IP }))).toEqual( - IP, - ); -}); - test('getIpAddress: No header', () => { expect(getIpAddress(new Headers())).toEqual(null); }); From fa8d8055df3fe20935207fee7b3a31bd6f9c7fad Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Sat, 22 Nov 2025 22:42:42 -0800 Subject: [PATCH 11/45] Reformatted files with biome. --- biome.json | 7 +- docker/middleware.ts | 2 +- package.json | 7 +- pnpm-lock.yaml | 1684 +++++++---------- scripts/build-geo.js | 2 +- scripts/check-db.js | 2 +- scripts/download-country-names.js | 5 +- scripts/download-language-names.js | 5 +- scripts/format-lang.js | 2 +- scripts/merge-messages.js | 2 +- src/app/(collect)/p/[slug]/route.ts | 8 +- src/app/(collect)/q/[slug]/route.ts | 6 +- src/app/(main)/MobileNav.tsx | 4 +- src/app/(main)/SideNav.tsx | 22 +- src/app/(main)/TopNav.tsx | 2 +- src/app/(main)/UpdateNotice.tsx | 12 +- src/app/(main)/admin/AdminLayout.tsx | 4 +- src/app/(main)/admin/layout.tsx | 2 +- .../admin/teams/AdminTeamsDataTable.tsx | 2 +- src/app/(main)/admin/teams/AdminTeamsPage.tsx | 4 +- .../(main)/admin/teams/AdminTeamsTable.tsx | 6 +- src/app/(main)/admin/teams/[teamId]/page.tsx | 2 +- src/app/(main)/admin/teams/page.tsx | 2 +- src/app/(main)/admin/users/UserAddButton.tsx | 4 +- src/app/(main)/admin/users/UserAddForm.tsx | 16 +- .../(main)/admin/users/UserDeleteButton.tsx | 4 +- src/app/(main)/admin/users/UsersDataTable.tsx | 2 +- src/app/(main)/admin/users/UsersPage.tsx | 6 +- src/app/(main)/admin/users/UsersTable.tsx | 15 +- .../admin/users/[userId]/UserEditForm.tsx | 10 +- .../admin/users/[userId]/UserHeader.tsx | 2 +- .../(main)/admin/users/[userId]/UserPage.tsx | 4 +- .../admin/users/[userId]/UserProvider.tsx | 4 +- .../admin/users/[userId]/UserSettings.tsx | 4 +- .../admin/users/[userId]/UserWebsites.tsx | 2 +- src/app/(main)/admin/users/[userId]/page.tsx | 2 +- src/app/(main)/admin/users/page.tsx | 2 +- .../admin/websites/AdminWebsitesPage.tsx | 4 +- .../admin/websites/AdminWebsitesTable.tsx | 13 +- .../admin/websites/[websiteId]/page.tsx | 2 +- src/app/(main)/admin/websites/page.tsx | 2 +- src/app/(main)/boards/BoardAddButton.tsx | 2 +- src/app/(main)/boards/BoardAddForm.tsx | 4 +- src/app/(main)/boards/BoardsPage.tsx | 2 +- src/app/(main)/boards/[boardId]/page.tsx | 2 +- src/app/(main)/boards/page.tsx | 2 +- .../console/[websiteId]/TestConsolePage.tsx | 32 +- src/app/(main)/console/[websiteId]/page.tsx | 2 +- src/app/(main)/dashboard/DashboardPage.tsx | 2 +- src/app/(main)/dashboard/page.tsx | 2 +- src/app/(main)/layout.tsx | 2 +- src/app/(main)/links/LinkAddButton.tsx | 2 +- src/app/(main)/links/LinkDeleteButton.tsx | 4 +- src/app/(main)/links/LinkEditButton.tsx | 4 +- src/app/(main)/links/LinkEditForm.tsx | 19 +- src/app/(main)/links/LinkProvider.tsx | 4 +- src/app/(main)/links/LinksDataTable.tsx | 2 +- src/app/(main)/links/LinksPage.tsx | 8 +- src/app/(main)/links/LinksTable.tsx | 6 +- .../(main)/links/[linkId]/LinkControls.tsx | 6 +- src/app/(main)/links/[linkId]/LinkHeader.tsx | 6 +- .../(main)/links/[linkId]/LinkMetricsBar.tsx | 4 +- src/app/(main)/links/[linkId]/LinkPage.tsx | 16 +- src/app/(main)/links/[linkId]/LinkPanels.tsx | 6 +- src/app/(main)/links/[linkId]/page.tsx | 2 +- src/app/(main)/links/page.tsx | 2 +- src/app/(main)/pixels/PixelAddButton.tsx | 2 +- src/app/(main)/pixels/PixelDeleteButton.tsx | 4 +- src/app/(main)/pixels/PixelEditButton.tsx | 4 +- src/app/(main)/pixels/PixelEditForm.tsx | 19 +- src/app/(main)/pixels/PixelProvider.tsx | 4 +- src/app/(main)/pixels/PixelsDataTable.tsx | 4 +- src/app/(main)/pixels/PixelsPage.tsx | 8 +- src/app/(main)/pixels/PixelsTable.tsx | 8 +- .../(main)/pixels/[pixelId]/PixelControls.tsx | 6 +- .../(main)/pixels/[pixelId]/PixelHeader.tsx | 6 +- .../pixels/[pixelId]/PixelMetricsBar.tsx | 4 +- src/app/(main)/pixels/[pixelId]/PixelPage.tsx | 16 +- .../(main)/pixels/[pixelId]/PixelPanels.tsx | 6 +- src/app/(main)/pixels/[pixelId]/page.tsx | 2 +- src/app/(main)/pixels/page.tsx | 2 +- src/app/(main)/settings/SettingsLayout.tsx | 4 +- src/app/(main)/settings/layout.tsx | 2 +- .../settings/preferences/DateRangeSetting.tsx | 6 +- .../settings/preferences/LanguageSetting.tsx | 2 +- .../preferences/PreferenceSettings.tsx | 2 +- .../settings/preferences/PreferencesPage.tsx | 8 +- .../settings/preferences/ThemeSetting.tsx | 4 +- .../settings/preferences/TimezoneSetting.tsx | 4 +- src/app/(main)/settings/preferences/page.tsx | 2 +- .../settings/profile/PasswordChangeButton.tsx | 6 +- .../settings/profile/PasswordEditForm.tsx | 8 +- .../(main)/settings/profile/ProfilePage.tsx | 8 +- .../settings/profile/ProfileSettings.tsx | 2 +- src/app/(main)/settings/profile/page.tsx | 2 +- .../settings/teams/TeamsSettingsPage.tsx | 2 +- .../teams/[teamId]/TeamSettingsPage.tsx | 2 +- .../(main)/settings/teams/[teamId]/page.tsx | 2 +- src/app/(main)/settings/teams/page.tsx | 2 +- .../websites/WebsitesSettingsPage.tsx | 2 +- .../[websiteId]/WebsiteSettingsPage.tsx | 4 +- .../settings/websites/[websiteId]/page.tsx | 2 +- src/app/(main)/settings/websites/page.tsx | 2 +- src/app/(main)/teams/TeamAddForm.tsx | 2 +- src/app/(main)/teams/TeamJoinForm.tsx | 8 +- src/app/(main)/teams/TeamLeaveButton.tsx | 4 +- src/app/(main)/teams/TeamLeaveForm.tsx | 2 +- src/app/(main)/teams/TeamProvider.tsx | 4 +- src/app/(main)/teams/TeamsAddButton.tsx | 6 +- src/app/(main)/teams/TeamsDataTable.tsx | 2 +- src/app/(main)/teams/TeamsHeader.tsx | 4 +- src/app/(main)/teams/TeamsJoinButton.tsx | 4 +- src/app/(main)/teams/TeamsPage.tsx | 4 +- src/app/(main)/teams/TeamsTable.tsx | 4 +- .../(main)/teams/[teamId]/TeamEditForm.tsx | 12 +- src/app/(main)/teams/[teamId]/TeamManage.tsx | 4 +- .../teams/[teamId]/TeamMemberEditButton.tsx | 6 +- .../teams/[teamId]/TeamMemberEditForm.tsx | 8 +- .../teams/[teamId]/TeamMemberRemoveButton.tsx | 2 +- .../teams/[teamId]/TeamMembersDataTable.tsx | 2 +- .../teams/[teamId]/TeamMembersTable.tsx | 2 +- .../(main)/teams/[teamId]/TeamSettings.tsx | 12 +- .../[teamId]/TeamWebsiteRemoveButton.tsx | 2 +- .../teams/[teamId]/TeamWebsitesTable.tsx | 4 +- src/app/(main)/teams/page.tsx | 2 +- src/app/(main)/websites/WebsiteAddButton.tsx | 4 +- src/app/(main)/websites/WebsiteAddForm.tsx | 5 +- src/app/(main)/websites/WebsiteProvider.tsx | 4 +- src/app/(main)/websites/WebsitesDataTable.tsx | 2 +- src/app/(main)/websites/WebsitesHeader.tsx | 2 +- src/app/(main)/websites/WebsitesPage.tsx | 8 +- src/app/(main)/websites/WebsitesTable.tsx | 4 +- .../(reports)/attribution/Attribution.tsx | 30 +- .../(reports)/attribution/AttributionPage.tsx | 4 +- .../(reports)/attribution/page.tsx | 2 +- .../(reports)/breakdown/Breakdown.tsx | 16 +- .../(reports)/breakdown/BreakdownPage.tsx | 4 +- .../(reports)/breakdown/FieldSelectForm.tsx | 4 +- .../[websiteId]/(reports)/breakdown/page.tsx | 2 +- .../[websiteId]/(reports)/funnels/Funnel.tsx | 8 +- .../(reports)/funnels/FunnelAddButton.tsx | 4 +- .../(reports)/funnels/FunnelEditForm.tsx | 16 +- .../(reports)/funnels/FunnelsPage.tsx | 12 +- .../[websiteId]/(reports)/funnels/page.tsx | 2 +- .../[websiteId]/(reports)/goals/Goal.tsx | 6 +- .../(reports)/goals/GoalAddButton.tsx | 4 +- .../(reports)/goals/GoalEditForm.tsx | 16 +- .../[websiteId]/(reports)/goals/GoalsPage.tsx | 12 +- .../[websiteId]/(reports)/goals/page.tsx | 2 +- .../(reports)/journeys/Journey.tsx | 8 +- .../(reports)/journeys/JourneysPage.tsx | 8 +- .../[websiteId]/(reports)/journeys/page.tsx | 2 +- .../(reports)/retention/Retention.tsx | 10 +- .../(reports)/retention/RetentionPage.tsx | 4 +- .../[websiteId]/(reports)/retention/page.tsx | 2 +- .../[websiteId]/(reports)/revenue/Revenue.tsx | 8 +- .../(reports)/revenue/RevenuePage.tsx | 2 +- .../[websiteId]/(reports)/revenue/page.tsx | 2 +- .../[websiteId]/(reports)/utm/UTM.tsx | 2 +- .../[websiteId]/(reports)/utm/UTMPage.tsx | 2 +- .../[websiteId]/(reports)/utm/page.tsx | 2 +- .../[websiteId]/ExpandedViewModal.tsx | 2 +- .../websites/[websiteId]/WebsiteChart.tsx | 4 +- .../websites/[websiteId]/WebsiteControls.tsx | 8 +- .../[websiteId]/WebsiteExpandedMenu.tsx | 24 +- .../[websiteId]/WebsiteExpandedView.tsx | 6 +- .../websites/[websiteId]/WebsiteHeader.tsx | 12 +- .../websites/[websiteId]/WebsiteLayout.tsx | 2 +- .../websites/[websiteId]/WebsiteMenu.tsx | 2 +- .../[websiteId]/WebsiteMetricsBar.tsx | 8 +- .../websites/[websiteId]/WebsiteNav.tsx | 16 +- .../websites/[websiteId]/WebsitePage.tsx | 4 +- .../websites/[websiteId]/WebsitePanels.tsx | 2 +- .../websites/[websiteId]/WebsiteTabs.tsx | 4 +- .../cohorts/CohortDeleteButton.tsx | 6 +- .../[websiteId]/cohorts/CohortEditButton.tsx | 4 +- .../[websiteId]/cohorts/CohortEditForm.tsx | 8 +- .../[websiteId]/cohorts/CohortsDataTable.tsx | 6 +- .../[websiteId]/cohorts/CohortsPage.tsx | 2 +- .../[websiteId]/cohorts/CohortsTable.tsx | 12 +- .../websites/[websiteId]/cohorts/page.tsx | 2 +- .../[websiteId]/compare/ComparePage.tsx | 4 +- .../[websiteId]/compare/CompareTables.tsx | 6 +- .../websites/[websiteId]/compare/page.tsx | 2 +- .../[websiteId]/events/EventProperties.tsx | 8 +- .../[websiteId]/events/EventsDataTable.tsx | 7 +- .../[websiteId]/events/EventsMetricsBar.tsx | 2 +- .../[websiteId]/events/EventsPage.tsx | 20 +- .../[websiteId]/events/EventsTable.tsx | 20 +- .../websites/[websiteId]/events/page.tsx | 2 +- .../(main)/websites/[websiteId]/layout.tsx | 2 +- src/app/(main)/websites/[websiteId]/page.tsx | 2 +- .../realtime/RealtimeCountries.tsx | 6 +- .../[websiteId]/realtime/RealtimeHeader.tsx | 2 +- .../[websiteId]/realtime/RealtimeLog.tsx | 10 +- .../[websiteId]/realtime/RealtimePage.tsx | 10 +- .../[websiteId]/realtime/RealtimePaths.tsx | 4 +- .../realtime/RealtimeReferrers.tsx | 4 +- .../websites/[websiteId]/realtime/page.tsx | 2 +- .../[websiteId]/segments/SegmentAddButton.tsx | 2 +- .../segments/SegmentDeleteButton.tsx | 4 +- .../segments/SegmentEditButton.tsx | 6 +- .../[websiteId]/segments/SegmentEditForm.tsx | 6 +- .../segments/SegmentsDataTable.tsx | 6 +- .../[websiteId]/segments/SegmentsPage.tsx | 2 +- .../[websiteId]/segments/SegmentsTable.tsx | 10 +- .../websites/[websiteId]/segments/page.tsx | 2 +- .../[websiteId]/sessions/SessionActivity.tsx | 22 +- .../[websiteId]/sessions/SessionData.tsx | 6 +- .../[websiteId]/sessions/SessionInfo.tsx | 10 +- .../[websiteId]/sessions/SessionModal.tsx | 2 +- .../[websiteId]/sessions/SessionProfile.tsx | 16 +- .../sessions/SessionProperties.tsx | 8 +- .../sessions/SessionsDataTable.tsx | 2 +- .../sessions/SessionsMetricsBar.tsx | 2 +- .../[websiteId]/sessions/SessionsPage.tsx | 16 +- .../[websiteId]/sessions/SessionsTable.tsx | 6 +- .../websites/[websiteId]/sessions/page.tsx | 2 +- .../[websiteId]/settings/WebsiteData.tsx | 8 +- .../settings/WebsiteDeleteForm.tsx | 2 +- .../[websiteId]/settings/WebsiteEditForm.tsx | 2 +- .../[websiteId]/settings/WebsiteResetForm.tsx | 2 +- .../[websiteId]/settings/WebsiteSettings.tsx | 6 +- .../settings/WebsiteSettingsHeader.tsx | 4 +- .../[websiteId]/settings/WebsiteShareForm.tsx | 16 +- .../settings/WebsiteTrackingCode.tsx | 4 +- .../settings/WebsiteTransferForm.tsx | 4 +- .../websites/[websiteId]/settings/page.tsx | 2 +- src/app/(main)/websites/page.tsx | 2 +- src/app/Providers.tsx | 6 +- src/app/api/admin/websites/route.ts | 2 +- src/app/api/auth/login/route.ts | 14 +- src/app/api/auth/sso/route.ts | 6 +- src/app/api/links/[linkId]/route.ts | 4 +- src/app/api/links/route.ts | 4 +- src/app/api/me/password/route.ts | 2 +- src/app/api/me/teams/route.ts | 4 +- src/app/api/me/websites/route.ts | 4 +- src/app/api/pixels/[pixelId]/route.ts | 4 +- src/app/api/pixels/route.ts | 4 +- src/app/api/realtime/[websiteId]/route.ts | 2 +- src/app/api/reports/attribution/route.ts | 4 +- src/app/api/reports/breakdown/route.ts | 6 +- src/app/api/reports/funnel/route.ts | 8 +- src/app/api/reports/goal/route.ts | 6 +- src/app/api/reports/journey/route.ts | 6 +- src/app/api/reports/retention/route.ts | 8 +- src/app/api/reports/revenue/route.ts | 8 +- src/app/api/reports/route.ts | 8 +- src/app/api/reports/utm/route.ts | 10 +- src/app/api/send/route.ts | 18 +- src/app/api/share/[shareId]/route.ts | 6 +- src/app/api/teams/[teamId]/links/route.ts | 4 +- src/app/api/teams/[teamId]/pixels/route.ts | 4 +- src/app/api/teams/[teamId]/route.ts | 4 +- .../teams/[teamId]/users/[userId]/route.ts | 6 +- src/app/api/teams/[teamId]/users/route.ts | 2 +- src/app/api/teams/[teamId]/websites/route.ts | 4 +- src/app/api/teams/join/route.ts | 4 +- src/app/api/teams/route.ts | 8 +- src/app/api/users/[userId]/route.ts | 6 +- src/app/api/users/[userId]/teams/route.ts | 4 +- src/app/api/users/[userId]/websites/route.ts | 4 +- src/app/api/users/route.ts | 6 +- .../api/websites/[websiteId]/active/route.ts | 6 +- .../websites/[websiteId]/daterange/route.ts | 4 +- .../[websiteId]/event-data/[eventId]/route.ts | 2 +- .../[websiteId]/event-data/events/route.ts | 4 +- .../[websiteId]/event-data/fields/route.ts | 4 +- .../event-data/properties/route.ts | 2 +- .../[websiteId]/event-data/stats/route.ts | 4 +- .../[websiteId]/event-data/values/route.ts | 4 +- .../api/websites/[websiteId]/events/route.ts | 2 +- .../[websiteId]/events/series/route.ts | 6 +- .../api/websites/[websiteId]/export/route.ts | 6 +- .../[websiteId]/metrics/expanded/route.ts | 2 +- .../api/websites/[websiteId]/metrics/route.ts | 2 +- .../websites/[websiteId]/pageviews/route.ts | 8 +- .../api/websites/[websiteId]/reports/route.ts | 6 +- .../api/websites/[websiteId]/reset/route.ts | 4 +- src/app/api/websites/[websiteId]/route.ts | 4 +- .../[websiteId]/segments/[segmentId]/route.ts | 4 +- .../websites/[websiteId]/segments/route.ts | 6 +- .../session-data/properties/route.ts | 4 +- .../[websiteId]/session-data/values/route.ts | 6 +- .../sessions/[sessionId]/activity/route.ts | 4 +- .../sessions/[sessionId]/properties/route.ts | 4 +- .../[websiteId]/sessions/[sessionId]/route.ts | 4 +- .../websites/[websiteId]/sessions/route.ts | 4 +- .../[websiteId]/sessions/stats/route.ts | 6 +- .../[websiteId]/sessions/weekly/route.ts | 2 +- .../api/websites/[websiteId]/stats/route.ts | 10 +- .../websites/[websiteId]/transfer/route.ts | 4 +- .../api/websites/[websiteId]/values/route.ts | 8 +- src/app/api/websites/route.ts | 6 +- src/app/layout.tsx | 2 +- src/app/login/LoginForm.tsx | 12 +- src/app/login/page.tsx | 2 +- src/app/logout/LogoutPage.tsx | 4 +- src/app/logout/page.tsx | 2 +- src/app/page.tsx | 4 +- src/app/share/[...shareId]/Header.tsx | 4 +- src/app/share/[...shareId]/SharePage.tsx | 12 +- src/app/sso/SSOPage.tsx | 2 +- src/components/charts/BarChart.tsx | 8 +- src/components/charts/BubbleChart.tsx | 2 +- src/components/charts/Chart.tsx | 11 +- src/components/charts/ChartTooltip.tsx | 4 +- src/components/charts/PieChart.tsx | 2 +- src/components/common/ActionForm.tsx | 2 +- src/components/common/AnimatedDiv.tsx | 2 +- src/components/common/Avatar.tsx | 4 +- src/components/common/ConfirmationForm.tsx | 4 +- src/components/common/DataGrid.tsx | 20 +- src/components/common/DateDisplay.tsx | 2 +- src/components/common/EmptyPlaceholder.tsx | 4 +- src/components/common/ErrorBoundary.tsx | 4 +- src/components/common/ErrorMessage.tsx | 2 +- src/components/common/ExternalLink.tsx | 2 +- src/components/common/FilterLink.tsx | 4 +- src/components/common/FilterRecord.tsx | 4 +- src/components/common/LinkButton.tsx | 4 +- src/components/common/LoadingPanel.tsx | 6 +- src/components/common/PageBody.tsx | 4 +- src/components/common/PageHeader.tsx | 4 +- src/components/common/Panel.tsx | 14 +- src/components/common/SectionHeader.tsx | 4 +- src/components/common/SideMenu.tsx | 13 +- .../common/TypeConfirmationForm.tsx | 2 +- src/components/common/TypeIcon.tsx | 2 +- src/components/hooks/context/useLink.ts | 2 +- src/components/hooks/context/usePixel.ts | 2 +- src/components/hooks/context/useTeam.ts | 2 +- src/components/hooks/context/useUser.ts | 2 +- src/components/hooks/context/useWebsite.ts | 2 +- src/components/hooks/index.ts | 8 +- .../hooks/queries/useActiveUsersQuery.ts | 2 +- .../hooks/queries/useDateRangeQuery.ts | 2 +- .../hooks/queries/useEventDataEventsQuery.ts | 4 +- .../queries/useEventDataPropertiesQuery.ts | 4 +- .../hooks/queries/useEventDataQuery.ts | 4 +- .../hooks/queries/useEventDataValuesQuery.ts | 2 +- src/components/hooks/queries/useLinksQuery.ts | 4 +- src/components/hooks/queries/useLoginQuery.ts | 2 +- .../hooks/queries/usePixelsQuery.ts | 4 +- .../hooks/queries/useRealtimeQuery.ts | 2 +- .../hooks/queries/useReportsQuery.ts | 4 +- .../hooks/queries/useResultQuery.ts | 4 +- .../queries/useSessionDataPropertiesQuery.ts | 4 +- .../queries/useSessionDataValuesQuery.ts | 4 +- .../hooks/queries/useShareTokenQuery.ts | 2 +- .../hooks/queries/useTeamMembersQuery.ts | 2 +- src/components/hooks/queries/useTeamQuery.ts | 4 +- .../hooks/queries/useTeamWebsitesQuery.ts | 2 +- src/components/hooks/queries/useTeamsQuery.ts | 2 +- src/components/hooks/queries/useUserQuery.ts | 4 +- .../hooks/queries/useUserWebsitesQuery.ts | 4 +- src/components/hooks/queries/useUsersQuery.ts | 2 +- .../hooks/queries/useWebsiteCohortQuery.ts | 4 +- .../hooks/queries/useWebsiteCohortsQuery.ts | 6 +- .../hooks/queries/useWebsiteEventsQuery.ts | 4 +- .../queries/useWebsiteEventsSeriesQuery.ts | 4 +- .../queries/useWebsiteExpandedMetricsQuery.ts | 4 +- .../hooks/queries/useWebsiteMetricsQuery.ts | 2 +- .../hooks/queries/useWebsitePageviewsQuery.ts | 4 +- .../hooks/queries/useWebsiteQuery.ts | 4 +- .../hooks/queries/useWebsiteSegmentQuery.ts | 4 +- .../hooks/queries/useWebsiteSegmentsQuery.ts | 6 +- .../queries/useWebsiteSessionStatsQuery.ts | 2 +- .../hooks/queries/useWebsiteStatsQuery.ts | 4 +- .../hooks/queries/useWebsiteValuesQuery.ts | 2 +- .../hooks/queries/useWebsitesQuery.ts | 4 +- .../hooks/queries/useWeeklyTrafficQuery.ts | 6 +- src/components/hooks/useApi.ts | 4 +- src/components/hooks/useConfig.ts | 2 +- src/components/hooks/useCountryNames.ts | 2 +- src/components/hooks/useDateRange.ts | 4 +- src/components/hooks/useEscapeKey.ts | 2 +- src/components/hooks/useFilters.ts | 2 +- src/components/hooks/useFormat.ts | 6 +- src/components/hooks/useLanguageNames.ts | 2 +- src/components/hooks/useLocale.ts | 8 +- src/components/hooks/useMessages.ts | 8 +- src/components/hooks/useNavigation.ts | 2 +- src/components/hooks/usePagedQuery.ts | 4 +- src/components/hooks/useRegionNames.ts | 2 +- src/components/hooks/useSticky.ts | 2 +- src/components/hooks/useTimezone.ts | 10 +- src/components/input/ActionSelect.tsx | 2 +- src/components/input/CurrencySelect.tsx | 2 +- src/components/input/DateFilter.tsx | 8 +- src/components/input/DialogButton.tsx | 8 +- src/components/input/DownloadButton.tsx | 4 +- src/components/input/ExportButton.tsx | 8 +- src/components/input/FieldFilters.tsx | 20 +- src/components/input/FilterBar.tsx | 22 +- src/components/input/FilterButtons.tsx | 2 +- src/components/input/FilterEditForm.tsx | 4 +- src/components/input/LanguageButton.tsx | 6 +- src/components/input/LookupField.tsx | 4 +- src/components/input/MenuButton.tsx | 4 +- src/components/input/MobileMenuButton.tsx | 2 +- src/components/input/MonthSelect.tsx | 2 +- src/components/input/NavButton.tsx | 14 +- src/components/input/PanelButton.tsx | 4 +- src/components/input/PreferencesButton.tsx | 8 +- src/components/input/ProfileButton.tsx | 16 +- src/components/input/RefreshButton.tsx | 7 +- src/components/input/ReportEditButton.tsx | 8 +- src/components/input/SegmentFilters.tsx | 4 +- src/components/input/SegmentSaveButton.tsx | 4 +- src/components/input/SettingsButton.tsx | 22 +- src/components/input/WebsiteDateFilter.tsx | 6 +- src/components/input/WebsiteFilterButton.tsx | 6 +- src/components/input/WebsiteSelect.tsx | 10 +- src/components/metrics/ActiveUsers.tsx | 4 +- src/components/metrics/ChangeLabel.tsx | 6 +- src/components/metrics/DatePickerForm.tsx | 4 +- src/components/metrics/EventData.tsx | 4 +- src/components/metrics/EventsChart.tsx | 6 +- src/components/metrics/Legend.tsx | 2 +- src/components/metrics/ListTable.tsx | 8 +- src/components/metrics/MetricCard.tsx | 4 +- src/components/metrics/MetricLabel.tsx | 8 +- src/components/metrics/MetricsBar.tsx | 4 +- .../metrics/MetricsExpandedTable.tsx | 16 +- src/components/metrics/MetricsTable.tsx | 4 +- src/components/metrics/PageviewsChart.tsx | 6 +- src/components/metrics/RealtimeChart.tsx | 8 +- src/components/metrics/WeeklyTraffic.tsx | 7 +- src/components/metrics/WorldMap.tsx | 14 +- src/components/svg/AddUser.tsx | 2 +- src/components/svg/BarChart.tsx | 2 +- src/components/svg/Bars.tsx | 2 +- src/components/svg/Bolt.tsx | 2 +- src/components/svg/Bookmark.tsx | 2 +- src/components/svg/Calendar.tsx | 2 +- src/components/svg/Change.tsx | 2 +- src/components/svg/Clock.tsx | 2 +- src/components/svg/Compare.tsx | 2 +- src/components/svg/Dashboard.tsx | 2 +- src/components/svg/Download.tsx | 2 +- src/components/svg/Expand.tsx | 2 +- src/components/svg/Export.tsx | 2 +- src/components/svg/Flag.tsx | 2 +- src/components/svg/Funnel.tsx | 2 +- src/components/svg/Gear.tsx | 2 +- src/components/svg/Globe.tsx | 2 +- src/components/svg/Lightbulb.tsx | 2 +- src/components/svg/Lightning.tsx | 2 +- src/components/svg/Link.tsx | 2 +- src/components/svg/Location.tsx | 2 +- src/components/svg/Lock.tsx | 2 +- src/components/svg/Logo.tsx | 2 +- src/components/svg/LogoWhite.tsx | 2 +- src/components/svg/Magnet.tsx | 2 +- src/components/svg/Money.tsx | 2 +- src/components/svg/Moon.tsx | 2 +- src/components/svg/Network.tsx | 2 +- src/components/svg/Nodes.tsx | 2 +- src/components/svg/Overview.tsx | 2 +- src/components/svg/Path.tsx | 2 +- src/components/svg/Profile.tsx | 2 +- src/components/svg/Pushpin.tsx | 2 +- src/components/svg/Redo.tsx | 2 +- src/components/svg/Reports.tsx | 2 +- src/components/svg/Security.tsx | 2 +- src/components/svg/Speaker.tsx | 2 +- src/components/svg/Sun.tsx | 2 +- src/components/svg/Switch.tsx | 2 +- src/components/svg/Tag.tsx | 2 +- src/components/svg/Target.tsx | 2 +- src/components/svg/Visitor.tsx | 2 +- src/components/svg/Website.tsx | 2 +- src/components/svg/index.ts | 2 +- src/index.ts | 19 +- src/lib/auth.ts | 2 +- src/lib/client.ts | 2 +- src/lib/crypto.ts | 2 +- src/lib/data.ts | 2 +- src/lib/date.ts | 6 +- src/lib/db.ts | 4 +- src/lib/detect.ts | 8 +- src/lib/format.ts | 2 +- src/lib/kafka.ts | 6 +- src/lib/lang.ts | 16 +- src/lib/load.ts | 2 +- src/lib/params.ts | 2 +- src/lib/react.ts | 8 +- src/lib/request.ts | 2 +- src/lib/schema.ts | 4 +- src/lib/types.ts | 6 +- src/permissions/index.ts | 2 +- src/permissions/link.ts | 4 +- src/permissions/pixel.ts | 4 +- src/permissions/report.ts | 8 +- src/permissions/team.ts | 6 +- src/permissions/user.ts | 2 +- src/permissions/website.ts | 4 +- src/queries/prisma/link.ts | 4 +- src/queries/prisma/report.ts | 3 +- src/queries/prisma/segment.ts | 4 +- src/queries/prisma/team.ts | 7 +- src/queries/prisma/teamUser.ts | 5 +- src/queries/prisma/user.ts | 5 +- src/queries/prisma/website.ts | 8 +- src/queries/sql/events/getEventData.ts | 4 +- src/queries/sql/events/getEventDataEvents.ts | 4 +- src/queries/sql/events/getEventDataFields.ts | 2 +- .../sql/events/getEventDataProperties.ts | 4 +- src/queries/sql/events/getEventDataStats.ts | 4 +- src/queries/sql/events/getEventDataUsage.ts | 4 +- src/queries/sql/events/getEventDataValues.ts | 4 +- .../sql/events/getEventExpandedMetrics.ts | 2 +- src/queries/sql/events/getEventMetrics.ts | 2 +- src/queries/sql/events/getEventStats.ts | 2 +- src/queries/sql/events/getEventUsage.ts | 4 +- src/queries/sql/events/getWebsiteEvents.ts | 2 +- src/queries/sql/events/saveEvent.ts | 6 +- src/queries/sql/events/saveEventData.ts | 6 +- src/queries/sql/getActiveVisitors.ts | 4 +- src/queries/sql/getChannelExpandedMetrics.ts | 2 +- src/queries/sql/getChannelMetrics.ts | 2 +- src/queries/sql/getRealtimeActivity.ts | 6 +- src/queries/sql/getRealtimeData.ts | 2 +- src/queries/sql/getValues.ts | 6 +- src/queries/sql/getWebsiteDateRange.ts | 4 +- src/queries/sql/getWebsiteStats.ts | 2 +- src/queries/sql/getWeeklyTraffic.ts | 6 +- src/queries/sql/index.ts | 48 +- .../pageviews/getPageviewExpandedMetrics.ts | 2 +- .../sql/pageviews/getPageviewMetrics.ts | 2 +- src/queries/sql/pageviews/getPageviewStats.ts | 2 +- src/queries/sql/reports/getAttribution.ts | 2 +- src/queries/sql/reports/getBreakdown.ts | 6 +- src/queries/sql/reports/getFunnel.ts | 2 +- src/queries/sql/reports/getGoal.ts | 2 +- src/queries/sql/reports/getJourney.ts | 10 +- src/queries/sql/reports/getRetention.ts | 2 +- src/queries/sql/reports/getRevenue.ts | 2 +- src/queries/sql/reports/getUTM.ts | 2 +- src/queries/sql/sessions/createSession.ts | 2 +- .../sql/sessions/getSessionActivity.ts | 2 +- src/queries/sql/sessions/getSessionData.ts | 4 +- .../sql/sessions/getSessionDataProperties.ts | 2 +- .../sql/sessions/getSessionDataValues.ts | 4 +- .../sql/sessions/getSessionExpandedMetrics.ts | 2 +- src/queries/sql/sessions/getSessionMetrics.ts | 2 +- src/queries/sql/sessions/getSessionStats.ts | 2 +- src/queries/sql/sessions/getWebsiteSession.ts | 4 +- .../sql/sessions/getWebsiteSessionStats.ts | 2 +- .../sql/sessions/getWebsiteSessions.ts | 4 +- src/queries/sql/sessions/saveSessionData.ts | 6 +- src/store/app.ts | 2 +- src/store/version.ts | 4 +- src/store/websites.ts | 4 +- src/tracker/index.d.ts | 2 +- src/tracker/index.js | 26 +- 558 files changed, 2108 insertions(+), 2379 deletions(-) diff --git a/biome.json b/biome.json index 847b1dc0..0dec793b 100644 --- a/biome.json +++ b/biome.json @@ -26,8 +26,13 @@ "style": { "noDescendingSpecificity": "off" }, + "complexity": { + "noImportantStyles": "off" + }, "suspicious": { - "noExplicitAny": "off" + "noArrayIndexKey": "off", + "noExplicitAny": "off", + "noImplicitAnyLet": "off" }, "performance": { "noImgElement": "off" diff --git a/docker/middleware.ts b/docker/middleware.ts index 3fd7f20e..4b189df8 100644 --- a/docker/middleware.ts +++ b/docker/middleware.ts @@ -1,4 +1,4 @@ -import { NextRequest, NextResponse } from 'next/server'; +import { type NextRequest, NextResponse } from 'next/server'; export const config = { matcher: '/:path*', diff --git a/package.json b/package.json index d8ca9cfd..306e10f3 100644 --- a/package.json +++ b/package.json @@ -49,11 +49,11 @@ "cypress-run": "cypress run cypress run", "lint": "biome lint .", "format": "biome format --write .", - "check": "biome check --apply" + "check": "biome check --write" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,json,css}": [ - "npm run format" + "biome check --write --no-errors-on-unmatched --files-ignore-unknown=true" ] }, "cacheDirectories": [ @@ -89,7 +89,6 @@ "detect-browser": "^5.2.0", "dotenv": "^17.2.3", "esbuild": "^0.25.11", - "eslint-plugin-promise": "^6.1.1", "fs-extra": "^11.3.2", "immer": "^10.2.0", "ipaddr.js": "^2.0.1", @@ -141,8 +140,6 @@ "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@types/react-window": "^1.8.8", - "@typescript-eslint/eslint-plugin": "^8.46.2", - "@typescript-eslint/parser": "^8.46.2", "babel-plugin-react-compiler": "19.1.0-rc.2", "cross-env": "^10.1.0", "cypress": "^13.6.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92a8bd32..5db0535d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@clickhouse/client': specifier: ^1.12.0 - version: 1.12.1 + version: 1.14.0 '@date-fns/utc': specifier: ^1.2.0 version: 1.2.0 @@ -25,16 +25,16 @@ importers: version: 5.2.8 '@hello-pangea/dnd': specifier: ^17.0.0 - version: 17.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 17.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@prisma/adapter-pg': specifier: ^7.0.0 version: 7.0.0 '@prisma/client': specifier: ^7.0.0 - version: 7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + version: 7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) '@prisma/extension-read-replicas': specifier: ^0.4.1 - version: 0.4.1(@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)) + version: 0.4.1(@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)) '@react-spring/web': specifier: ^10.0.3 version: 10.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -43,16 +43,16 @@ importers: version: 8.1.0(typescript@5.9.3) '@tanstack/react-query': specifier: ^5.90.5 - version: 5.90.5(react@19.2.0) + version: 5.90.10(react@19.2.0) '@umami/react-zen': specifier: ^0.210.0 - version: 0.210.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + version: 0.210.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) '@umami/redis-client': specifier: ^0.29.0 version: 0.29.0 bcryptjs: specifier: ^3.0.2 - version: 3.0.2 + version: 3.0.3 chalk: specifier: ^5.6.2 version: 5.6.2 @@ -94,10 +94,7 @@ importers: version: 17.2.3 esbuild: specifier: ^0.25.11 - version: 0.25.11 - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.6.0(eslint@8.57.1) + version: 0.25.12 fs-extra: specifier: ^11.3.2 version: 11.3.2 @@ -118,7 +115,7 @@ importers: version: 2.0.0 isbot: specifier: ^5.1.31 - version: 5.1.31 + version: 5.1.32 jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 @@ -133,7 +130,7 @@ importers: version: 0.543.0(react@19.2.0) maxmind: specifier: ^5.0.0 - version: 5.0.0 + version: 5.0.1 next: specifier: 15.5.3 version: 15.5.3(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -151,7 +148,7 @@ importers: version: 8.16.3 prisma: specifier: ^7.0.0 - version: 7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + version: 7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) pure-rand: specifier: ^7.0.1 version: 7.0.1 @@ -199,59 +196,53 @@ importers: version: 4.1.12 zustand: specifier: ^5.0.8 - version: 5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + version: 5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) devDependencies: '@biomejs/biome': specifier: ^2.3.6 - version: 2.3.6 + version: 2.3.7 '@formatjs/cli': specifier: ^4.2.29 - version: 4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)) + version: 4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@netlify/plugin-nextjs': specifier: ^5.14.4 - version: 5.14.4 + version: 5.14.7 '@rollup/plugin-alias': specifier: ^5.0.0 - version: 5.1.1(rollup@4.52.5) + version: 5.1.1(rollup@4.53.3) '@rollup/plugin-commonjs': specifier: ^25.0.4 - version: 25.0.8(rollup@4.52.5) + version: 25.0.8(rollup@4.53.3) '@rollup/plugin-json': specifier: ^6.0.0 - version: 6.1.0(rollup@4.52.5) + version: 6.1.0(rollup@4.53.3) '@rollup/plugin-node-resolve': specifier: ^15.2.0 - version: 15.3.1(rollup@4.52.5) + version: 15.3.1(rollup@4.53.3) '@rollup/plugin-replace': specifier: ^5.0.2 - version: 5.0.7(rollup@4.52.5) + version: 5.0.7(rollup@4.53.3) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.52.5) + version: 0.4.4(rollup@4.53.3) '@rollup/plugin-typescript': specifier: ^12.3.0 - version: 12.3.0(rollup@4.52.5)(tslib@2.8.1)(typescript@5.9.3) + version: 12.3.0(rollup@4.53.3)(tslib@2.8.1)(typescript@5.9.3) '@types/jest': specifier: ^30.0.0 version: 30.0.0 '@types/node': specifier: ^24.9.2 - version: 24.9.2 + version: 24.10.1 '@types/react': specifier: ^19.2.2 - version: 19.2.2 + version: 19.2.6 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.3(@types/react@19.2.6) '@types/react-window': specifier: ^1.8.8 version: 1.8.8 - '@typescript-eslint/eslint-plugin': - specifier: ^8.46.2 - version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: ^8.46.2 - version: 8.46.2(eslint@8.57.1)(typescript@5.9.3) babel-plugin-react-compiler: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2 @@ -263,16 +254,16 @@ importers: version: 13.17.0 extract-react-intl-messages: specifier: ^4.1.1 - version: 4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)) + version: 4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) husky: specifier: ^9.1.7 version: 9.1.7 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) lint-staged: specifier: ^16.2.6 - version: 16.2.6 + version: 16.2.7 postcss: specifier: ^8.5.6 version: 8.5.6 @@ -290,25 +281,25 @@ importers: version: 2.4.2 rollup: specifier: ^4.52.5 - version: 4.52.5 + version: 4.53.3 rollup-plugin-copy: specifier: ^3.4.0 version: 3.5.0 rollup-plugin-delete: specifier: ^3.0.1 - version: 3.0.1(rollup@4.52.5) + version: 3.0.1(rollup@4.53.3) rollup-plugin-dts: specifier: ^6.2.3 - version: 6.2.3(rollup@4.52.5)(typescript@5.9.3) + version: 6.2.3(rollup@4.53.3)(typescript@5.9.3) rollup-plugin-node-externals: specifier: ^8.1.1 - version: 8.1.1(rollup@4.52.5) + version: 8.1.2(rollup@4.53.3) rollup-plugin-peer-deps-external: specifier: ^2.2.4 - version: 2.2.4(rollup@4.52.5) + version: 2.2.4(rollup@4.53.3) rollup-plugin-postcss: specifier: ^4.0.2 - version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) stylelint: specifier: ^15.10.1 version: 15.11.0(typescript@5.9.3) @@ -326,13 +317,13 @@ importers: version: 6.2.1 ts-jest: specifier: ^29.4.5 - version: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: ^10.9.1 - version: 10.9.2(@types/node@24.9.2)(typescript@5.9.3) + version: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) tsup: specifier: ^8.5.0 - version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -514,55 +505,55 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biomejs/biome@2.3.6': - resolution: {integrity: sha512-oqUhWyU6tae0MFsr/7iLe++QWRg+6jtUhlx9/0GmCWDYFFrK366sBLamNM7D9Y+c7YSynUFKr8lpEp1r6Sk7eA==} + '@biomejs/biome@2.3.7': + resolution: {integrity: sha512-CTbAS/jNAiUc6rcq94BrTB8z83O9+BsgWj2sBCQg9rD6Wkh2gjfR87usjx0Ncx0zGXP1NKgT7JNglay5Zfs9jw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.3.6': - resolution: {integrity: sha512-P4JWE5d8UayBxYe197QJwyW4ZHp0B+zvRIGCusOm1WbxmlhpAQA1zEqQuunHgSIzvyEEp4TVxiKGXNFZPg7r9Q==} + '@biomejs/cli-darwin-arm64@2.3.7': + resolution: {integrity: sha512-LirkamEwzIUULhXcf2D5b+NatXKeqhOwilM+5eRkbrnr6daKz9rsBL0kNZ16Hcy4b8RFq22SG4tcLwM+yx/wFA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.3.6': - resolution: {integrity: sha512-I4rTebj+F/L9K93IU7yTFs8nQ6EhaCOivxduRha4w4WEZK80yoZ8OAdR1F33m4yJ/NfUuTUbP/Wjs+vKjlCoWA==} + '@biomejs/cli-darwin-x64@2.3.7': + resolution: {integrity: sha512-Q4TO633kvrMQkKIV7wmf8HXwF0dhdTD9S458LGE24TYgBjSRbuhvio4D5eOQzirEYg6eqxfs53ga/rbdd8nBKg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.6': - resolution: {integrity: sha512-oK1NpIXIixbJ/4Tcx40cwiieqah6rRUtMGOHDeK2ToT7yUFVEvXUGRKqH0O4hqZ9tW8TcXNZKfgRH6xrsjVtGg==} + '@biomejs/cli-linux-arm64-musl@2.3.7': + resolution: {integrity: sha512-/afy8lto4CB8scWfMdt+NoCZtatBUF62Tk3ilWH2w8ENd5spLhM77zKlFZEvsKJv9AFNHknMl03zO67CiklL2Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.3.6': - resolution: {integrity: sha512-JjYy83eVBnvuINZiqyFO7xx72v8Srh4hsgaacSBCjC22DwM6+ZvnX1/fj8/SBiLuUOfZ8YhU2pfq2Dzakeyg1A==} + '@biomejs/cli-linux-arm64@2.3.7': + resolution: {integrity: sha512-inHOTdlstUBzgjDcx0ge71U4SVTbwAljmkfi3MC5WzsYCRhancqfeL+sa4Ke6v2ND53WIwCFD5hGsYExoI3EZQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.3.6': - resolution: {integrity: sha512-QvxB8GHQeaO4FCtwJpJjCgJkbHBbWxRHUxQlod+xeaYE6gtJdSkYkuxdKAQUZEOIsec+PeaDAhW9xjzYbwmOFA==} + '@biomejs/cli-linux-x64-musl@2.3.7': + resolution: {integrity: sha512-CQUtgH1tIN6e5wiYSJqzSwJumHYolNtaj1dwZGCnZXm2PZU1jOJof9TsyiP3bXNDb+VOR7oo7ZvY01If0W3iFQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.3.6': - resolution: {integrity: sha512-ZjPXzy5yN9wusIoX+8Zp4p6cL8r0NzJCXg/4r1KLVveIPXd2jKVlqZ6ZyzEq385WwU3OX5KOwQYLQsOc788waQ==} + '@biomejs/cli-linux-x64@2.3.7': + resolution: {integrity: sha512-fJMc3ZEuo/NaMYo5rvoWjdSS5/uVSW+HPRQujucpZqm2ZCq71b8MKJ9U4th9yrv2L5+5NjPF0nqqILCl8HY/fg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.3.6': - resolution: {integrity: sha512-YM7hLHpwjdt8R7+O2zS1Vo2cKgqEeptiXB1tWW1rgjN5LlpZovBVKtg7zfwfRrFx3i08aNZThYpTcowpTlczug==} + '@biomejs/cli-win32-arm64@2.3.7': + resolution: {integrity: sha512-aJAE8eCNyRpcfx2JJAtsPtISnELJ0H4xVVSwnxm13bzI8RwbXMyVtxy2r5DV1xT3WiSP+7LxORcApWw0LM8HiA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.6': - resolution: {integrity: sha512-psgNEYgMAobY5h+QHRBVR9xvg2KocFuBKm6axZWB/aD12NWhQjiVFQUjV6wMXhlH4iT0Q9c3yK5JFRiDC/rzHA==} + '@biomejs/cli-win32-x64@2.3.7': + resolution: {integrity: sha512-pulzUshqv9Ed//MiE8MOUeeEkbkSHVDVY5Cz5wVAnH1DUqliCQG3j6s1POaITTFqFfo7AVIx2sWdKpx/GS+Nqw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -579,11 +570,11 @@ packages: '@chevrotain/utils@10.5.0': resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==} - '@clickhouse/client-common@1.12.1': - resolution: {integrity: sha512-ccw1N6hB4+MyaAHIaWBwGZ6O2GgMlO99FlMj0B0UEGfjxM9v5dYVYql6FpP19rMwrVAroYs/IgX2vyZEBvzQLg==} + '@clickhouse/client-common@1.14.0': + resolution: {integrity: sha512-CyUcv2iCkZ1A++vmOSufYRpHR3aAWVfbrWed7ATzf0yyx/BW/2SEqlL07vBpSRa3BIkQe/DSOHVv8JkWZpUOwQ==} - '@clickhouse/client@1.12.1': - resolution: {integrity: sha512-7ORY85rphRazqHzImNXMrh4vsaPrpetFoTWpZYueCO2bbO6PXYDXp/GQ4DgxnGIqbWB/Di1Ai+Xuwq2o7DJ36A==} + '@clickhouse/client@1.14.0': + resolution: {integrity: sha512-co2spjR7wZoZ3Ck0H/jv76bpiuO3oJHtOmq9/gxFiod2DcT9NFg01u/hXcG8MJFnEJuMB6e3vGqS6IOnLwHqRw==} engines: {node: '>=16'} '@colors/colors@1.5.0': @@ -930,183 +921,317 @@ packages: '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} - '@esbuild/aix-ppc64@0.25.11': - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.11': - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.11': - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.11': - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.11': - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.11': - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.11': - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.11': - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.11': - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.11': - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': - resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.11': - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.11': - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.11': - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] '@fontsource/inter@5.2.8': resolution: {integrity: sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==} @@ -1190,19 +1315,6 @@ packages: peerDependencies: hono: ^4 - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} @@ -1610,8 +1722,8 @@ packages: resolution: {integrity: sha512-JwqeCQ1U3fvccttHZq7Tk0m/TMC6WcFAQZdukypW3AzlJYKYTGNVd1ANU2GuhKnv4UQuOFj3oAl0LLG/gxFN1w==} engines: {node: '>=16'} - '@netlify/plugin-nextjs@5.14.4': - resolution: {integrity: sha512-HnMHG0tksVoS2E6ImcX9o/EcVH1dckb8ZL1FyghKRsEPYCo+20hQ6zncd5EEOW7K22UN+n1EprCROWUmsbhYMg==} + '@netlify/plugin-nextjs@5.14.7': + resolution: {integrity: sha512-RJRPGIlaY3M4KA6GxpOlynCPUKCVbtkHwg4ccHhoSVrHgysW3nqw1pX+FBvlBexrUl1JO2zuDFh4enRal9BpAw==} engines: {node: '>=18.0.0'} '@next/env@15.5.3': @@ -2540,113 +2652,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.5': - resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.5': - resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.5': - resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.5': - resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.5': - resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.5': - resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': - resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.5': - resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.5': - resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.5': - resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.5': - resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.5': - resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.5': - resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.5': - resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.5': - resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.5': - resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.5': - resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.5': - resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.5': - resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.5': - resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.5': - resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.5': - resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} cpu: [x64] os: [win32] @@ -2760,11 +2872,11 @@ packages: '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@tanstack/query-core@5.90.5': - resolution: {integrity: sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==} + '@tanstack/query-core@5.90.10': + resolution: {integrity: sha512-EhZVFu9rl7GfRNuJLJ3Y7wtbTnENsvzp+YpcAV7kCYiXni1v8qZh++lpw4ch4rrwC0u/EZRnBHIehzCGzwXDSQ==} - '@tanstack/react-query@5.90.5': - resolution: {integrity: sha512-pN+8UWpxZkEJ/Rnnj2v2Sxpx1WFlaa9L6a4UO89p6tTQbeo+m0MS8oYDjbggrR8QcTyjKoYWKS3xJQGr3ExT8Q==} + '@tanstack/react-query@5.90.10': + resolution: {integrity: sha512-BKLss9Y8PQ9IUjPYQiv3/Zmlx92uxffUOX8ZZNoQlCIZBJPT5M+GOMQj7xislvVQ6l1BstBjcX0XB/aHfFYVNw==} peerDependencies: react: ^18 || ^19 @@ -2848,22 +2960,22 @@ packages: '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} - '@types/node@24.9.2': - resolution: {integrity: sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==} + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/react-dom@19.2.2': - resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 '@types/react-window@1.8.8': resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==} - '@types/react@19.2.2': - resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} + '@types/react@19.2.6': + resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -2893,74 +3005,12 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.46.2': - resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.46.2 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.46.2': - resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.46.2': - resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.46.2': - resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.46.2': - resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.46.2': - resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/types@8.46.2': - resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.46.2': - resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.46.2': - resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/visitor-keys@8.46.2': - resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@umami/react-zen@0.210.0': resolution: {integrity: sha512-nQ8EfrSleuXMPBVabr6rDoH2VS0ca41A3V2OCQbG4HqgLJ5+Mj8gHT/aLqUz5EKNBAmMy0/XxPNAgsHwwoxrCQ==} '@umami/redis-client@0.29.0': resolution: {integrity: sha512-Jaqh++jskqDB7ny75pfC02OvKp1JTS4asGDsFrRL3qy8sxL3PAl9+/mybCJe4/6vWrXDJKqpgkSfUDJq2bFjyw==} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vue/compiler-core@3.5.18': resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} @@ -2990,11 +3040,6 @@ packages: '@vue/shared@3.5.18': resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} @@ -3184,8 +3229,8 @@ packages: bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - bcryptjs@3.0.2: - resolution: {integrity: sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==} + bcryptjs@3.0.3: + resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==} hasBin: true blob-util@2.0.2: @@ -3437,8 +3482,8 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@14.0.1: - resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} commander@2.20.3: @@ -3624,8 +3669,8 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} currently-unhandled@0.4.1: resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} @@ -3747,9 +3792,6 @@ packages: babel-plugin-macros: optional: true - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge-ts@7.1.5: resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} engines: {node: '>=16.0.0'} @@ -3822,10 +3864,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -3941,8 +3979,13 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.11: - resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} engines: {node: '>=18'} hasBin: true @@ -3958,65 +4001,17 @@ packages: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-plugin-promise@6.6.0: - resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - eventemitter2@6.4.7: resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} @@ -4084,9 +4079,6 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} @@ -4120,10 +4112,6 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-entry-cache@7.0.2: resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} engines: {node: '>=12.0.0'} @@ -4277,14 +4265,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true @@ -4310,10 +4290,6 @@ packages: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -4343,9 +4319,6 @@ packages: grammex@3.1.11: resolution: {integrity: sha512-HNwLkgRg9SqTAd1N3Uh/MnKwTBTzwBxTOPbXQ8pb0tpwydjk90k4zRE8JUn9fMUiRwKtXFZ1TWFmms3dZHN+Fg==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -4726,8 +4699,8 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.31: - resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} + isbot@5.1.32: + resolution: {integrity: sha512-VNfjM73zz2IBZmdShMfAUg10prm6t7HFUQmNAEOAVS4YH92ZrZcvkMcGX6cIgBJAzWDzPent/EeAtYEHNPNPBQ==} engines: {node: '>=18'} isexe@2.0.0: @@ -4935,10 +4908,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} @@ -4965,9 +4934,6 @@ packages: json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stable-stringify@1.3.0: resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} engines: {node: '>= 0.4'} @@ -5035,10 +5001,6 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -5053,8 +5015,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@16.2.6: - resolution: {integrity: sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==} + lint-staged@16.2.7: + resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} engines: {node: '>=20.17'} hasBin: true @@ -5132,9 +5094,6 @@ packages: resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} deprecated: This package is deprecated. Use destructuring assignment syntax instead. - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -5233,8 +5192,8 @@ packages: mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - maxmind@5.0.0: - resolution: {integrity: sha512-ndhnbeQWKuiBU17BJ6cybUnvcyvNXaK+1VM5n9/I7+TIqAYFLDvX1DSoVfE1hgvZfudvAU9Ts1CW5sxYq/M8dA==} + maxmind@5.0.1: + resolution: {integrity: sha512-hYxQxvHkBUlyF34f7IlQOb60rytezCi2oZ8H/BtZpcoodXTlcK1eLgf7kY2TofHqBC3o+Hqtvde9kS72gFQSDw==} engines: {node: '>=12', npm: '>=6'} mdn-data@2.0.14: @@ -5512,10 +5471,6 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - ospath@1.2.2: resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} @@ -6172,10 +6127,6 @@ packages: resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} engines: {node: '>=12'} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -6497,8 +6448,8 @@ packages: rollup: ^3.29.4 || ^4 typescript: ^4.5 || ^5.0 - rollup-plugin-node-externals@8.1.1: - resolution: {integrity: sha512-MEWJmXMGjo5E7o9hgAmma6XLCdU9gTVRcaaCubugTJdoJD3A91qxtxiukT9k2PeUdogtCaNehV3pvJUWrRNtwg==} + rollup-plugin-node-externals@8.1.2: + resolution: {integrity: sha512-EuB6/lolkMLK16gvibUjikERq5fCRVIGwD2xue/CrM8D0pz5GXD2V6N8IrgxegwbcUoKkUFI8VYCEEv8MMvgpA==} engines: {node: '>= 21 || ^20.6.0 || ^18.19.0'} peerDependencies: rollup: ^4.0.0 @@ -6517,8 +6468,8 @@ packages: rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - rollup@4.52.5: - resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -6698,10 +6649,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -6936,9 +6886,6 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenby@1.3.4: resolution: {integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==} @@ -6958,8 +6905,8 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tiny-lru@11.3.4: - resolution: {integrity: sha512-UxWEfRKpFCabAf6fkTNdlfSw/RDUJ/4C6i1aLZaDnGF82PERHyYhz5CMCVYXtLt34LbqgfpJ2bjmgGKgxuF/6A==} + tiny-lru@11.4.5: + resolution: {integrity: sha512-hkcz3FjNJfKXjV4mjQ1OrXSLAehg8Hw+cEZclOVT+5c/cWQWImQ9wolzTjth+dmmDe++p3bme3fTxz6Q4Etsqw==} engines: {node: '>=12'} tinyexec@0.3.2: @@ -6999,9 +6946,6 @@ packages: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -7014,12 +6958,6 @@ packages: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} engines: {node: '>=12'} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -7067,8 +7005,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.5.0: - resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -7092,10 +7030,6 @@ packages: tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -7104,10 +7038,6 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -7271,12 +7201,6 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -7302,10 +7226,6 @@ packages: engines: {node: '>= 8'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -7615,39 +7535,39 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@2.3.6': + '@biomejs/biome@2.3.7': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.6 - '@biomejs/cli-darwin-x64': 2.3.6 - '@biomejs/cli-linux-arm64': 2.3.6 - '@biomejs/cli-linux-arm64-musl': 2.3.6 - '@biomejs/cli-linux-x64': 2.3.6 - '@biomejs/cli-linux-x64-musl': 2.3.6 - '@biomejs/cli-win32-arm64': 2.3.6 - '@biomejs/cli-win32-x64': 2.3.6 + '@biomejs/cli-darwin-arm64': 2.3.7 + '@biomejs/cli-darwin-x64': 2.3.7 + '@biomejs/cli-linux-arm64': 2.3.7 + '@biomejs/cli-linux-arm64-musl': 2.3.7 + '@biomejs/cli-linux-x64': 2.3.7 + '@biomejs/cli-linux-x64-musl': 2.3.7 + '@biomejs/cli-win32-arm64': 2.3.7 + '@biomejs/cli-win32-x64': 2.3.7 - '@biomejs/cli-darwin-arm64@2.3.6': + '@biomejs/cli-darwin-arm64@2.3.7': optional: true - '@biomejs/cli-darwin-x64@2.3.6': + '@biomejs/cli-darwin-x64@2.3.7': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.6': + '@biomejs/cli-linux-arm64-musl@2.3.7': optional: true - '@biomejs/cli-linux-arm64@2.3.6': + '@biomejs/cli-linux-arm64@2.3.7': optional: true - '@biomejs/cli-linux-x64-musl@2.3.6': + '@biomejs/cli-linux-x64-musl@2.3.7': optional: true - '@biomejs/cli-linux-x64@2.3.6': + '@biomejs/cli-linux-x64@2.3.7': optional: true - '@biomejs/cli-win32-arm64@2.3.6': + '@biomejs/cli-win32-arm64@2.3.7': optional: true - '@biomejs/cli-win32-x64@2.3.6': + '@biomejs/cli-win32-x64@2.3.7': optional: true '@chevrotain/cst-dts-gen@10.5.0': @@ -7665,11 +7585,11 @@ snapshots: '@chevrotain/utils@10.5.0': {} - '@clickhouse/client-common@1.12.1': {} + '@clickhouse/client-common@1.14.0': {} - '@clickhouse/client@1.12.1': + '@clickhouse/client@1.14.0': dependencies: - '@clickhouse/client-common': 1.12.1 + '@clickhouse/client-common': 1.14.0 '@colors/colors@1.5.0': optional: true @@ -7981,117 +7901,170 @@ snapshots: '@epic-web/invariant@1.0.0': {} - '@esbuild/aix-ppc64@0.25.11': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.11': + '@esbuild/aix-ppc64@0.27.0': optional: true - '@esbuild/android-arm@0.25.11': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-x64@0.25.11': + '@esbuild/android-arm64@0.27.0': optional: true - '@esbuild/darwin-arm64@0.25.11': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.11': + '@esbuild/android-arm@0.27.0': optional: true - '@esbuild/freebsd-arm64@0.25.11': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.11': + '@esbuild/android-x64@0.27.0': optional: true - '@esbuild/linux-arm64@0.25.11': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.25.11': + '@esbuild/darwin-arm64@0.27.0': optional: true - '@esbuild/linux-ia32@0.25.11': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.11': + '@esbuild/darwin-x64@0.27.0': optional: true - '@esbuild/linux-mips64el@0.25.11': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.11': + '@esbuild/freebsd-arm64@0.27.0': optional: true - '@esbuild/linux-riscv64@0.25.11': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.11': + '@esbuild/freebsd-x64@0.27.0': optional: true - '@esbuild/linux-x64@0.25.11': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.11': + '@esbuild/linux-arm64@0.27.0': optional: true - '@esbuild/netbsd-x64@0.25.11': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.11': + '@esbuild/linux-arm@0.27.0': optional: true - '@esbuild/openbsd-x64@0.25.11': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.11': + '@esbuild/linux-ia32@0.27.0': optional: true - '@esbuild/sunos-x64@0.25.11': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/win32-arm64@0.25.11': + '@esbuild/linux-loong64@0.27.0': optional: true - '@esbuild/win32-ia32@0.25.11': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/win32-x64@0.25.11': + '@esbuild/linux-mips64el@0.27.0': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 + '@esbuild/linux-ppc64@0.25.12': + optional: true - '@eslint-community/regexpp@4.12.1': {} + '@esbuild/linux-ppc64@0.27.0': + optional: true - '@eslint-community/regexpp@4.12.2': {} + '@esbuild/linux-riscv64@0.25.12': + optional: true - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.3(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@esbuild/linux-riscv64@0.27.0': + optional: true - '@eslint/js@8.57.1': {} + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.0': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.0': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.0': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.0': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.0': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.0': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.0': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.0': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.0': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.0': + optional: true '@fontsource/inter@5.2.8': {} '@fontsource/jetbrains-mono@5.2.8': {} - '@formatjs/cli@4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/cli@4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: '@formatjs/icu-messageformat-parser': 2.1.0 - '@formatjs/ts-transformer': 3.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)) + '@formatjs/ts-transformer': 3.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@types/estree': 0.0.50 '@types/fs-extra': 9.0.13 '@types/json-stable-stringify': 1.2.0 @@ -8178,15 +8151,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@formatjs/ts-transformer@2.13.0(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/ts-transformer@2.13.0(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: intl-messageformat-parser: 6.1.2 tslib: 2.8.1 typescript: 4.9.5 optionalDependencies: - ts-jest: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) - '@formatjs/ts-transformer@3.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/ts-transformer@3.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: '@formatjs/icu-messageformat-parser': 2.1.0 '@types/node': 14.18.63 @@ -8194,9 +8167,9 @@ snapshots: tslib: 2.8.1 typescript: 4.9.5 optionalDependencies: - ts-jest: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) - '@hello-pangea/dnd@17.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@hello-pangea/dnd@17.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.3 css-box-model: 1.2.1 @@ -8204,7 +8177,7 @@ snapshots: raf-schd: 4.0.3 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-redux: 9.2.0(@types/react@19.2.2)(react@19.2.0)(redux@5.0.1) + react-redux: 9.2.0(@types/react@19.2.6)(react@19.2.0)(redux@5.0.1) redux: 5.0.1 use-memo-one: 1.1.3(react@19.2.0) transitivePeerDependencies: @@ -8214,18 +8187,6 @@ snapshots: dependencies: hono: 4.7.10 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - '@img/colour@1.0.0': optional: true @@ -8454,27 +8415,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -8501,7 +8462,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -8523,7 +8484,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.9.2 + '@types/node': 24.10.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -8541,7 +8502,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.1 jest-regex-util: 30.0.1 '@jest/reporters@29.7.0': @@ -8552,7 +8513,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.30 - '@types/node': 24.9.2 + '@types/node': 24.10.1 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -8626,7 +8587,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.9.2 + '@types/node': 24.10.1 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -8636,7 +8597,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.9.2 + '@types/node': 24.10.1 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -8671,7 +8632,7 @@ snapshots: chevrotain: 10.5.0 lilconfig: 2.1.0 - '@netlify/plugin-nextjs@5.14.4': {} + '@netlify/plugin-nextjs@5.14.7': {} '@next/env@15.5.3': {} @@ -8750,11 +8711,11 @@ snapshots: '@prisma/client-runtime-utils@7.0.0': {} - '@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)': + '@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@prisma/client-runtime-utils': 7.0.0 optionalDependencies: - prisma: 7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + prisma: 7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) typescript: 5.9.3 '@prisma/config@7.0.0': @@ -8805,9 +8766,9 @@ snapshots: '@prisma/fetch-engine': 7.0.0 '@prisma/get-platform': 7.0.0 - '@prisma/extension-read-replicas@0.4.1(@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3))': + '@prisma/extension-read-replicas@0.4.1(@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3))': dependencies: - '@prisma/client': 7.0.0(prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + '@prisma/client': 7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) '@prisma/fetch-engine@7.0.0': dependencies: @@ -8825,9 +8786,9 @@ snapshots: '@prisma/query-plan-executor@6.18.0': {} - '@prisma/studio-core-licensed@0.8.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@prisma/studio-core-licensed@0.8.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -9962,133 +9923,133 @@ snapshots: dependencies: '@redis/client': 1.6.1 - '@rollup/plugin-alias@5.1.1(rollup@4.52.5)': + '@rollup/plugin-alias@5.1.1(rollup@4.53.3)': optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-commonjs@25.0.8(rollup@4.52.5)': + '@rollup/plugin-commonjs@25.0.8(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@rollup/pluginutils': 5.2.0(rollup@4.53.3) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.17 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-json@6.1.0(rollup@4.52.5)': + '@rollup/plugin-json@6.1.0(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@rollup/pluginutils': 5.2.0(rollup@4.53.3) optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.52.5)': + '@rollup/plugin-node-resolve@15.3.1(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@rollup/pluginutils': 5.2.0(rollup@4.53.3) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-replace@5.0.7(rollup@4.52.5)': + '@rollup/plugin-replace@5.0.7(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@rollup/pluginutils': 5.2.0(rollup@4.53.3) magic-string: 0.30.17 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-terser@0.4.4(rollup@4.52.5)': + '@rollup/plugin-terser@0.4.4(rollup@4.53.3)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-typescript@12.3.0(rollup@4.52.5)(tslib@2.8.1)(typescript@5.9.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.53.3)(tslib@2.8.1)(typescript@5.9.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@rollup/pluginutils': 5.2.0(rollup@4.53.3) resolve: 1.22.10 typescript: 5.9.3 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.52.5)': + '@rollup/pluginutils@5.2.0(rollup@4.53.3)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/rollup-android-arm-eabi@4.52.5': + '@rollup/rollup-android-arm-eabi@4.53.3': optional: true - '@rollup/rollup-android-arm64@4.52.5': + '@rollup/rollup-android-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-arm64@4.52.5': + '@rollup/rollup-darwin-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-x64@4.52.5': + '@rollup/rollup-darwin-x64@4.53.3': optional: true - '@rollup/rollup-freebsd-arm64@4.52.5': + '@rollup/rollup-freebsd-arm64@4.53.3': optional: true - '@rollup/rollup-freebsd-x64@4.52.5': + '@rollup/rollup-freebsd-x64@4.53.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.5': + '@rollup/rollup-linux-arm-musleabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.5': + '@rollup/rollup-linux-arm64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.5': + '@rollup/rollup-linux-arm64-musl@4.53.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.5': + '@rollup/rollup-linux-loong64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.5': + '@rollup/rollup-linux-ppc64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.5': + '@rollup/rollup-linux-riscv64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.5': + '@rollup/rollup-linux-riscv64-musl@4.53.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.5': + '@rollup/rollup-linux-s390x-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.5': + '@rollup/rollup-linux-x64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-musl@4.52.5': + '@rollup/rollup-linux-x64-musl@4.53.3': optional: true - '@rollup/rollup-openharmony-arm64@4.52.5': + '@rollup/rollup-openharmony-arm64@4.53.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.5': + '@rollup/rollup-win32-arm64-msvc@4.53.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.5': + '@rollup/rollup-win32-ia32-msvc@4.53.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.5': + '@rollup/rollup-win32-x64-gnu@4.53.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.5': + '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true '@sinclair/typebox@0.27.8': {} @@ -10216,11 +10177,11 @@ snapshots: dependencies: tslib: 2.8.1 - '@tanstack/query-core@5.90.5': {} + '@tanstack/query-core@5.90.10': {} - '@tanstack/react-query@5.90.5(react@19.2.0)': + '@tanstack/react-query@5.90.10(react@19.2.0)': dependencies: - '@tanstack/query-core': 5.90.5 + '@tanstack/query-core': 5.90.10 react: 19.2.0 '@trysound/sax@0.2.0': {} @@ -10260,24 +10221,24 @@ snapshots: '@types/fs-extra@8.1.5': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.1 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.1 '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 24.9.2 + '@types/node': 24.10.1 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.1 - '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.2)': + '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.6)': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.6 hoist-non-react-statics: 3.3.2 '@types/istanbul-lib-coverage@2.0.6': {} @@ -10309,23 +10270,23 @@ snapshots: '@types/node@14.18.63': {} - '@types/node@24.9.2': + '@types/node@24.10.1': dependencies: undici-types: 7.16.0 '@types/normalize-package-data@2.4.4': {} - '@types/react-dom@19.2.2(@types/react@19.2.2)': + '@types/react-dom@19.2.3(@types/react@19.2.6)': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.6 '@types/react-window@1.8.8': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.6 - '@types/react@19.2.2': + '@types/react@19.2.6': dependencies: - csstype: 3.1.3 + csstype: 3.2.3 '@types/resolve@1.20.2': {} @@ -10349,103 +10310,10 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.1 optional: true - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.2(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.46.2(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 - debug: 4.4.3(supports-color@8.1.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.46.2': - dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 - - '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.46.2(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@8.57.1)(typescript@5.9.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.46.2': {} - - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 - debug: 4.4.3(supports-color@8.1.1) - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.46.2(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - eslint: 8.57.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.46.2': - dependencies: - '@typescript-eslint/types': 8.46.2 - eslint-visitor-keys: 4.2.1 - - '@umami/react-zen@0.210.0(@babel/core@7.28.3)(@types/react@19.2.2)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': + '@umami/react-zen@0.210.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 '@internationalized/date': 3.10.0 @@ -10462,7 +10330,7 @@ snapshots: react-hook-form: 7.66.1(react@19.2.0) react-icons: 5.5.0(react@19.2.0) thenby: 1.3.4 - zustand: 5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + zustand: 5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' @@ -10481,8 +10349,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@ungap/structured-clone@1.3.0': {} - '@vue/compiler-core@3.5.18': dependencies: '@babel/parser': 7.28.3 @@ -10527,7 +10393,7 @@ snapshots: '@vue/reactivity': 3.5.18 '@vue/runtime-core': 3.5.18 '@vue/shared': 3.5.18 - csstype: 3.1.3 + csstype: 3.2.3 '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.9.3))': dependencies: @@ -10537,10 +10403,6 @@ snapshots: '@vue/shared@3.5.18': {} - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - acorn-walk@8.3.4: dependencies: acorn: 8.15.0 @@ -10704,12 +10566,12 @@ snapshots: dependencies: '@babel/types': 7.28.2 - babel-plugin-react-intl@7.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)): + babel-plugin-react-intl@7.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/types': 7.28.2 - '@formatjs/ts-transformer': 2.13.0(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)) + '@formatjs/ts-transformer': 2.13.0(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@types/babel__core': 7.20.5 '@types/fs-extra': 9.0.13 '@types/schema-utils': 2.4.0 @@ -10755,7 +10617,7 @@ snapshots: dependencies: tweetnacl: 0.14.5 - bcryptjs@3.0.2: {} + bcryptjs@3.0.3: {} blob-util@2.0.2: {} @@ -10802,9 +10664,9 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bundle-require@5.1.0(esbuild@0.25.11): + bundle-require@5.1.0(esbuild@0.27.0): dependencies: - esbuild: 0.25.11 + esbuild: 0.27.0 load-tsconfig: 0.2.5 c12@3.1.0: @@ -11006,7 +10868,7 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@14.0.1: {} + commander@14.0.2: {} commander@2.20.3: {} @@ -11056,13 +10918,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 - create-jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)): + create-jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -11211,7 +11073,7 @@ snapshots: dependencies: css-tree: 2.2.1 - csstype@3.1.3: {} + csstype@3.2.3: {} currently-unhandled@0.4.1: dependencies: @@ -11368,8 +11230,6 @@ snapshots: dedent@1.6.0: {} - deep-is@0.1.4: {} - deepmerge-ts@7.1.5: {} deepmerge@4.3.1: {} @@ -11436,10 +11296,6 @@ snapshots: dependencies: path-type: 4.0.0 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 @@ -11614,34 +11470,63 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.11: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.11 - '@esbuild/android-arm': 0.25.11 - '@esbuild/android-arm64': 0.25.11 - '@esbuild/android-x64': 0.25.11 - '@esbuild/darwin-arm64': 0.25.11 - '@esbuild/darwin-x64': 0.25.11 - '@esbuild/freebsd-arm64': 0.25.11 - '@esbuild/freebsd-x64': 0.25.11 - '@esbuild/linux-arm': 0.25.11 - '@esbuild/linux-arm64': 0.25.11 - '@esbuild/linux-ia32': 0.25.11 - '@esbuild/linux-loong64': 0.25.11 - '@esbuild/linux-mips64el': 0.25.11 - '@esbuild/linux-ppc64': 0.25.11 - '@esbuild/linux-riscv64': 0.25.11 - '@esbuild/linux-s390x': 0.25.11 - '@esbuild/linux-x64': 0.25.11 - '@esbuild/netbsd-arm64': 0.25.11 - '@esbuild/netbsd-x64': 0.25.11 - '@esbuild/openbsd-arm64': 0.25.11 - '@esbuild/openbsd-x64': 0.25.11 - '@esbuild/openharmony-arm64': 0.25.11 - '@esbuild/sunos-x64': 0.25.11 - '@esbuild/win32-arm64': 0.25.11 - '@esbuild/win32-ia32': 0.25.11 - '@esbuild/win32-x64': 0.25.11 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 escalade@3.2.0: {} @@ -11649,88 +11534,12 @@ snapshots: escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} - - eslint-plugin-promise@6.6.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - estree-walker@0.6.1: {} estree-walker@2.0.2: {} - esutils@2.0.3: {} - eventemitter2@6.4.7: {} eventemitter3@4.0.7: {} @@ -11788,10 +11597,10 @@ snapshots: extend@3.0.2: {} - extract-react-intl-messages@4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)): + extract-react-intl-messages@4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): dependencies: '@babel/core': 7.28.3 - babel-plugin-react-intl: 7.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3)) + babel-plugin-react-intl: 7.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) flat: 5.0.2 glob: 7.2.3 js-yaml: 3.14.1 @@ -11837,8 +11646,6 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-levenshtein@2.0.6: {} - fast-uri@3.0.6: {} fastest-levenshtein@1.0.16: {} @@ -11868,10 +11675,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-entry-cache@7.0.2: dependencies: flat-cache: 3.2.0 @@ -11894,7 +11697,7 @@ snapshots: dependencies: magic-string: 0.30.18 mlly: 1.8.0 - rollup: 4.52.5 + rollup: 4.53.3 flat-cache@3.2.0: dependencies: @@ -12049,19 +11852,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@10.5.0: dependencies: foreground-child: 3.3.1 @@ -12102,10 +11892,6 @@ snapshots: kind-of: 6.0.3 which: 1.3.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -12148,8 +11934,6 @@ snapshots: grammex@3.1.11: {} - graphemer@1.4.0: {} - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -12469,7 +12253,7 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.31: {} + isbot@5.1.32: {} isexe@2.0.0: {} @@ -12534,7 +12318,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 @@ -12554,16 +12338,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)): + jest-cli@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + create-jest: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -12573,7 +12357,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)): + jest-config@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.3 '@jest/test-sequencer': 29.7.0 @@ -12598,8 +12382,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 24.9.2 - ts-node: 10.9.2(@types/node@24.9.2)(typescript@5.9.3) + '@types/node': 24.10.1 + ts-node: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -12635,7 +12419,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -12645,7 +12429,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.9.2 + '@types/node': 24.10.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -12703,13 +12487,13 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 jest-util: 29.7.0 jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.9.2 + '@types/node': 24.10.1 jest-util: 30.0.5 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -12746,7 +12530,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -12774,7 +12558,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -12820,7 +12604,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -12829,7 +12613,7 @@ snapshots: jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.9.2 + '@types/node': 24.10.1 chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 @@ -12848,7 +12632,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12857,17 +12641,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)): + jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + jest-cli: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -12889,10 +12673,6 @@ snapshots: dependencies: argparse: 2.0.1 - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - jsbn@0.1.1: {} jsesc@3.1.0: {} @@ -12909,8 +12689,6 @@ snapshots: json-schema@0.4.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json-stable-stringify@1.3.0: dependencies: call-bind: 1.0.8 @@ -12992,11 +12770,6 @@ snapshots: leven@3.1.0: {} - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lie@3.3.0: dependencies: immediate: 3.0.6 @@ -13007,9 +12780,9 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@16.2.6: + lint-staged@16.2.7: dependencies: - commander: 14.0.1 + commander: 14.0.2 listr2: 9.0.5 micromatch: 4.0.8 nano-spawn: 2.0.0 @@ -13089,8 +12862,6 @@ snapshots: lodash.pick@4.4.0: {} - lodash.sortby@4.7.0: {} - lodash.truncate@4.4.2: {} lodash.uniq@4.5.0: {} @@ -13184,10 +12955,10 @@ snapshots: mathml-tag-names@2.1.3: {} - maxmind@5.0.0: + maxmind@5.0.1: dependencies: mmdb-lib: 3.0.1 - tiny-lru: 11.3.4 + tiny-lru: 11.4.5 mdn-data@2.0.14: {} @@ -13483,15 +13254,6 @@ snapshots: dependencies: mimic-function: 5.0.1 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - ospath@1.2.2: {} own-keys@1.0.1: @@ -13795,13 +13557,13 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)): + postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@types/node@24.9.2)(typescript@5.9.3) + ts-node: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1): dependencies: @@ -14102,8 +13864,6 @@ snapshots: postgres@3.4.7: {} - prelude-ls@1.2.1: {} - prettier@2.8.8: {} pretty-bytes@5.6.0: {} @@ -14120,12 +13880,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@7.0.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@prisma/config': 7.0.0 '@prisma/dev': 0.13.0(typescript@5.9.3) '@prisma/engines': 7.0.0 - '@prisma/studio-core-licensed': 0.8.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@prisma/studio-core-licensed': 0.8.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) mysql2: 3.15.3 postgres: 3.4.7 optionalDependencies: @@ -14297,8 +14057,8 @@ snapshots: '@formatjs/ecma402-abstract': 2.3.6 '@formatjs/icu-messageformat-parser': 2.11.4 '@formatjs/intl': 3.1.8(typescript@5.9.3) - '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.2) - '@types/react': 19.2.2 + '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.6) + '@types/react': 19.2.6 hoist-non-react-statics: 3.3.2 intl-messageformat: 10.7.18 react: 19.2.0 @@ -14310,13 +14070,13 @@ snapshots: react-is@18.3.1: {} - react-redux@9.2.0(@types/react@19.2.2)(react@19.2.0)(redux@5.0.1): + react-redux@9.2.0(@types/react@19.2.6)(react@19.2.0)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 react: 19.2.0 use-sync-external-store: 1.5.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.6 redux: 5.0.1 react-simple-maps@2.3.0(prop-types@15.8.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): @@ -14528,28 +14288,28 @@ snapshots: globby: 10.0.1 is-plain-object: 3.0.1 - rollup-plugin-delete@3.0.1(rollup@4.52.5): + rollup-plugin-delete@3.0.1(rollup@4.53.3): dependencies: del: 8.0.0 - rollup: 4.52.5 + rollup: 4.53.3 - rollup-plugin-dts@6.2.3(rollup@4.52.5)(typescript@5.9.3): + rollup-plugin-dts@6.2.3(rollup@4.53.3)(typescript@5.9.3): dependencies: magic-string: 0.30.18 - rollup: 4.52.5 + rollup: 4.53.3 typescript: 5.9.3 optionalDependencies: '@babel/code-frame': 7.27.1 - rollup-plugin-node-externals@8.1.1(rollup@4.52.5): + rollup-plugin-node-externals@8.1.2(rollup@4.53.3): dependencies: - rollup: 4.52.5 + rollup: 4.53.3 - rollup-plugin-peer-deps-external@2.2.4(rollup@4.52.5): + rollup-plugin-peer-deps-external@2.2.4(rollup@4.53.3): dependencies: - rollup: 4.52.5 + rollup: 4.53.3 - rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)): + rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)): dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 @@ -14558,7 +14318,7 @@ snapshots: p-queue: 6.6.2 pify: 5.0.0 postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) postcss-modules: 4.3.1(postcss@8.5.6) promise.series: 0.2.0 resolve: 1.22.10 @@ -14572,32 +14332,32 @@ snapshots: dependencies: estree-walker: 0.6.1 - rollup@4.52.5: + rollup@4.53.3: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.5 - '@rollup/rollup-android-arm64': 4.52.5 - '@rollup/rollup-darwin-arm64': 4.52.5 - '@rollup/rollup-darwin-x64': 4.52.5 - '@rollup/rollup-freebsd-arm64': 4.52.5 - '@rollup/rollup-freebsd-x64': 4.52.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 - '@rollup/rollup-linux-arm-musleabihf': 4.52.5 - '@rollup/rollup-linux-arm64-gnu': 4.52.5 - '@rollup/rollup-linux-arm64-musl': 4.52.5 - '@rollup/rollup-linux-loong64-gnu': 4.52.5 - '@rollup/rollup-linux-ppc64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-musl': 4.52.5 - '@rollup/rollup-linux-s390x-gnu': 4.52.5 - '@rollup/rollup-linux-x64-gnu': 4.52.5 - '@rollup/rollup-linux-x64-musl': 4.52.5 - '@rollup/rollup-openharmony-arm64': 4.52.5 - '@rollup/rollup-win32-arm64-msvc': 4.52.5 - '@rollup/rollup-win32-ia32-msvc': 4.52.5 - '@rollup/rollup-win32-x64-gnu': 4.52.5 - '@rollup/rollup-win32-x64-msvc': 4.52.5 + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 fsevents: 2.3.3 run-parallel@1.2.0: @@ -14844,9 +14604,7 @@ snapshots: source-map@0.6.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 + source-map@0.7.6: {} spdx-correct@3.2.0: dependencies: @@ -15077,7 +14835,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 - glob: 10.4.5 + glob: 10.5.0 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 @@ -15156,8 +14914,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - text-table@0.2.0: {} - thenby@1.3.4: {} thenify-all@1.6.0: @@ -15174,7 +14930,7 @@ snapshots: tiny-invariant@1.3.3: {} - tiny-lru@11.3.4: {} + tiny-lru@11.4.5: {} tinyexec@0.3.2: {} @@ -15207,28 +14963,20 @@ snapshots: dependencies: tldts: 6.1.86 - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tree-kill@1.2.2: {} trim-newlines@3.0.1: {} trim-newlines@4.1.1: {} - ts-api-utils@2.1.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - ts-interface-checker@0.1.13: {} - ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.11)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 29.7.0(@types/node@24.9.2)(ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3)) + jest: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -15241,17 +14989,17 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 30.0.5 babel-jest: 29.7.0(@babel/core@7.28.3) - esbuild: 0.25.11 + esbuild: 0.25.12 jest-util: 30.0.5 - ts-node@10.9.2(@types/node@24.9.2)(typescript@5.9.3): + ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.9.2 + '@types/node': 24.10.1 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -15264,21 +15012,21 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: - bundle-require: 5.1.0(esbuild@0.25.11) + bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.3(supports-color@8.1.1) - esbuild: 0.25.11 + esbuild: 0.27.0 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1) resolve-from: 5.0.0 - rollup: 4.52.5 - source-map: 0.8.0-beta.0 + rollup: 4.53.3 + source-map: 0.7.6 sucrase: 3.35.0 tinyexec: 0.3.2 tinyglobby: 0.2.14 @@ -15298,16 +15046,10 @@ snapshots: tweetnacl@0.14.5: {} - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - type-detect@4.0.8: {} type-fest@0.13.1: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} type-fest@0.6.0: {} @@ -15458,14 +15200,6 @@ snapshots: web-streams-polyfill@3.3.3: {} - webidl-conversions@4.0.2: {} - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -15515,8 +15249,6 @@ snapshots: dependencies: isexe: 2.0.0 - word-wrap@1.2.5: {} - wordwrap@1.0.0: {} wrap-ansi@6.2.0: @@ -15617,9 +15349,9 @@ snapshots: zod@4.1.12: {} - zustand@5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): + zustand@5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.6 immer: 10.2.0 react: 19.2.0 use-sync-external-store: 1.6.0(react@19.2.0) diff --git a/scripts/build-geo.js b/scripts/build-geo.js index 74902511..a83caa6c 100644 --- a/scripts/build-geo.js +++ b/scripts/build-geo.js @@ -3,8 +3,8 @@ import 'dotenv/config'; import fs from 'node:fs'; import path from 'node:path'; import https from 'https'; -import zlib from 'zlib'; import tar from 'tar'; +import zlib from 'zlib'; if (process.env.VERCEL && !process.env.BUILD_GEO) { console.log('Vercel environment detected. Skipping geo setup.'); diff --git a/scripts/check-db.js b/scripts/check-db.js index 09577699..68374f6f 100644 --- a/scripts/check-db.js +++ b/scripts/check-db.js @@ -1,10 +1,10 @@ /* eslint-disable no-console */ import 'dotenv/config'; import { execSync } from 'node:child_process'; +import { PrismaPg } from '@prisma/adapter-pg'; import chalk from 'chalk'; import semver from 'semver'; import { PrismaClient } from '../generated/prisma/client.js'; -import { PrismaPg } from '@prisma/adapter-pg'; const MIN_VERSION = '9.4.0'; diff --git a/scripts/download-country-names.js b/scripts/download-country-names.js index 2bc91c76..937fb22f 100644 --- a/scripts/download-country-names.js +++ b/scripts/download-country-names.js @@ -1,8 +1,9 @@ /* eslint-disable no-console */ -import fs from 'fs-extra'; + import path from 'node:path'; -import https from 'https'; import chalk from 'chalk'; +import fs from 'fs-extra'; +import https from 'https'; const src = path.resolve(process.cwd(), 'src/lang'); const dest = path.resolve(process.cwd(), 'public/intl/country'); diff --git a/scripts/download-language-names.js b/scripts/download-language-names.js index 4daa7b79..d3db6016 100644 --- a/scripts/download-language-names.js +++ b/scripts/download-language-names.js @@ -1,8 +1,9 @@ /* eslint-disable no-console */ -import fs from 'fs-extra'; + import path from 'node:path'; -import https from 'https'; import chalk from 'chalk'; +import fs from 'fs-extra'; +import https from 'https'; const src = path.resolve(process.cwd(), 'src/lang'); const dest = path.resolve(process.cwd(), 'public/intl/language'); diff --git a/scripts/format-lang.js b/scripts/format-lang.js index ad18d82d..95c390ee 100644 --- a/scripts/format-lang.js +++ b/scripts/format-lang.js @@ -1,6 +1,6 @@ import path from 'node:path'; -import fs from 'fs-extra'; import del from 'del'; +import fs from 'fs-extra'; import { createRequire } from 'module'; const require = createRequire(import.meta.url); diff --git a/scripts/merge-messages.js b/scripts/merge-messages.js index 9e846af5..29abc539 100644 --- a/scripts/merge-messages.js +++ b/scripts/merge-messages.js @@ -1,8 +1,8 @@ /* eslint-disable no-console */ import fs from 'node:fs'; import path from 'node:path'; -import prettier from 'prettier'; import { createRequire } from 'module'; +import prettier from 'prettier'; const require = createRequire(import.meta.url); diff --git a/src/app/(collect)/p/[slug]/route.ts b/src/app/(collect)/p/[slug]/route.ts index 9959fe85..79d6faa5 100644 --- a/src/app/(collect)/p/[slug]/route.ts +++ b/src/app/(collect)/p/[slug]/route.ts @@ -1,11 +1,11 @@ export const dynamic = 'force-dynamic'; import { NextResponse } from 'next/server'; -import { notFound } from '@/lib/response'; -import redis from '@/lib/redis'; -import { findPixel } from '@/queries/prisma'; -import { Pixel } from '@/generated/prisma/client'; import { POST } from '@/app/api/send/route'; +import type { Pixel } from '@/generated/prisma/client'; +import redis from '@/lib/redis'; +import { notFound } from '@/lib/response'; +import { findPixel } from '@/queries/prisma'; const image = Buffer.from('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw', 'base64'); diff --git a/src/app/(collect)/q/[slug]/route.ts b/src/app/(collect)/q/[slug]/route.ts index 80c5bb47..24089bdb 100644 --- a/src/app/(collect)/q/[slug]/route.ts +++ b/src/app/(collect)/q/[slug]/route.ts @@ -1,11 +1,11 @@ export const dynamic = 'force-dynamic'; import { NextResponse } from 'next/server'; +import { POST } from '@/app/api/send/route'; +import type { Link } from '@/generated/prisma/client'; +import redis from '@/lib/redis'; import { notFound } from '@/lib/response'; import { findLink } from '@/queries/prisma'; -import { POST } from '@/app/api/send/route'; -import { Link } from '@/generated/prisma/client'; -import redis from '@/lib/redis'; export async function GET(request: Request, { params }: { params: Promise<{ slug: string }> }) { const { slug } = await params; diff --git a/src/app/(main)/MobileNav.tsx b/src/app/(main)/MobileNav.tsx index a1944960..aaa25846 100644 --- a/src/app/(main)/MobileNav.tsx +++ b/src/app/(main)/MobileNav.tsx @@ -1,11 +1,11 @@ +import { Grid, IconLabel, NavMenu, NavMenuItem, Row, Text } from '@umami/react-zen'; +import Link from 'next/link'; import { WebsiteNav } from '@/app/(main)/websites/[websiteId]/WebsiteNav'; import { useMessages, useNavigation } from '@/components/hooks'; import { Globe, Grid2x2, LinkIcon } from '@/components/icons'; import { MobileMenuButton } from '@/components/input/MobileMenuButton'; import { NavButton } from '@/components/input/NavButton'; import { Logo } from '@/components/svg'; -import { Grid, IconLabel, NavMenu, NavMenuItem, Row, Text } from '@umami/react-zen'; -import Link from 'next/link'; import { AdminNav } from './admin/AdminNav'; import { SettingsNav } from './settings/SettingsNav'; diff --git a/src/app/(main)/SideNav.tsx b/src/app/(main)/SideNav.tsx index 32e3e397..1ecb58db 100644 --- a/src/app/(main)/SideNav.tsx +++ b/src/app/(main)/SideNav.tsx @@ -1,20 +1,20 @@ -import { Key } from 'react'; -import Link from 'next/link'; import { - Sidebar, - SidebarSection, - SidebarItem, - SidebarHeader, Row, - SidebarProps, + Sidebar, + SidebarHeader, + SidebarItem, + type SidebarProps, + SidebarSection, ThemeButton, } from '@umami/react-zen'; -import { Globe, LinkIcon, Grid2x2, PanelLeft } from '@/components/icons'; -import { Logo } from '@/components/svg'; -import { useMessages, useNavigation, useGlobalState } from '@/components/hooks'; +import Link from 'next/link'; +import type { Key } from 'react'; +import { useGlobalState, useMessages, useNavigation } from '@/components/hooks'; +import { Globe, Grid2x2, LinkIcon, PanelLeft } from '@/components/icons'; +import { LanguageButton } from '@/components/input/LanguageButton'; import { NavButton } from '@/components/input/NavButton'; import { PanelButton } from '@/components/input/PanelButton'; -import { LanguageButton } from '@/components/input/LanguageButton'; +import { Logo } from '@/components/svg'; export function SideNav(props: SidebarProps) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/TopNav.tsx b/src/app/(main)/TopNav.tsx index 71f38d2b..d410097a 100644 --- a/src/app/(main)/TopNav.tsx +++ b/src/app/(main)/TopNav.tsx @@ -1,4 +1,4 @@ -import { ThemeButton, Row } from '@umami/react-zen'; +import { Row, ThemeButton } from '@umami/react-zen'; import { LanguageButton } from '@/components/input/LanguageButton'; import { ProfileButton } from '@/components/input/ProfileButton'; diff --git a/src/app/(main)/UpdateNotice.tsx b/src/app/(main)/UpdateNotice.tsx index 81e2ca3a..ef441d0b 100644 --- a/src/app/(main)/UpdateNotice.tsx +++ b/src/app/(main)/UpdateNotice.tsx @@ -1,10 +1,10 @@ -import { useEffect, useCallback, useState } from 'react'; -import { Button, AlertBanner, Column, Row } from '@umami/react-zen'; -import { setItem } from '@/lib/storage'; -import { useVersion, checkVersion } from '@/store/version'; -import { REPO_URL, VERSION_CHECK } from '@/lib/constants'; -import { useMessages } from '@/components/hooks'; +import { AlertBanner, Button, Column, Row } from '@umami/react-zen'; import { usePathname } from 'next/navigation'; +import { useCallback, useEffect, useState } from 'react'; +import { useMessages } from '@/components/hooks'; +import { REPO_URL, VERSION_CHECK } from '@/lib/constants'; +import { setItem } from '@/lib/storage'; +import { checkVersion, useVersion } from '@/store/version'; export function UpdateNotice({ user, config }) { const { formatMessage, labels, messages } = useMessages(); diff --git a/src/app/(main)/admin/AdminLayout.tsx b/src/app/(main)/admin/AdminLayout.tsx index 3cc5aed3..56561a8e 100644 --- a/src/app/(main)/admin/AdminLayout.tsx +++ b/src/app/(main)/admin/AdminLayout.tsx @@ -1,8 +1,8 @@ 'use client'; +import { Column, Grid } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { PageBody } from '@/components/common/PageBody'; import { useLoginQuery } from '@/components/hooks'; -import { Column, Grid } from '@umami/react-zen'; -import { ReactNode } from 'react'; import { AdminNav } from './AdminNav'; export function AdminLayout({ children }: { children: ReactNode }) { diff --git a/src/app/(main)/admin/layout.tsx b/src/app/(main)/admin/layout.tsx index 634fc658..34cdd0b6 100644 --- a/src/app/(main)/admin/layout.tsx +++ b/src/app/(main)/admin/layout.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { AdminLayout } from './AdminLayout'; export default function ({ children }) { diff --git a/src/app/(main)/admin/teams/AdminTeamsDataTable.tsx b/src/app/(main)/admin/teams/AdminTeamsDataTable.tsx index 53e18248..7da8531a 100644 --- a/src/app/(main)/admin/teams/AdminTeamsDataTable.tsx +++ b/src/app/(main)/admin/teams/AdminTeamsDataTable.tsx @@ -1,7 +1,7 @@ +import type { ReactNode } from 'react'; import { DataGrid } from '@/components/common/DataGrid'; import { useTeamsQuery } from '@/components/hooks'; import { AdminTeamsTable } from './AdminTeamsTable'; -import { ReactNode } from 'react'; export function AdminTeamsDataTable({ showActions, diff --git a/src/app/(main)/admin/teams/AdminTeamsPage.tsx b/src/app/(main)/admin/teams/AdminTeamsPage.tsx index 736c7b5f..41e6f4af 100644 --- a/src/app/(main)/admin/teams/AdminTeamsPage.tsx +++ b/src/app/(main)/admin/teams/AdminTeamsPage.tsx @@ -1,9 +1,9 @@ 'use client'; -import { AdminTeamsDataTable } from './AdminTeamsDataTable'; import { Column } from '@umami/react-zen'; -import { useMessages } from '@/components/hooks'; import { PageHeader } from '@/components/common/PageHeader'; import { Panel } from '@/components/common/Panel'; +import { useMessages } from '@/components/hooks'; +import { AdminTeamsDataTable } from './AdminTeamsDataTable'; export function AdminTeamsPage() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/admin/teams/AdminTeamsTable.tsx b/src/app/(main)/admin/teams/AdminTeamsTable.tsx index e5453258..9f2abd5c 100644 --- a/src/app/(main)/admin/teams/AdminTeamsTable.tsx +++ b/src/app/(main)/admin/teams/AdminTeamsTable.tsx @@ -1,11 +1,11 @@ +import { DataColumn, DataTable, Dialog, Icon, MenuItem, Modal, Row, Text } from '@umami/react-zen'; +import Link from 'next/link'; +import { useState } from 'react'; import { DateDistance } from '@/components/common/DateDistance'; import { useMessages } from '@/components/hooks'; import { Edit, Trash } from '@/components/icons'; import { MenuButton } from '@/components/input/MenuButton'; -import { DataColumn, DataTable, Dialog, Icon, MenuItem, Modal, Row, Text } from '@umami/react-zen'; import { TeamDeleteForm } from '../../teams/[teamId]/TeamDeleteForm'; -import Link from 'next/link'; -import { useState } from 'react'; export function AdminTeamsTable({ data = [], diff --git a/src/app/(main)/admin/teams/[teamId]/page.tsx b/src/app/(main)/admin/teams/[teamId]/page.tsx index 95a0acb8..104766ad 100644 --- a/src/app/(main)/admin/teams/[teamId]/page.tsx +++ b/src/app/(main)/admin/teams/[teamId]/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { AdminTeamPage } from './AdminTeamPage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ teamId: string }> }) { const { teamId } = await params; diff --git a/src/app/(main)/admin/teams/page.tsx b/src/app/(main)/admin/teams/page.tsx index fb0fd342..987f02b3 100644 --- a/src/app/(main)/admin/teams/page.tsx +++ b/src/app/(main)/admin/teams/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { AdminTeamsPage } from './AdminTeamsPage'; export default function () { diff --git a/src/app/(main)/admin/users/UserAddButton.tsx b/src/app/(main)/admin/users/UserAddButton.tsx index 80337b19..05250828 100644 --- a/src/app/(main)/admin/users/UserAddButton.tsx +++ b/src/app/(main)/admin/users/UserAddButton.tsx @@ -1,7 +1,7 @@ -import { Button, Icon, Text, Modal, DialogTrigger, Dialog, useToast } from '@umami/react-zen'; -import { UserAddForm } from './UserAddForm'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen'; import { useMessages, useModified } from '@/components/hooks'; import { Plus } from '@/components/icons'; +import { UserAddForm } from './UserAddForm'; export function UserAddButton({ onSave }: { onSave?: () => void }) { const { formatMessage, labels, messages } = useMessages(); diff --git a/src/app/(main)/admin/users/UserAddForm.tsx b/src/app/(main)/admin/users/UserAddForm.tsx index fe7828c6..6c365510 100644 --- a/src/app/(main)/admin/users/UserAddForm.tsx +++ b/src/app/(main)/admin/users/UserAddForm.tsx @@ -1,13 +1,13 @@ import { - Select, - ListItem, - Form, - FormField, - FormButtons, - FormSubmitButton, - TextField, - PasswordField, Button, + Form, + FormButtons, + FormField, + FormSubmitButton, + ListItem, + PasswordField, + Select, + TextField, } from '@umami/react-zen'; import { useMessages, useUpdateQuery } from '@/components/hooks'; import { ROLES } from '@/lib/constants'; diff --git a/src/app/(main)/admin/users/UserDeleteButton.tsx b/src/app/(main)/admin/users/UserDeleteButton.tsx index f3789884..ee8f2c19 100644 --- a/src/app/(main)/admin/users/UserDeleteButton.tsx +++ b/src/app/(main)/admin/users/UserDeleteButton.tsx @@ -1,5 +1,5 @@ -import { Button, Icon, Modal, DialogTrigger, Dialog, Text } from '@umami/react-zen'; -import { useMessages, useLoginQuery } from '@/components/hooks'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text } from '@umami/react-zen'; +import { useLoginQuery, useMessages } from '@/components/hooks'; import { Trash } from '@/components/icons'; import { UserDeleteForm } from './UserDeleteForm'; diff --git a/src/app/(main)/admin/users/UsersDataTable.tsx b/src/app/(main)/admin/users/UsersDataTable.tsx index ae72cfed..8467bd23 100644 --- a/src/app/(main)/admin/users/UsersDataTable.tsx +++ b/src/app/(main)/admin/users/UsersDataTable.tsx @@ -1,7 +1,7 @@ +import type { ReactNode } from 'react'; import { DataGrid } from '@/components/common/DataGrid'; import { useUsersQuery } from '@/components/hooks'; import { UsersTable } from './UsersTable'; -import { ReactNode } from 'react'; export function UsersDataTable({ showActions }: { showActions?: boolean; children?: ReactNode }) { const queryResult = useUsersQuery(); diff --git a/src/app/(main)/admin/users/UsersPage.tsx b/src/app/(main)/admin/users/UsersPage.tsx index 3e492b34..7e1b0f48 100644 --- a/src/app/(main)/admin/users/UsersPage.tsx +++ b/src/app/(main)/admin/users/UsersPage.tsx @@ -1,10 +1,10 @@ 'use client'; -import { UsersDataTable } from './UsersDataTable'; import { Column } from '@umami/react-zen'; -import { useMessages } from '@/components/hooks'; -import { UserAddButton } from './UserAddButton'; import { PageHeader } from '@/components/common/PageHeader'; import { Panel } from '@/components/common/Panel'; +import { useMessages } from '@/components/hooks'; +import { UserAddButton } from './UserAddButton'; +import { UsersDataTable } from './UsersDataTable'; export function UsersPage() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/admin/users/UsersTable.tsx b/src/app/(main)/admin/users/UsersTable.tsx index 6b365691..9c10f3e7 100644 --- a/src/app/(main)/admin/users/UsersTable.tsx +++ b/src/app/(main)/admin/users/UsersTable.tsx @@ -1,13 +1,12 @@ -import { useState } from 'react'; -import { Row, Text, Icon, DataTable, DataColumn, MenuItem, Modal } from '@umami/react-zen'; +import { DataColumn, DataTable, Icon, MenuItem, Modal, Row, Text } from '@umami/react-zen'; import Link from 'next/link'; -import { ROLES } from '@/lib/constants'; -import { Trash } from '@/components/icons'; -import { useMessages } from '@/components/hooks'; -import { Edit } from '@/components/icons'; -import { MenuButton } from '@/components/input/MenuButton'; -import { UserDeleteForm } from './UserDeleteForm'; +import { useState } from 'react'; import { DateDistance } from '@/components/common/DateDistance'; +import { useMessages } from '@/components/hooks'; +import { Edit, Trash } from '@/components/icons'; +import { MenuButton } from '@/components/input/MenuButton'; +import { ROLES } from '@/lib/constants'; +import { UserDeleteForm } from './UserDeleteForm'; export function UsersTable({ data = [], diff --git a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx index 142adaa6..30c86862 100644 --- a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx +++ b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx @@ -1,12 +1,12 @@ import { - Select, - ListItem, Form, - FormField, FormButtons, - TextField, + FormField, FormSubmitButton, + ListItem, PasswordField, + Select, + TextField, } from '@umami/react-zen'; import { useLoginQuery, useMessages, useUpdateQuery, useUser } from '@/components/hooks'; import { ROLES } from '@/lib/constants'; @@ -30,7 +30,7 @@ export function UserEditForm({ userId, onSave }: { userId: string; onSave?: () = }; return ( -
+ diff --git a/src/app/(main)/admin/users/[userId]/UserHeader.tsx b/src/app/(main)/admin/users/[userId]/UserHeader.tsx index aeaca0b2..1f82897e 100644 --- a/src/app/(main)/admin/users/[userId]/UserHeader.tsx +++ b/src/app/(main)/admin/users/[userId]/UserHeader.tsx @@ -1,6 +1,6 @@ -import { User } from '@/components/icons'; import { PageHeader } from '@/components/common/PageHeader'; import { useUser } from '@/components/hooks'; +import { User } from '@/components/icons'; export function UserHeader() { const user = useUser(); diff --git a/src/app/(main)/admin/users/[userId]/UserPage.tsx b/src/app/(main)/admin/users/[userId]/UserPage.tsx index 0ae65855..5e0f8d10 100644 --- a/src/app/(main)/admin/users/[userId]/UserPage.tsx +++ b/src/app/(main)/admin/users/[userId]/UserPage.tsx @@ -1,9 +1,9 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { UserSettings } from './UserSettings'; -import { UserProvider } from './UserProvider'; import { UserHeader } from '@/app/(main)/admin/users/[userId]/UserHeader'; import { Panel } from '@/components/common/Panel'; +import { UserProvider } from './UserProvider'; +import { UserSettings } from './UserSettings'; export function UserPage({ userId }: { userId: string }) { return ( diff --git a/src/app/(main)/admin/users/[userId]/UserProvider.tsx b/src/app/(main)/admin/users/[userId]/UserProvider.tsx index 82dba512..ea01915a 100644 --- a/src/app/(main)/admin/users/[userId]/UserProvider.tsx +++ b/src/app/(main)/admin/users/[userId]/UserProvider.tsx @@ -1,7 +1,7 @@ -import { createContext, ReactNode } from 'react'; import { Loading } from '@umami/react-zen'; -import { User } from '@/generated/prisma/client'; +import { createContext, type ReactNode } from 'react'; import { useUserQuery } from '@/components/hooks/queries/useUserQuery'; +import type { User } from '@/generated/prisma/client'; export const UserContext = createContext(null); diff --git a/src/app/(main)/admin/users/[userId]/UserSettings.tsx b/src/app/(main)/admin/users/[userId]/UserSettings.tsx index 3d699ebe..3f17f3e1 100644 --- a/src/app/(main)/admin/users/[userId]/UserSettings.tsx +++ b/src/app/(main)/admin/users/[userId]/UserSettings.tsx @@ -1,6 +1,6 @@ -import { Column, Tabs, Tab, TabList, TabPanel } from '@umami/react-zen'; -import { UserEditForm } from './UserEditForm'; +import { Column, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; +import { UserEditForm } from './UserEditForm'; import { UserWebsites } from './UserWebsites'; export function UserSettings({ userId }: { userId: string }) { diff --git a/src/app/(main)/admin/users/[userId]/UserWebsites.tsx b/src/app/(main)/admin/users/[userId]/UserWebsites.tsx index dae83660..eeb173e7 100644 --- a/src/app/(main)/admin/users/[userId]/UserWebsites.tsx +++ b/src/app/(main)/admin/users/[userId]/UserWebsites.tsx @@ -1,6 +1,6 @@ +import { WebsitesTable } from '@/app/(main)/websites/WebsitesTable'; import { DataGrid } from '@/components/common/DataGrid'; import { useUserWebsitesQuery } from '@/components/hooks'; -import { WebsitesTable } from '@/app/(main)/websites/WebsitesTable'; export function UserWebsites({ userId }) { const queryResult = useUserWebsitesQuery({ userId }); diff --git a/src/app/(main)/admin/users/[userId]/page.tsx b/src/app/(main)/admin/users/[userId]/page.tsx index e573b14e..16c9f366 100644 --- a/src/app/(main)/admin/users/[userId]/page.tsx +++ b/src/app/(main)/admin/users/[userId]/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { UserPage } from './UserPage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ userId: string }> }) { const { userId } = await params; diff --git a/src/app/(main)/admin/users/page.tsx b/src/app/(main)/admin/users/page.tsx index 7cfd4887..96e69eb5 100644 --- a/src/app/(main)/admin/users/page.tsx +++ b/src/app/(main)/admin/users/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { UsersPage } from './UsersPage'; export default function () { diff --git a/src/app/(main)/admin/websites/AdminWebsitesPage.tsx b/src/app/(main)/admin/websites/AdminWebsitesPage.tsx index f66c5eb7..1c2ac921 100644 --- a/src/app/(main)/admin/websites/AdminWebsitesPage.tsx +++ b/src/app/(main)/admin/websites/AdminWebsitesPage.tsx @@ -1,9 +1,9 @@ 'use client'; -import { AdminWebsitesDataTable } from './AdminWebsitesDataTable'; import { Column } from '@umami/react-zen'; -import { useMessages } from '@/components/hooks'; import { PageHeader } from '@/components/common/PageHeader'; import { Panel } from '@/components/common/Panel'; +import { useMessages } from '@/components/hooks'; +import { AdminWebsitesDataTable } from './AdminWebsitesDataTable'; export function AdminWebsitesPage() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/admin/websites/AdminWebsitesTable.tsx b/src/app/(main)/admin/websites/AdminWebsitesTable.tsx index b8d76a9b..cfda5957 100644 --- a/src/app/(main)/admin/websites/AdminWebsitesTable.tsx +++ b/src/app/(main)/admin/websites/AdminWebsitesTable.tsx @@ -1,12 +1,11 @@ -import { useState } from 'react'; +import { DataColumn, DataTable, Dialog, Icon, MenuItem, Modal, Row, Text } from '@umami/react-zen'; import Link from 'next/link'; -import { Row, Text, Icon, DataTable, DataColumn, MenuItem, Modal, Dialog } from '@umami/react-zen'; -import { Trash, Users } from '@/components/icons'; -import { useMessages } from '@/components/hooks'; -import { Edit } from '@/components/icons'; -import { MenuButton } from '@/components/input/MenuButton'; -import { DateDistance } from '@/components/common/DateDistance'; +import { useState } from 'react'; import { WebsiteDeleteForm } from '@/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm'; +import { DateDistance } from '@/components/common/DateDistance'; +import { useMessages } from '@/components/hooks'; +import { Edit, Trash, Users } from '@/components/icons'; +import { MenuButton } from '@/components/input/MenuButton'; export function AdminWebsitesTable({ data = [] }: { data: any[] }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/admin/websites/[websiteId]/page.tsx b/src/app/(main)/admin/websites/[websiteId]/page.tsx index e1c92276..557adbd9 100644 --- a/src/app/(main)/admin/websites/[websiteId]/page.tsx +++ b/src/app/(main)/admin/websites/[websiteId]/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { WebsiteSettingsPage } from '@/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/admin/websites/page.tsx b/src/app/(main)/admin/websites/page.tsx index 85eb029a..d6da9f63 100644 --- a/src/app/(main)/admin/websites/page.tsx +++ b/src/app/(main)/admin/websites/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { AdminWebsitesPage } from './AdminWebsitesPage'; export default function () { diff --git a/src/app/(main)/boards/BoardAddButton.tsx b/src/app/(main)/boards/BoardAddButton.tsx index 7c98ed16..f9f80f4d 100644 --- a/src/app/(main)/boards/BoardAddButton.tsx +++ b/src/app/(main)/boards/BoardAddButton.tsx @@ -1,5 +1,5 @@ +import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen'; import { useMessages, useModified, useNavigation } from '@/components/hooks'; -import { Button, Icon, Modal, Dialog, DialogTrigger, Text, useToast } from '@umami/react-zen'; import { Plus } from '@/components/icons'; import { BoardAddForm } from './BoardAddForm'; diff --git a/src/app/(main)/boards/BoardAddForm.tsx b/src/app/(main)/boards/BoardAddForm.tsx index 8e7b764c..6471b21e 100644 --- a/src/app/(main)/boards/BoardAddForm.tsx +++ b/src/app/(main)/boards/BoardAddForm.tsx @@ -1,5 +1,5 @@ -import { Form, FormField, FormSubmitButton, Row, TextField, Button } from '@umami/react-zen'; -import { useUpdateQuery, useMessages } from '@/components/hooks'; +import { Button, Form, FormField, FormSubmitButton, Row, TextField } from '@umami/react-zen'; +import { useMessages, useUpdateQuery } from '@/components/hooks'; import { DOMAIN_REGEX } from '@/lib/constants'; export function BoardAddForm({ diff --git a/src/app/(main)/boards/BoardsPage.tsx b/src/app/(main)/boards/BoardsPage.tsx index adf0e02b..fa5eb64a 100644 --- a/src/app/(main)/boards/BoardsPage.tsx +++ b/src/app/(main)/boards/BoardsPage.tsx @@ -1,7 +1,7 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { PageHeader } from '@/components/common/PageHeader'; import { PageBody } from '@/components/common/PageBody'; +import { PageHeader } from '@/components/common/PageHeader'; import { BoardAddButton } from './BoardAddButton'; export function BoardsPage() { diff --git a/src/app/(main)/boards/[boardId]/page.tsx b/src/app/(main)/boards/[boardId]/page.tsx index d11f6a2a..2cb076a5 100644 --- a/src/app/(main)/boards/[boardId]/page.tsx +++ b/src/app/(main)/boards/[boardId]/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { Board } from './Board'; export default async function ({ params }: { params: Promise<{ boardId: string }> }) { diff --git a/src/app/(main)/boards/page.tsx b/src/app/(main)/boards/page.tsx index 5e3c8034..e8ca6624 100644 --- a/src/app/(main)/boards/page.tsx +++ b/src/app/(main)/boards/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { BoardsPage } from './BoardsPage'; export default function () { diff --git a/src/app/(main)/console/[websiteId]/TestConsolePage.tsx b/src/app/(main)/console/[websiteId]/TestConsolePage.tsx index e44ea95d..56cc4952 100644 --- a/src/app/(main)/console/[websiteId]/TestConsolePage.tsx +++ b/src/app/(main)/console/[websiteId]/TestConsolePage.tsx @@ -1,25 +1,25 @@ 'use client'; -import { Button, Grid, Column, Heading } from '@umami/react-zen'; +import { Button, Column, Grid, Heading } from '@umami/react-zen'; import Link from 'next/link'; import Script from 'next/script'; -import { Panel } from '@/components/common/Panel'; -import { PageBody } from '@/components/common/PageBody'; -import { EventsChart } from '@/components/metrics/EventsChart'; import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart'; -import { useWebsiteQuery } from '@/components/hooks'; +import { PageBody } from '@/components/common/PageBody'; import { PageHeader } from '@/components/common/PageHeader'; +import { Panel } from '@/components/common/Panel'; +import { useWebsiteQuery } from '@/components/hooks'; +import { EventsChart } from '@/components/metrics/EventsChart'; export function TestConsolePage({ websiteId }: { websiteId: string }) { const { data } = useWebsiteQuery(websiteId); function handleRunScript() { - window['umami'].track(props => ({ + 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', { + window.umami.track('track-event-no-data'); + window.umami.track('track-event-with-data', { test: 'test-data', boolean: true, booleanError: 'true', @@ -40,32 +40,32 @@ export function TestConsolePage({ websiteId }: { websiteId: string }) { } function handleRunRevenue() { - window['umami'].track(props => ({ + window.umami.track(props => ({ ...props, url: '/checkout-cart', referrer: 'https://www.google.com', })); - window['umami'].track('checkout-cart', { + window.umami.track('checkout-cart', { revenue: parseFloat((Math.random() * 1000).toFixed(2)), currency: 'USD', }); - window['umami'].track('affiliate-link', { + window.umami.track('affiliate-link', { revenue: parseFloat((Math.random() * 1000).toFixed(2)), currency: 'USD', }); - window['umami'].track('promotion-link', { + window.umami.track('promotion-link', { revenue: parseFloat((Math.random() * 1000).toFixed(2)), currency: 'USD', }); - window['umami'].track('checkout-cart', { + window.umami.track('checkout-cart', { revenue: parseFloat((Math.random() * 1000).toFixed(2)), currency: 'EUR', }); - window['umami'].track('promotion-link', { + window.umami.track('promotion-link', { revenue: parseFloat((Math.random() * 1000).toFixed(2)), currency: 'EUR', }); - window['umami'].track('affiliate-link', { + window.umami.track('affiliate-link', { item1: { productIdentity: 'ABC424', revenue: parseFloat((Math.random() * 10000).toFixed(2)), @@ -80,7 +80,7 @@ export function TestConsolePage({ websiteId }: { websiteId: string }) { } function handleRunIdentify() { - window['umami'].identify({ + window.umami.identify({ userId: 123, name: 'brian', number: Math.random() * 100, diff --git a/src/app/(main)/console/[websiteId]/page.tsx b/src/app/(main)/console/[websiteId]/page.tsx index 7f507e41..28b81615 100644 --- a/src/app/(main)/console/[websiteId]/page.tsx +++ b/src/app/(main)/console/[websiteId]/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { TestConsolePage } from './TestConsolePage'; async function getEnabled() { diff --git a/src/app/(main)/dashboard/DashboardPage.tsx b/src/app/(main)/dashboard/DashboardPage.tsx index c05e411d..c2c7e75f 100644 --- a/src/app/(main)/dashboard/DashboardPage.tsx +++ b/src/app/(main)/dashboard/DashboardPage.tsx @@ -1,8 +1,8 @@ 'use client'; import { Column } from '@umami/react-zen'; +import { PageBody } from '@/components/common/PageBody'; import { PageHeader } from '@/components/common/PageHeader'; import { useMessages } from '@/components/hooks'; -import { PageBody } from '@/components/common/PageBody'; export function DashboardPage() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/dashboard/page.tsx b/src/app/(main)/dashboard/page.tsx index e934e6ad..4b79b598 100644 --- a/src/app/(main)/dashboard/page.tsx +++ b/src/app/(main)/dashboard/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { DashboardPage } from './DashboardPage'; export default async function () { diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx index 558a9cd3..98fca4ab 100644 --- a/src/app/(main)/layout.tsx +++ b/src/app/(main)/layout.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { Suspense } from 'react'; -import { Metadata } from 'next'; import { App } from './App'; export default function ({ children }) { diff --git a/src/app/(main)/links/LinkAddButton.tsx b/src/app/(main)/links/LinkAddButton.tsx index d0c4e361..4276895d 100644 --- a/src/app/(main)/links/LinkAddButton.tsx +++ b/src/app/(main)/links/LinkAddButton.tsx @@ -1,7 +1,7 @@ import { useMessages } from '@/components/hooks'; import { Plus } from '@/components/icons'; -import { LinkEditForm } from './LinkEditForm'; import { DialogButton } from '@/components/input/DialogButton'; +import { LinkEditForm } from './LinkEditForm'; export function LinkAddButton({ teamId }: { teamId?: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/links/LinkDeleteButton.tsx b/src/app/(main)/links/LinkDeleteButton.tsx index aa044a36..78f85f89 100644 --- a/src/app/(main)/links/LinkDeleteButton.tsx +++ b/src/app/(main)/links/LinkDeleteButton.tsx @@ -1,8 +1,8 @@ -import { Trash } from '@/components/icons'; import { ConfirmationForm } from '@/components/common/ConfirmationForm'; -import { messages } from '@/components/messages'; import { useDeleteQuery, useMessages } from '@/components/hooks'; +import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import { messages } from '@/components/messages'; export function LinkDeleteButton({ linkId, diff --git a/src/app/(main)/links/LinkEditButton.tsx b/src/app/(main)/links/LinkEditButton.tsx index a93852b6..4d858796 100644 --- a/src/app/(main)/links/LinkEditButton.tsx +++ b/src/app/(main)/links/LinkEditButton.tsx @@ -1,7 +1,7 @@ -import { Edit } from '@/components/icons'; -import { LinkEditForm } from './LinkEditForm'; import { useMessages } from '@/components/hooks'; +import { Edit } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import { LinkEditForm } from './LinkEditForm'; export function LinkEditButton({ linkId }: { linkId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/links/LinkEditForm.tsx b/src/app/(main)/links/LinkEditForm.tsx index 36a11455..6c10c7f0 100644 --- a/src/app/(main)/links/LinkEditForm.tsx +++ b/src/app/(main)/links/LinkEditForm.tsx @@ -1,22 +1,21 @@ -import { useState, useEffect } from 'react'; import { + Button, + Column, Form, FormField, FormSubmitButton, + Icon, + Label, + Loading, Row, TextField, - Button, - Label, - Column, - Icon, - Loading, } from '@umami/react-zen'; -import { useConfig, useLinkQuery } from '@/components/hooks'; -import { useMessages } from '@/components/hooks'; -import { RefreshCw } from '@/components/icons'; -import { getRandomChars } from '@/lib/generate'; +import { useEffect, useState } from 'react'; +import { useConfig, useLinkQuery, useMessages } from '@/components/hooks'; import { useUpdateQuery } from '@/components/hooks/queries/useUpdateQuery'; +import { RefreshCw } from '@/components/icons'; import { LINKS_URL } from '@/lib/constants'; +import { getRandomChars } from '@/lib/generate'; import { isValidUrl } from '@/lib/url'; const generateId = () => getRandomChars(9); diff --git a/src/app/(main)/links/LinkProvider.tsx b/src/app/(main)/links/LinkProvider.tsx index de97cdcf..c29e13cf 100644 --- a/src/app/(main)/links/LinkProvider.tsx +++ b/src/app/(main)/links/LinkProvider.tsx @@ -1,8 +1,8 @@ 'use client'; -import { createContext, ReactNode } from 'react'; import { Loading } from '@umami/react-zen'; -import { Link } from '@/generated/prisma/client'; +import { createContext, type ReactNode } from 'react'; import { useLinkQuery } from '@/components/hooks/queries/useLinkQuery'; +import type { Link } from '@/generated/prisma/client'; export const LinkContext = createContext(null); diff --git a/src/app/(main)/links/LinksDataTable.tsx b/src/app/(main)/links/LinksDataTable.tsx index 043cd768..0b3d660b 100644 --- a/src/app/(main)/links/LinksDataTable.tsx +++ b/src/app/(main)/links/LinksDataTable.tsx @@ -1,6 +1,6 @@ +import { DataGrid } from '@/components/common/DataGrid'; import { useLinksQuery, useNavigation } from '@/components/hooks'; import { LinksTable } from './LinksTable'; -import { DataGrid } from '@/components/common/DataGrid'; export function LinksDataTable() { const { teamId } = useNavigation(); diff --git a/src/app/(main)/links/LinksPage.tsx b/src/app/(main)/links/LinksPage.tsx index e94bccf8..a6e4c7c4 100644 --- a/src/app/(main)/links/LinksPage.tsx +++ b/src/app/(main)/links/LinksPage.tsx @@ -1,11 +1,11 @@ 'use client'; -import { PageBody } from '@/components/common/PageBody'; import { Column } from '@umami/react-zen'; -import { PageHeader } from '@/components/common/PageHeader'; -import { LinkAddButton } from './LinkAddButton'; -import { useMessages, useNavigation } from '@/components/hooks'; import { LinksDataTable } from '@/app/(main)/links/LinksDataTable'; +import { PageBody } from '@/components/common/PageBody'; +import { PageHeader } from '@/components/common/PageHeader'; import { Panel } from '@/components/common/Panel'; +import { useMessages, useNavigation } from '@/components/hooks'; +import { LinkAddButton } from './LinkAddButton'; export function LinksPage() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/links/LinksTable.tsx b/src/app/(main)/links/LinksTable.tsx index 5df15b78..2ce4ba49 100644 --- a/src/app/(main)/links/LinksTable.tsx +++ b/src/app/(main)/links/LinksTable.tsx @@ -1,10 +1,10 @@ +import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen'; import Link from 'next/link'; -import { DataTable, DataColumn, Row, DataTableProps } from '@umami/react-zen'; -import { useMessages, useNavigation, useSlug } from '@/components/hooks'; import { DateDistance } from '@/components/common/DateDistance'; import { ExternalLink } from '@/components/common/ExternalLink'; -import { LinkEditButton } from './LinkEditButton'; +import { useMessages, useNavigation, useSlug } from '@/components/hooks'; import { LinkDeleteButton } from './LinkDeleteButton'; +import { LinkEditButton } from './LinkEditButton'; export function LinksTable(props: DataTableProps) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/links/[linkId]/LinkControls.tsx b/src/app/(main)/links/[linkId]/LinkControls.tsx index 4e43c760..1d1147a8 100644 --- a/src/app/(main)/links/[linkId]/LinkControls.tsx +++ b/src/app/(main)/links/[linkId]/LinkControls.tsx @@ -1,9 +1,9 @@ import { Column, Row } from '@umami/react-zen'; -import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton'; -import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter'; +import { ExportButton } from '@/components/input/ExportButton'; import { FilterBar } from '@/components/input/FilterBar'; import { MonthFilter } from '@/components/input/MonthFilter'; -import { ExportButton } from '@/components/input/ExportButton'; +import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter'; +import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton'; export function LinkControls({ linkId: websiteId, diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx index ba1de3ee..b7c70f07 100644 --- a/src/app/(main)/links/[linkId]/LinkHeader.tsx +++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx @@ -1,8 +1,8 @@ -import { useLink, useMessages, useSlug } from '@/components/hooks'; -import { PageHeader } from '@/components/common/PageHeader'; import { Icon, Text } from '@umami/react-zen'; -import { ExternalLink, Link } from '@/components/icons'; import { LinkButton } from '@/components/common/LinkButton'; +import { PageHeader } from '@/components/common/PageHeader'; +import { useLink, useMessages, useSlug } from '@/components/hooks'; +import { ExternalLink, Link } from '@/components/icons'; export function LinkHeader() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx b/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx index 43c14050..1fe8c45f 100644 --- a/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx +++ b/src/app/(main)/links/[linkId]/LinkMetricsBar.tsx @@ -1,9 +1,9 @@ +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useDateRange, useMessages } from '@/components/hooks'; +import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery'; import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; import { formatLongNumber } from '@/lib/format'; -import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; export function LinkMetricsBar({ linkId, diff --git a/src/app/(main)/links/[linkId]/LinkPage.tsx b/src/app/(main)/links/[linkId]/LinkPage.tsx index b4377e5c..ddacf08f 100644 --- a/src/app/(main)/links/[linkId]/LinkPage.tsx +++ b/src/app/(main)/links/[linkId]/LinkPage.tsx @@ -1,14 +1,14 @@ 'use client'; -import { PageBody } from '@/components/common/PageBody'; -import { LinkProvider } from '@/app/(main)/links/LinkProvider'; -import { LinkHeader } from '@/app/(main)/links/[linkId]/LinkHeader'; -import { Panel } from '@/components/common/Panel'; -import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart'; -import { LinkMetricsBar } from '@/app/(main)/links/[linkId]/LinkMetricsBar'; -import { LinkControls } from '@/app/(main)/links/[linkId]/LinkControls'; -import { LinkPanels } from '@/app/(main)/links/[linkId]/LinkPanels'; import { Column, Grid } from '@umami/react-zen'; +import { LinkControls } from '@/app/(main)/links/[linkId]/LinkControls'; +import { LinkHeader } from '@/app/(main)/links/[linkId]/LinkHeader'; +import { LinkMetricsBar } from '@/app/(main)/links/[linkId]/LinkMetricsBar'; +import { LinkPanels } from '@/app/(main)/links/[linkId]/LinkPanels'; +import { LinkProvider } from '@/app/(main)/links/LinkProvider'; import { ExpandedViewModal } from '@/app/(main)/websites/[websiteId]/ExpandedViewModal'; +import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart'; +import { PageBody } from '@/components/common/PageBody'; +import { Panel } from '@/components/common/Panel'; const excludedIds = ['path', 'entry', 'exit', 'title', 'language', 'screen', 'event']; diff --git a/src/app/(main)/links/[linkId]/LinkPanels.tsx b/src/app/(main)/links/[linkId]/LinkPanels.tsx index ed43f548..f33525e7 100644 --- a/src/app/(main)/links/[linkId]/LinkPanels.tsx +++ b/src/app/(main)/links/[linkId]/LinkPanels.tsx @@ -1,9 +1,9 @@ -import { Grid, Tabs, Tab, TabList, TabPanel, Heading } from '@umami/react-zen'; +import { Grid, Heading, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; import { GridRow } from '@/components/common/GridRow'; import { Panel } from '@/components/common/Panel'; -import { WorldMap } from '@/components/metrics/WorldMap'; -import { MetricsTable } from '@/components/metrics/MetricsTable'; import { useMessages } from '@/components/hooks'; +import { MetricsTable } from '@/components/metrics/MetricsTable'; +import { WorldMap } from '@/components/metrics/WorldMap'; export function LinkPanels({ linkId }: { linkId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/links/[linkId]/page.tsx b/src/app/(main)/links/[linkId]/page.tsx index ae3b2c9a..4317ada2 100644 --- a/src/app/(main)/links/[linkId]/page.tsx +++ b/src/app/(main)/links/[linkId]/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { LinkPage } from './LinkPage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ linkId: string }> }) { const { linkId } = await params; diff --git a/src/app/(main)/links/page.tsx b/src/app/(main)/links/page.tsx index ed89c727..24c9c18e 100644 --- a/src/app/(main)/links/page.tsx +++ b/src/app/(main)/links/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { LinksPage } from './LinksPage'; -import { Metadata } from 'next'; export default function () { return ; diff --git a/src/app/(main)/pixels/PixelAddButton.tsx b/src/app/(main)/pixels/PixelAddButton.tsx index 8c89c795..1573b9e0 100644 --- a/src/app/(main)/pixels/PixelAddButton.tsx +++ b/src/app/(main)/pixels/PixelAddButton.tsx @@ -1,7 +1,7 @@ import { useMessages } from '@/components/hooks'; import { Plus } from '@/components/icons'; -import { PixelEditForm } from './PixelEditForm'; import { DialogButton } from '@/components/input/DialogButton'; +import { PixelEditForm } from './PixelEditForm'; export function PixelAddButton({ teamId }: { teamId?: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/pixels/PixelDeleteButton.tsx b/src/app/(main)/pixels/PixelDeleteButton.tsx index 977ce5ef..436dba5c 100644 --- a/src/app/(main)/pixels/PixelDeleteButton.tsx +++ b/src/app/(main)/pixels/PixelDeleteButton.tsx @@ -1,8 +1,8 @@ -import { Trash } from '@/components/icons'; import { ConfirmationForm } from '@/components/common/ConfirmationForm'; -import { messages } from '@/components/messages'; import { useDeleteQuery, useMessages, useModified } from '@/components/hooks'; +import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import { messages } from '@/components/messages'; export function PixelDeleteButton({ pixelId, diff --git a/src/app/(main)/pixels/PixelEditButton.tsx b/src/app/(main)/pixels/PixelEditButton.tsx index d8627bb9..3c5924da 100644 --- a/src/app/(main)/pixels/PixelEditButton.tsx +++ b/src/app/(main)/pixels/PixelEditButton.tsx @@ -1,7 +1,7 @@ -import { Edit } from '@/components/icons'; -import { PixelEditForm } from './PixelEditForm'; import { useMessages } from '@/components/hooks'; +import { Edit } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import { PixelEditForm } from './PixelEditForm'; export function PixelEditButton({ pixelId }: { pixelId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/pixels/PixelEditForm.tsx b/src/app/(main)/pixels/PixelEditForm.tsx index a3a4f0c8..aedd3a3b 100644 --- a/src/app/(main)/pixels/PixelEditForm.tsx +++ b/src/app/(main)/pixels/PixelEditForm.tsx @@ -1,22 +1,21 @@ import { + Button, + Column, Form, FormField, FormSubmitButton, + Icon, + Label, + Loading, Row, TextField, - Button, - Label, - Column, - Icon, - Loading, } from '@umami/react-zen'; -import { useConfig, usePixelQuery } from '@/components/hooks'; -import { useMessages } from '@/components/hooks'; -import { RefreshCw } from '@/components/icons'; -import { getRandomChars } from '@/lib/generate'; -import { useUpdateQuery } from '@/components/hooks/queries/useUpdateQuery'; import { useEffect, useState } from 'react'; +import { useConfig, useMessages, usePixelQuery } from '@/components/hooks'; +import { useUpdateQuery } from '@/components/hooks/queries/useUpdateQuery'; +import { RefreshCw } from '@/components/icons'; import { PIXELS_URL } from '@/lib/constants'; +import { getRandomChars } from '@/lib/generate'; const generateId = () => getRandomChars(9); diff --git a/src/app/(main)/pixels/PixelProvider.tsx b/src/app/(main)/pixels/PixelProvider.tsx index 3ba4c5e5..9e929d8c 100644 --- a/src/app/(main)/pixels/PixelProvider.tsx +++ b/src/app/(main)/pixels/PixelProvider.tsx @@ -1,8 +1,8 @@ 'use client'; -import { createContext, ReactNode } from 'react'; import { Loading } from '@umami/react-zen'; -import { Pixel } from '@/generated/prisma/client'; +import { createContext, type ReactNode } from 'react'; import { usePixelQuery } from '@/components/hooks/queries/usePixelQuery'; +import type { Pixel } from '@/generated/prisma/client'; export const PixelContext = createContext(null); diff --git a/src/app/(main)/pixels/PixelsDataTable.tsx b/src/app/(main)/pixels/PixelsDataTable.tsx index 6a1eb982..51b8c5a0 100644 --- a/src/app/(main)/pixels/PixelsDataTable.tsx +++ b/src/app/(main)/pixels/PixelsDataTable.tsx @@ -1,6 +1,6 @@ -import { usePixelsQuery, useNavigation } from '@/components/hooks'; -import { PixelsTable } from './PixelsTable'; import { DataGrid } from '@/components/common/DataGrid'; +import { useNavigation, usePixelsQuery } from '@/components/hooks'; +import { PixelsTable } from './PixelsTable'; export function PixelsDataTable() { const { teamId } = useNavigation(); diff --git a/src/app/(main)/pixels/PixelsPage.tsx b/src/app/(main)/pixels/PixelsPage.tsx index 0733d5b1..4f6acefe 100644 --- a/src/app/(main)/pixels/PixelsPage.tsx +++ b/src/app/(main)/pixels/PixelsPage.tsx @@ -1,11 +1,11 @@ 'use client'; -import { PageBody } from '@/components/common/PageBody'; import { Column } from '@umami/react-zen'; +import { PageBody } from '@/components/common/PageBody'; import { PageHeader } from '@/components/common/PageHeader'; -import { PixelAddButton } from './PixelAddButton'; -import { useMessages, useNavigation } from '@/components/hooks'; -import { PixelsDataTable } from './PixelsDataTable'; import { Panel } from '@/components/common/Panel'; +import { useMessages, useNavigation } from '@/components/hooks'; +import { PixelAddButton } from './PixelAddButton'; +import { PixelsDataTable } from './PixelsDataTable'; export function PixelsPage() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/pixels/PixelsTable.tsx b/src/app/(main)/pixels/PixelsTable.tsx index 4edbb1cf..48f2121b 100644 --- a/src/app/(main)/pixels/PixelsTable.tsx +++ b/src/app/(main)/pixels/PixelsTable.tsx @@ -1,10 +1,10 @@ +import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen'; import Link from 'next/link'; -import { DataTable, DataColumn, Row, DataTableProps } from '@umami/react-zen'; -import { useMessages, useNavigation, useSlug } from '@/components/hooks'; import { DateDistance } from '@/components/common/DateDistance'; -import { PixelEditButton } from './PixelEditButton'; -import { PixelDeleteButton } from './PixelDeleteButton'; import { ExternalLink } from '@/components/common/ExternalLink'; +import { useMessages, useNavigation, useSlug } from '@/components/hooks'; +import { PixelDeleteButton } from './PixelDeleteButton'; +import { PixelEditButton } from './PixelEditButton'; export function PixelsTable(props: DataTableProps) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/pixels/[pixelId]/PixelControls.tsx b/src/app/(main)/pixels/[pixelId]/PixelControls.tsx index 33f49222..55dcd576 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelControls.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelControls.tsx @@ -1,9 +1,9 @@ import { Column, Row } from '@umami/react-zen'; -import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton'; -import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter'; +import { ExportButton } from '@/components/input/ExportButton'; import { FilterBar } from '@/components/input/FilterBar'; import { MonthFilter } from '@/components/input/MonthFilter'; -import { ExportButton } from '@/components/input/ExportButton'; +import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter'; +import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton'; export function PixelControls({ pixelId: websiteId, diff --git a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx index a4972991..8171aaf1 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx @@ -1,8 +1,8 @@ -import { usePixel, useMessages, useSlug } from '@/components/hooks'; -import { PageHeader } from '@/components/common/PageHeader'; import { Icon, Text } from '@umami/react-zen'; -import { ExternalLink, Grid2x2 } from '@/components/icons'; import { LinkButton } from '@/components/common/LinkButton'; +import { PageHeader } from '@/components/common/PageHeader'; +import { useMessages, usePixel, useSlug } from '@/components/hooks'; +import { ExternalLink, Grid2x2 } from '@/components/icons'; export function PixelHeader() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx b/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx index 0305df7f..c9dcd357 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelMetricsBar.tsx @@ -1,9 +1,9 @@ +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useDateRange, useMessages } from '@/components/hooks'; +import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery'; import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; import { formatLongNumber } from '@/lib/format'; -import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; export function PixelMetricsBar({ pixelId, diff --git a/src/app/(main)/pixels/[pixelId]/PixelPage.tsx b/src/app/(main)/pixels/[pixelId]/PixelPage.tsx index 46cfe338..7a4ae9d7 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelPage.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelPage.tsx @@ -1,14 +1,14 @@ 'use client'; -import { PageBody } from '@/components/common/PageBody'; -import { PixelProvider } from '@/app/(main)/pixels/PixelProvider'; -import { PixelHeader } from '@/app/(main)/pixels/[pixelId]/PixelHeader'; -import { Panel } from '@/components/common/Panel'; -import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart'; -import { PixelMetricsBar } from '@/app/(main)/pixels/[pixelId]/PixelMetricsBar'; -import { PixelControls } from '@/app/(main)/pixels/[pixelId]/PixelControls'; -import { PixelPanels } from '@/app/(main)/pixels/[pixelId]/PixelPanels'; import { Column, Grid } from '@umami/react-zen'; +import { PixelControls } from '@/app/(main)/pixels/[pixelId]/PixelControls'; +import { PixelHeader } from '@/app/(main)/pixels/[pixelId]/PixelHeader'; +import { PixelMetricsBar } from '@/app/(main)/pixels/[pixelId]/PixelMetricsBar'; +import { PixelPanels } from '@/app/(main)/pixels/[pixelId]/PixelPanels'; +import { PixelProvider } from '@/app/(main)/pixels/PixelProvider'; import { ExpandedViewModal } from '@/app/(main)/websites/[websiteId]/ExpandedViewModal'; +import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart'; +import { PageBody } from '@/components/common/PageBody'; +import { Panel } from '@/components/common/Panel'; const excludedIds = ['path', 'entry', 'exit', 'title', 'language', 'screen', 'event']; diff --git a/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx b/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx index d3adc1a3..9cc24c92 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelPanels.tsx @@ -1,9 +1,9 @@ -import { Grid, Tabs, Tab, TabList, TabPanel, Heading } from '@umami/react-zen'; +import { Grid, Heading, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; import { GridRow } from '@/components/common/GridRow'; import { Panel } from '@/components/common/Panel'; -import { WorldMap } from '@/components/metrics/WorldMap'; -import { MetricsTable } from '@/components/metrics/MetricsTable'; import { useMessages } from '@/components/hooks'; +import { MetricsTable } from '@/components/metrics/MetricsTable'; +import { WorldMap } from '@/components/metrics/WorldMap'; export function PixelPanels({ pixelId }: { pixelId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/pixels/[pixelId]/page.tsx b/src/app/(main)/pixels/[pixelId]/page.tsx index 85456d29..d1db92f3 100644 --- a/src/app/(main)/pixels/[pixelId]/page.tsx +++ b/src/app/(main)/pixels/[pixelId]/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { PixelPage } from './PixelPage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: { pixelId: string } }) { const { pixelId } = await params; diff --git a/src/app/(main)/pixels/page.tsx b/src/app/(main)/pixels/page.tsx index 4573b065..cc240cd2 100644 --- a/src/app/(main)/pixels/page.tsx +++ b/src/app/(main)/pixels/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { PixelsPage } from './PixelsPage'; -import { Metadata } from 'next'; export default function () { return ; diff --git a/src/app/(main)/settings/SettingsLayout.tsx b/src/app/(main)/settings/SettingsLayout.tsx index fc7b11e7..adfaaa4f 100644 --- a/src/app/(main)/settings/SettingsLayout.tsx +++ b/src/app/(main)/settings/SettingsLayout.tsx @@ -1,7 +1,7 @@ 'use client'; -import { PageBody } from '@/components/common/PageBody'; import { Column, Grid } from '@umami/react-zen'; -import { ReactNode } from 'react'; +import type { ReactNode } from 'react'; +import { PageBody } from '@/components/common/PageBody'; import { SettingsNav } from './SettingsNav'; export function SettingsLayout({ children }: { children: ReactNode }) { diff --git a/src/app/(main)/settings/layout.tsx b/src/app/(main)/settings/layout.tsx index c934d596..e8dfb30d 100644 --- a/src/app/(main)/settings/layout.tsx +++ b/src/app/(main)/settings/layout.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { SettingsLayout } from './SettingsLayout'; export default function ({ children }) { diff --git a/src/app/(main)/settings/preferences/DateRangeSetting.tsx b/src/app/(main)/settings/preferences/DateRangeSetting.tsx index c0e8221e..3f5e6647 100644 --- a/src/app/(main)/settings/preferences/DateRangeSetting.tsx +++ b/src/app/(main)/settings/preferences/DateRangeSetting.tsx @@ -1,9 +1,9 @@ -import { useState } from 'react'; -import { DateFilter } from '@/components/input/DateFilter'; import { Button, Row } from '@umami/react-zen'; +import { useState } from 'react'; import { useMessages } from '@/components/hooks'; +import { DateFilter } from '@/components/input/DateFilter'; import { DATE_RANGE_CONFIG, DEFAULT_DATE_RANGE_VALUE } from '@/lib/constants'; -import { setItem, getItem } from '@/lib/storage'; +import { getItem, setItem } from '@/lib/storage'; export function DateRangeSetting() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/settings/preferences/LanguageSetting.tsx b/src/app/(main)/settings/preferences/LanguageSetting.tsx index 0bcaa6ba..00a2d74f 100644 --- a/src/app/(main)/settings/preferences/LanguageSetting.tsx +++ b/src/app/(main)/settings/preferences/LanguageSetting.tsx @@ -1,5 +1,5 @@ +import { Button, ListItem, Row, Select } from '@umami/react-zen'; import { useState } from 'react'; -import { Button, Select, ListItem, Row } from '@umami/react-zen'; import { useLocale, useMessages } from '@/components/hooks'; import { DEFAULT_LOCALE } from '@/lib/constants'; import { languages } from '@/lib/lang'; diff --git a/src/app/(main)/settings/preferences/PreferenceSettings.tsx b/src/app/(main)/settings/preferences/PreferenceSettings.tsx index 9192a905..a2890ce9 100644 --- a/src/app/(main)/settings/preferences/PreferenceSettings.tsx +++ b/src/app/(main)/settings/preferences/PreferenceSettings.tsx @@ -1,9 +1,9 @@ import { Column, Label } from '@umami/react-zen'; import { useLoginQuery, useMessages } from '@/components/hooks'; -import { TimezoneSetting } from './TimezoneSetting'; import { DateRangeSetting } from './DateRangeSetting'; import { LanguageSetting } from './LanguageSetting'; import { ThemeSetting } from './ThemeSetting'; +import { TimezoneSetting } from './TimezoneSetting'; export function PreferenceSettings() { const { user } = useLoginQuery(); diff --git a/src/app/(main)/settings/preferences/PreferencesPage.tsx b/src/app/(main)/settings/preferences/PreferencesPage.tsx index 4ddd3511..61e26694 100644 --- a/src/app/(main)/settings/preferences/PreferencesPage.tsx +++ b/src/app/(main)/settings/preferences/PreferencesPage.tsx @@ -1,10 +1,10 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { useMessages } from '@/components/hooks'; -import { Panel } from '@/components/common/Panel'; -import { PreferenceSettings } from './PreferenceSettings'; -import { PageHeader } from '@/components/common/PageHeader'; import { PageBody } from '@/components/common/PageBody'; +import { PageHeader } from '@/components/common/PageHeader'; +import { Panel } from '@/components/common/Panel'; +import { useMessages } from '@/components/hooks'; +import { PreferenceSettings } from './PreferenceSettings'; export function PreferencesPage() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/settings/preferences/ThemeSetting.tsx b/src/app/(main)/settings/preferences/ThemeSetting.tsx index d0c4fb28..03bd6a6e 100644 --- a/src/app/(main)/settings/preferences/ThemeSetting.tsx +++ b/src/app/(main)/settings/preferences/ThemeSetting.tsx @@ -1,5 +1,5 @@ -import { Row, Button, Icon, useTheme } from '@umami/react-zen'; -import { Sun, Moon } from '@/components/icons'; +import { Button, Icon, Row, useTheme } from '@umami/react-zen'; +import { Moon, Sun } from '@/components/icons'; export function ThemeSetting() { const { theme, setTheme } = useTheme(); diff --git a/src/app/(main)/settings/preferences/TimezoneSetting.tsx b/src/app/(main)/settings/preferences/TimezoneSetting.tsx index 68d8fadb..cf20b20d 100644 --- a/src/app/(main)/settings/preferences/TimezoneSetting.tsx +++ b/src/app/(main)/settings/preferences/TimezoneSetting.tsx @@ -1,6 +1,6 @@ +import { Button, ListItem, Row, Select } from '@umami/react-zen'; import { useState } from 'react'; -import { Row, Select, ListItem, Button } from '@umami/react-zen'; -import { useTimezone, useMessages } from '@/components/hooks'; +import { useMessages, useTimezone } from '@/components/hooks'; import { getTimezone } from '@/lib/date'; const timezones = Intl.supportedValuesOf('timeZone'); diff --git a/src/app/(main)/settings/preferences/page.tsx b/src/app/(main)/settings/preferences/page.tsx index bc1398f3..dd16870e 100644 --- a/src/app/(main)/settings/preferences/page.tsx +++ b/src/app/(main)/settings/preferences/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { PreferencesPage } from './PreferencesPage'; export default function () { diff --git a/src/app/(main)/settings/profile/PasswordChangeButton.tsx b/src/app/(main)/settings/profile/PasswordChangeButton.tsx index 885e4d66..6ce8ef84 100644 --- a/src/app/(main)/settings/profile/PasswordChangeButton.tsx +++ b/src/app/(main)/settings/profile/PasswordChangeButton.tsx @@ -1,7 +1,7 @@ -import { Button, Icon, Text, useToast, DialogTrigger, Dialog, Modal } from '@umami/react-zen'; -import { PasswordEditForm } from './PasswordEditForm'; -import { LockKeyhole } from '@/components/icons'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; +import { LockKeyhole } from '@/components/icons'; +import { PasswordEditForm } from './PasswordEditForm'; export function PasswordChangeButton() { const { formatMessage, labels, messages } = useMessages(); diff --git a/src/app/(main)/settings/profile/PasswordEditForm.tsx b/src/app/(main)/settings/profile/PasswordEditForm.tsx index 2c27a2d5..6f782e44 100644 --- a/src/app/(main)/settings/profile/PasswordEditForm.tsx +++ b/src/app/(main)/settings/profile/PasswordEditForm.tsx @@ -1,10 +1,10 @@ import { - Form, - FormField, - FormButtons, - PasswordField, Button, + Form, + FormButtons, + FormField, FormSubmitButton, + PasswordField, } from '@umami/react-zen'; import { useMessages, useUpdateQuery } from '@/components/hooks'; diff --git a/src/app/(main)/settings/profile/ProfilePage.tsx b/src/app/(main)/settings/profile/ProfilePage.tsx index dab836de..f03499a3 100644 --- a/src/app/(main)/settings/profile/ProfilePage.tsx +++ b/src/app/(main)/settings/profile/ProfilePage.tsx @@ -1,10 +1,10 @@ 'use client'; -import { ProfileSettings } from './ProfileSettings'; -import { useMessages } from '@/components/hooks'; -import { Panel } from '@/components/common/Panel'; import { Column } from '@umami/react-zen'; -import { PageHeader } from '@/components/common/PageHeader'; import { PageBody } from '@/components/common/PageBody'; +import { PageHeader } from '@/components/common/PageHeader'; +import { Panel } from '@/components/common/Panel'; +import { useMessages } from '@/components/hooks'; +import { ProfileSettings } from './ProfileSettings'; export function ProfilePage() { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/settings/profile/ProfileSettings.tsx b/src/app/(main)/settings/profile/ProfileSettings.tsx index 156bf28e..fae73a53 100644 --- a/src/app/(main)/settings/profile/ProfileSettings.tsx +++ b/src/app/(main)/settings/profile/ProfileSettings.tsx @@ -1,4 +1,4 @@ -import { Row, Column, Label } from '@umami/react-zen'; +import { Column, Label, Row } from '@umami/react-zen'; import { useConfig, useLoginQuery, useMessages } from '@/components/hooks'; import { ROLES } from '@/lib/constants'; import { PasswordChangeButton } from './PasswordChangeButton'; diff --git a/src/app/(main)/settings/profile/page.tsx b/src/app/(main)/settings/profile/page.tsx index ad2b9bcc..6060b91f 100644 --- a/src/app/(main)/settings/profile/page.tsx +++ b/src/app/(main)/settings/profile/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { ProfilePage } from './ProfilePage'; export default function () { diff --git a/src/app/(main)/settings/teams/TeamsSettingsPage.tsx b/src/app/(main)/settings/teams/TeamsSettingsPage.tsx index 9d5c8acd..dc3e3bc8 100644 --- a/src/app/(main)/settings/teams/TeamsSettingsPage.tsx +++ b/src/app/(main)/settings/teams/TeamsSettingsPage.tsx @@ -1,7 +1,7 @@ 'use client'; +import { Column } from '@umami/react-zen'; import { TeamsDataTable } from '@/app/(main)/teams/TeamsDataTable'; import { TeamsHeader } from '@/app/(main)/teams/TeamsHeader'; -import { Column } from '@umami/react-zen'; import { Panel } from '@/components/common/Panel'; export function TeamsSettingsPage() { diff --git a/src/app/(main)/settings/teams/[teamId]/TeamSettingsPage.tsx b/src/app/(main)/settings/teams/[teamId]/TeamSettingsPage.tsx index 8ad2b694..9539625f 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamSettingsPage.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamSettingsPage.tsx @@ -1,6 +1,6 @@ 'use client'; -import { TeamProvider } from '@/app/(main)/teams/TeamProvider'; import { TeamSettings } from '@/app/(main)/teams/[teamId]/TeamSettings'; +import { TeamProvider } from '@/app/(main)/teams/TeamProvider'; export function TeamSettingsPage({ teamId }: { teamId: string }) { return ( diff --git a/src/app/(main)/settings/teams/[teamId]/page.tsx b/src/app/(main)/settings/teams/[teamId]/page.tsx index 5a9aaacb..58a380bc 100644 --- a/src/app/(main)/settings/teams/[teamId]/page.tsx +++ b/src/app/(main)/settings/teams/[teamId]/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { TeamSettingsPage } from './TeamSettingsPage'; export default async function ({ params }: { params: Promise<{ teamId: string }> }) { diff --git a/src/app/(main)/settings/teams/page.tsx b/src/app/(main)/settings/teams/page.tsx index dd3bdade..a0913f45 100644 --- a/src/app/(main)/settings/teams/page.tsx +++ b/src/app/(main)/settings/teams/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { TeamsSettingsPage } from './TeamsSettingsPage'; export default function () { diff --git a/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx b/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx index c1812ed0..5009ec6c 100644 --- a/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx +++ b/src/app/(main)/settings/websites/WebsitesSettingsPage.tsx @@ -1,8 +1,8 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { useMessages } from '@/components/hooks'; import { WebsitesDataTable } from '@/app/(main)/websites/WebsitesDataTable'; import { SectionHeader } from '@/components/common/SectionHeader'; +import { useMessages } from '@/components/hooks'; export function WebsitesSettingsPage({ teamId }: { teamId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx index 0dc7bcc1..53b4cd9c 100644 --- a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx @@ -1,8 +1,8 @@ 'use client'; -import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; +import { Column } from '@umami/react-zen'; import { WebsiteSettings } from '@/app/(main)/websites/[websiteId]/settings/WebsiteSettings'; import { WebsiteSettingsHeader } from '@/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader'; -import { Column } from '@umami/react-zen'; +import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; export function WebsiteSettingsPage({ websiteId }: { websiteId: string }) { return ( diff --git a/src/app/(main)/settings/websites/[websiteId]/page.tsx b/src/app/(main)/settings/websites/[websiteId]/page.tsx index a65a5a9f..9adfc915 100644 --- a/src/app/(main)/settings/websites/[websiteId]/page.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { WebsiteSettingsPage } from './WebsiteSettingsPage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { const { websiteId } = await params; diff --git a/src/app/(main)/settings/websites/page.tsx b/src/app/(main)/settings/websites/page.tsx index cc8f886a..19c14fd6 100644 --- a/src/app/(main)/settings/websites/page.tsx +++ b/src/app/(main)/settings/websites/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { WebsitesSettingsPage } from './WebsitesSettingsPage'; export default async function ({ params }: { params: Promise<{ teamId: string }> }) { diff --git a/src/app/(main)/teams/TeamAddForm.tsx b/src/app/(main)/teams/TeamAddForm.tsx index 87a6a4fd..c95259f4 100644 --- a/src/app/(main)/teams/TeamAddForm.tsx +++ b/src/app/(main)/teams/TeamAddForm.tsx @@ -1,4 +1,3 @@ -import { useMessages, useUpdateQuery } from '@/components/hooks'; import { Button, Form, @@ -7,6 +6,7 @@ import { FormSubmitButton, TextField, } from '@umami/react-zen'; +import { useMessages, useUpdateQuery } from '@/components/hooks'; export function TeamAddForm({ onSave, onClose }: { onSave: () => void; onClose: () => void }) { const { formatMessage, labels, getErrorMessage } = useMessages(); diff --git a/src/app/(main)/teams/TeamJoinForm.tsx b/src/app/(main)/teams/TeamJoinForm.tsx index 0c896747..69780788 100644 --- a/src/app/(main)/teams/TeamJoinForm.tsx +++ b/src/app/(main)/teams/TeamJoinForm.tsx @@ -1,10 +1,10 @@ import { - Form, - FormField, - FormButtons, - TextField, Button, + Form, + FormButtons, + FormField, FormSubmitButton, + TextField, } from '@umami/react-zen'; import { useMessages, useUpdateQuery } from '@/components/hooks'; diff --git a/src/app/(main)/teams/TeamLeaveButton.tsx b/src/app/(main)/teams/TeamLeaveButton.tsx index 6e455d7d..2cca76f8 100644 --- a/src/app/(main)/teams/TeamLeaveButton.tsx +++ b/src/app/(main)/teams/TeamLeaveButton.tsx @@ -1,6 +1,6 @@ -import { useLoginQuery, useMessages, useModified } from '@/components/hooks'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text } from '@umami/react-zen'; import { useRouter } from 'next/navigation'; -import { Button, Icon, Modal, DialogTrigger, Dialog, Text } from '@umami/react-zen'; +import { useLoginQuery, useMessages, useModified } from '@/components/hooks'; import { LogOut } from '@/components/icons'; import { TeamLeaveForm } from './TeamLeaveForm'; diff --git a/src/app/(main)/teams/TeamLeaveForm.tsx b/src/app/(main)/teams/TeamLeaveForm.tsx index 1c7846b8..b3dcaf58 100644 --- a/src/app/(main)/teams/TeamLeaveForm.tsx +++ b/src/app/(main)/teams/TeamLeaveForm.tsx @@ -1,5 +1,5 @@ -import { useDeleteQuery, useMessages, useModified } from '@/components/hooks'; import { ConfirmationForm } from '@/components/common/ConfirmationForm'; +import { useDeleteQuery, useMessages, useModified } from '@/components/hooks'; export function TeamLeaveForm({ teamId, diff --git a/src/app/(main)/teams/TeamProvider.tsx b/src/app/(main)/teams/TeamProvider.tsx index d4d31986..cea41614 100644 --- a/src/app/(main)/teams/TeamProvider.tsx +++ b/src/app/(main)/teams/TeamProvider.tsx @@ -1,8 +1,8 @@ 'use client'; -import { createContext, ReactNode } from 'react'; import { Loading } from '@umami/react-zen'; +import { createContext, type ReactNode } from 'react'; import { useTeamQuery } from '@/components/hooks/queries/useTeamQuery'; -import { Team } from '@/generated/prisma/client'; +import type { Team } from '@/generated/prisma/client'; export const TeamContext = createContext(null); diff --git a/src/app/(main)/teams/TeamsAddButton.tsx b/src/app/(main)/teams/TeamsAddButton.tsx index 911c3b2b..578a273a 100644 --- a/src/app/(main)/teams/TeamsAddButton.tsx +++ b/src/app/(main)/teams/TeamsAddButton.tsx @@ -1,8 +1,8 @@ -import { Button, Icon, Modal, DialogTrigger, Dialog, Text, useToast } from '@umami/react-zen'; -import { Plus } from '@/components/icons'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen'; import { useMessages, useModified } from '@/components/hooks'; -import { TeamAddForm } from './TeamAddForm'; +import { Plus } from '@/components/icons'; import { messages } from '@/components/messages'; +import { TeamAddForm } from './TeamAddForm'; export function TeamsAddButton({ onSave }: { onSave?: () => void }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/teams/TeamsDataTable.tsx b/src/app/(main)/teams/TeamsDataTable.tsx index 4bc939b1..cdce7b93 100644 --- a/src/app/(main)/teams/TeamsDataTable.tsx +++ b/src/app/(main)/teams/TeamsDataTable.tsx @@ -1,6 +1,6 @@ +import Link from 'next/link'; import { DataGrid } from '@/components/common/DataGrid'; import { useLoginQuery, useNavigation, useUserTeamsQuery } from '@/components/hooks'; -import Link from 'next/link'; import { TeamsTable } from './TeamsTable'; export function TeamsDataTable() { diff --git a/src/app/(main)/teams/TeamsHeader.tsx b/src/app/(main)/teams/TeamsHeader.tsx index c45bc85c..579ba595 100644 --- a/src/app/(main)/teams/TeamsHeader.tsx +++ b/src/app/(main)/teams/TeamsHeader.tsx @@ -1,9 +1,9 @@ import { Row } from '@umami/react-zen'; import { PageHeader } from '@/components/common/PageHeader'; -import { ROLES } from '@/lib/constants'; import { useLoginQuery, useMessages } from '@/components/hooks'; -import { TeamsJoinButton } from './TeamsJoinButton'; +import { ROLES } from '@/lib/constants'; import { TeamsAddButton } from './TeamsAddButton'; +import { TeamsJoinButton } from './TeamsJoinButton'; export function TeamsHeader({ allowCreate = true, diff --git a/src/app/(main)/teams/TeamsJoinButton.tsx b/src/app/(main)/teams/TeamsJoinButton.tsx index 74295497..017211e2 100644 --- a/src/app/(main)/teams/TeamsJoinButton.tsx +++ b/src/app/(main)/teams/TeamsJoinButton.tsx @@ -1,6 +1,6 @@ -import { Button, Icon, Modal, DialogTrigger, Dialog, Text, useToast } from '@umami/react-zen'; -import { UserPlus } from '@/components/icons'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text, useToast } from '@umami/react-zen'; import { useMessages, useModified } from '@/components/hooks'; +import { UserPlus } from '@/components/icons'; import { TeamJoinForm } from './TeamJoinForm'; export function TeamsJoinButton() { diff --git a/src/app/(main)/teams/TeamsPage.tsx b/src/app/(main)/teams/TeamsPage.tsx index 3b0f57ea..5b11bcf8 100644 --- a/src/app/(main)/teams/TeamsPage.tsx +++ b/src/app/(main)/teams/TeamsPage.tsx @@ -1,9 +1,9 @@ 'use client'; +import { Column } from '@umami/react-zen'; import { TeamsDataTable } from '@/app/(main)/teams/TeamsDataTable'; import { TeamsHeader } from '@/app/(main)/teams/TeamsHeader'; -import { Column } from '@umami/react-zen'; -import { Panel } from '@/components/common/Panel'; import { PageBody } from '@/components/common/PageBody'; +import { Panel } from '@/components/common/Panel'; export function TeamsPage() { return ( diff --git a/src/app/(main)/teams/TeamsTable.tsx b/src/app/(main)/teams/TeamsTable.tsx index b5f11233..754f0b2b 100644 --- a/src/app/(main)/teams/TeamsTable.tsx +++ b/src/app/(main)/teams/TeamsTable.tsx @@ -1,7 +1,7 @@ -import { DataColumn, DataTable, DataTableProps } from '@umami/react-zen'; +import { DataColumn, DataTable, type DataTableProps } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { useMessages } from '@/components/hooks'; import { ROLES } from '@/lib/constants'; -import { ReactNode } from 'react'; export interface TeamsTableProps extends DataTableProps { renderLink?: (row: any) => ReactNode; diff --git a/src/app/(main)/teams/[teamId]/TeamEditForm.tsx b/src/app/(main)/teams/[teamId]/TeamEditForm.tsx index eb05d362..74e038f6 100644 --- a/src/app/(main)/teams/[teamId]/TeamEditForm.tsx +++ b/src/app/(main)/teams/[teamId]/TeamEditForm.tsx @@ -1,16 +1,16 @@ import { - Form, - FormField, - FormButtons, - FormSubmitButton, - TextField, Button, + Form, + FormButtons, + FormField, + FormSubmitButton, IconLabel, Row, + TextField, } from '@umami/react-zen'; -import { getRandomChars } from '@/lib/generate'; import { useMessages, useTeam, useUpdateQuery } from '@/components/hooks'; import { RefreshCw } from '@/components/icons'; +import { getRandomChars } from '@/lib/generate'; const generateId = () => `team_${getRandomChars(16)}`; diff --git a/src/app/(main)/teams/[teamId]/TeamManage.tsx b/src/app/(main)/teams/[teamId]/TeamManage.tsx index 6c0fe46e..88cbad9e 100644 --- a/src/app/(main)/teams/[teamId]/TeamManage.tsx +++ b/src/app/(main)/teams/[teamId]/TeamManage.tsx @@ -1,7 +1,7 @@ -import { useMessages, useModified } from '@/components/hooks'; +import { Button, Dialog, DialogTrigger, Modal } from '@umami/react-zen'; import { useRouter } from 'next/navigation'; -import { Button, Modal, DialogTrigger, Dialog } from '@umami/react-zen'; import { ActionForm } from '@/components/common/ActionForm'; +import { useMessages, useModified } from '@/components/hooks'; import { TeamDeleteForm } from './TeamDeleteForm'; export function TeamManage({ teamId }: { teamId: string }) { diff --git a/src/app/(main)/teams/[teamId]/TeamMemberEditButton.tsx b/src/app/(main)/teams/[teamId]/TeamMemberEditButton.tsx index eb24d2aa..f75b6d18 100644 --- a/src/app/(main)/teams/[teamId]/TeamMemberEditButton.tsx +++ b/src/app/(main)/teams/[teamId]/TeamMemberEditButton.tsx @@ -1,8 +1,8 @@ -import { useMessages, useModified } from '@/components/hooks'; import { useToast } from '@umami/react-zen'; -import { TeamMemberEditForm } from './TeamMemberEditForm'; -import { DialogButton } from '@/components/input/DialogButton'; +import { useMessages, useModified } from '@/components/hooks'; import { Edit } from '@/components/icons'; +import { DialogButton } from '@/components/input/DialogButton'; +import { TeamMemberEditForm } from './TeamMemberEditForm'; export function TeamMemberEditButton({ teamId, diff --git a/src/app/(main)/teams/[teamId]/TeamMemberEditForm.tsx b/src/app/(main)/teams/[teamId]/TeamMemberEditForm.tsx index 76f0800f..4826746f 100644 --- a/src/app/(main)/teams/[teamId]/TeamMemberEditForm.tsx +++ b/src/app/(main)/teams/[teamId]/TeamMemberEditForm.tsx @@ -1,14 +1,14 @@ -import { useMessages, useUpdateQuery } from '@/components/hooks'; -import { ROLES } from '@/lib/constants'; import { Button, - Select, Form, FormButtons, FormField, - ListItem, FormSubmitButton, + ListItem, + Select, } from '@umami/react-zen'; +import { useMessages, useUpdateQuery } from '@/components/hooks'; +import { ROLES } from '@/lib/constants'; export function TeamMemberEditForm({ teamId, diff --git a/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx b/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx index 4ea83540..4d3e8e91 100644 --- a/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx +++ b/src/app/(main)/teams/[teamId]/TeamMemberRemoveButton.tsx @@ -1,8 +1,8 @@ import { ConfirmationForm } from '@/components/common/ConfirmationForm'; import { useDeleteQuery, useMessages, useModified } from '@/components/hooks'; -import { messages } from '@/components/messages'; import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import { messages } from '@/components/messages'; export function TeamMemberRemoveButton({ teamId, diff --git a/src/app/(main)/teams/[teamId]/TeamMembersDataTable.tsx b/src/app/(main)/teams/[teamId]/TeamMembersDataTable.tsx index d5f99310..52c0fe38 100644 --- a/src/app/(main)/teams/[teamId]/TeamMembersDataTable.tsx +++ b/src/app/(main)/teams/[teamId]/TeamMembersDataTable.tsx @@ -1,6 +1,6 @@ import { DataGrid } from '@/components/common/DataGrid'; -import { TeamMembersTable } from './TeamMembersTable'; import { useTeamMembersQuery } from '@/components/hooks'; +import { TeamMembersTable } from './TeamMembersTable'; export function TeamMembersDataTable({ teamId, diff --git a/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx b/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx index 8d06360d..8414908c 100644 --- a/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx +++ b/src/app/(main)/teams/[teamId]/TeamMembersTable.tsx @@ -1,8 +1,8 @@ import { DataColumn, DataTable, Row } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; import { ROLES } from '@/lib/constants'; -import { TeamMemberRemoveButton } from './TeamMemberRemoveButton'; import { TeamMemberEditButton } from './TeamMemberEditButton'; +import { TeamMemberRemoveButton } from './TeamMemberRemoveButton'; export function TeamMembersTable({ data = [], diff --git a/src/app/(main)/teams/[teamId]/TeamSettings.tsx b/src/app/(main)/teams/[teamId]/TeamSettings.tsx index 7ddd3b2f..3ddbe000 100644 --- a/src/app/(main)/teams/[teamId]/TeamSettings.tsx +++ b/src/app/(main)/teams/[teamId]/TeamSettings.tsx @@ -1,13 +1,13 @@ import { Column } from '@umami/react-zen'; -import { useLoginQuery, useNavigation, useTeam } from '@/components/hooks'; -import { ROLES } from '@/lib/constants'; -import { Users } from '@/components/icons'; import { TeamLeaveButton } from '@/app/(main)/teams/TeamLeaveButton'; -import { TeamManage } from './TeamManage'; -import { TeamEditForm } from './TeamEditForm'; -import { TeamMembersDataTable } from './TeamMembersDataTable'; import { PageHeader } from '@/components/common/PageHeader'; import { Panel } from '@/components/common/Panel'; +import { useLoginQuery, useNavigation, useTeam } from '@/components/hooks'; +import { Users } from '@/components/icons'; +import { ROLES } from '@/lib/constants'; +import { TeamEditForm } from './TeamEditForm'; +import { TeamManage } from './TeamManage'; +import { TeamMembersDataTable } from './TeamMembersDataTable'; export function TeamSettings({ teamId }: { teamId: string }) { const team: any = useTeam(); diff --git a/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx b/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx index c3a68c57..f2b4ecea 100644 --- a/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx +++ b/src/app/(main)/teams/[teamId]/TeamWebsiteRemoveButton.tsx @@ -1,5 +1,5 @@ -import { useDeleteQuery, useMessages } from '@/components/hooks'; import { Icon, LoadingButton, Text } from '@umami/react-zen'; +import { useDeleteQuery, useMessages } from '@/components/hooks'; import { X } from '@/components/icons'; export function TeamWebsiteRemoveButton({ teamId, websiteId, onSave }) { diff --git a/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx b/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx index b9542eef..10f56543 100644 --- a/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx +++ b/src/app/(main)/teams/[teamId]/TeamWebsitesTable.tsx @@ -1,9 +1,9 @@ import { DataColumn, DataTable, Row } from '@umami/react-zen'; -import { useMessages } from '@/components/hooks'; import Link from 'next/link'; -import { ROLES } from '@/lib/constants'; import { TeamMemberEditButton } from '@/app/(main)/teams/[teamId]/TeamMemberEditButton'; import { TeamMemberRemoveButton } from '@/app/(main)/teams/[teamId]/TeamMemberRemoveButton'; +import { useMessages } from '@/components/hooks'; +import { ROLES } from '@/lib/constants'; export function TeamWebsitesTable({ teamId, diff --git a/src/app/(main)/teams/page.tsx b/src/app/(main)/teams/page.tsx index ce353895..7344f150 100644 --- a/src/app/(main)/teams/page.tsx +++ b/src/app/(main)/teams/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { TeamsPage } from './TeamsPage'; export default function () { diff --git a/src/app/(main)/websites/WebsiteAddButton.tsx b/src/app/(main)/websites/WebsiteAddButton.tsx index db0349cf..76710abb 100644 --- a/src/app/(main)/websites/WebsiteAddButton.tsx +++ b/src/app/(main)/websites/WebsiteAddButton.tsx @@ -1,8 +1,8 @@ -import { useMessages, useModified } from '@/components/hooks'; import { useToast } from '@umami/react-zen'; +import { useMessages, useModified } from '@/components/hooks'; import { Plus } from '@/components/icons'; -import { WebsiteAddForm } from './WebsiteAddForm'; import { DialogButton } from '@/components/input/DialogButton'; +import { WebsiteAddForm } from './WebsiteAddForm'; export function WebsiteAddButton({ teamId, onSave }: { teamId: string; onSave?: () => void }) { const { formatMessage, labels, messages } = useMessages(); diff --git a/src/app/(main)/websites/WebsiteAddForm.tsx b/src/app/(main)/websites/WebsiteAddForm.tsx index b8ff7b45..df17ad5a 100644 --- a/src/app/(main)/websites/WebsiteAddForm.tsx +++ b/src/app/(main)/websites/WebsiteAddForm.tsx @@ -1,7 +1,6 @@ -import { Form, FormField, FormSubmitButton, Row, TextField, Button } from '@umami/react-zen'; -import { useUpdateQuery } from '@/components/hooks'; +import { Button, Form, FormField, FormSubmitButton, Row, TextField } from '@umami/react-zen'; +import { useMessages, useUpdateQuery } from '@/components/hooks'; import { DOMAIN_REGEX } from '@/lib/constants'; -import { useMessages } from '@/components/hooks'; export function WebsiteAddForm({ teamId, diff --git a/src/app/(main)/websites/WebsiteProvider.tsx b/src/app/(main)/websites/WebsiteProvider.tsx index 4129cdd3..75e8a358 100644 --- a/src/app/(main)/websites/WebsiteProvider.tsx +++ b/src/app/(main)/websites/WebsiteProvider.tsx @@ -1,8 +1,8 @@ 'use client'; -import { createContext, ReactNode } from 'react'; import { Loading } from '@umami/react-zen'; -import { Website } from '@/generated/prisma/client'; +import { createContext, type ReactNode } from 'react'; import { useWebsiteQuery } from '@/components/hooks/queries/useWebsiteQuery'; +import type { Website } from '@/generated/prisma/client'; export const WebsiteContext = createContext(null); diff --git a/src/app/(main)/websites/WebsitesDataTable.tsx b/src/app/(main)/websites/WebsitesDataTable.tsx index 93b1a7c7..2203262b 100644 --- a/src/app/(main)/websites/WebsitesDataTable.tsx +++ b/src/app/(main)/websites/WebsitesDataTable.tsx @@ -1,7 +1,7 @@ import Link from 'next/link'; -import { WebsitesTable } from './WebsitesTable'; import { DataGrid } from '@/components/common/DataGrid'; import { useLoginQuery, useNavigation, useUserWebsitesQuery } from '@/components/hooks'; +import { WebsitesTable } from './WebsitesTable'; export function WebsitesDataTable({ userId, diff --git a/src/app/(main)/websites/WebsitesHeader.tsx b/src/app/(main)/websites/WebsitesHeader.tsx index 86231a98..889b6025 100644 --- a/src/app/(main)/websites/WebsitesHeader.tsx +++ b/src/app/(main)/websites/WebsitesHeader.tsx @@ -1,6 +1,6 @@ +import { PageHeader } from '@/components/common/PageHeader'; import { useMessages, useNavigation } from '@/components/hooks'; import { WebsiteAddButton } from './WebsiteAddButton'; -import { PageHeader } from '@/components/common/PageHeader'; export interface WebsitesHeaderProps { allowCreate?: boolean; diff --git a/src/app/(main)/websites/WebsitesPage.tsx b/src/app/(main)/websites/WebsitesPage.tsx index 313dccc7..31de7047 100644 --- a/src/app/(main)/websites/WebsitesPage.tsx +++ b/src/app/(main)/websites/WebsitesPage.tsx @@ -1,11 +1,11 @@ 'use client'; -import { WebsitesDataTable } from './WebsitesDataTable'; -import { WebsiteAddButton } from './WebsiteAddButton'; -import { useMessages, useNavigation } from '@/components/hooks'; import { Column } from '@umami/react-zen'; +import { PageBody } from '@/components/common/PageBody'; import { PageHeader } from '@/components/common/PageHeader'; import { Panel } from '@/components/common/Panel'; -import { PageBody } from '@/components/common/PageBody'; +import { useMessages, useNavigation } from '@/components/hooks'; +import { WebsiteAddButton } from './WebsiteAddButton'; +import { WebsitesDataTable } from './WebsitesDataTable'; export function WebsitesPage() { const { teamId } = useNavigation(); diff --git a/src/app/(main)/websites/WebsitesTable.tsx b/src/app/(main)/websites/WebsitesTable.tsx index c2f7e0d4..70648ed7 100644 --- a/src/app/(main)/websites/WebsitesTable.tsx +++ b/src/app/(main)/websites/WebsitesTable.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { Icon, DataTable, DataColumn, DataTableProps } from '@umami/react-zen'; +import { DataColumn, DataTable, type DataTableProps, Icon } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { LinkButton } from '@/components/common/LinkButton'; import { useMessages, useNavigation } from '@/components/hooks'; import { SquarePen } from '@/components/icons'; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx index f014bbbe..264923a6 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/Attribution.tsx @@ -1,13 +1,13 @@ -import { Grid, Column } from '@umami/react-zen'; -import { useMessages, useResultQuery } from '@/components/hooks'; -import { Panel } from '@/components/common/Panel'; +import { Column, Grid } from '@umami/react-zen'; import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { Panel } from '@/components/common/Panel'; +import { SectionHeader } from '@/components/common/SectionHeader'; +import { useMessages, useResultQuery } from '@/components/hooks'; import { ListTable } from '@/components/metrics/ListTable'; import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; -import { SectionHeader } from '@/components/common/SectionHeader'; -import { formatLongNumber } from '@/lib/format'; import { percentFilter } from '@/lib/filters'; +import { formatLongNumber } from '@/lib/format'; export interface AttributionProps { websiteId: string; @@ -97,34 +97,28 @@ export function Attribution({ - + - + - + - + - + - + - + diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx index 9fe9012b..48611c46 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx @@ -1,9 +1,9 @@ 'use client'; +import { Column, Grid, ListItem, SearchField, Select } from '@umami/react-zen'; import { useState } from 'react'; -import { Column, Grid, Select, ListItem, SearchField } from '@umami/react-zen'; -import { Attribution } from './Attribution'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { useDateRange, useMessages } from '@/components/hooks'; +import { Attribution } from './Attribution'; export function AttributionPage({ websiteId }: { websiteId: string }) { const [model, setModel] = useState('first-click'); diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/page.tsx index ec75c58c..1368d4bc 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/attribution/page.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { AttributionPage } from './AttributionPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/Breakdown.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/Breakdown.tsx index cd5b5d71..4532d972 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/Breakdown.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/Breakdown.tsx @@ -1,6 +1,6 @@ -import { Text, DataTable, DataColumn, Column } from '@umami/react-zen'; -import { useMessages, useResultQuery, useFormat, useFields } from '@/components/hooks'; +import { Column, DataColumn, DataTable, Text } from '@umami/react-zen'; import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { useFields, useFormat, useMessages, useResultQuery } from '@/components/hooks'; import { formatShortTime } from '@/lib/format'; export interface BreakdownProps { @@ -54,13 +54,13 @@ export function Breakdown({ websiteId, selectedFields = [], startDate, endDate } align="end" width="120px" > - {row => row?.['visitors']?.toLocaleString()} + {row => row?.visitors?.toLocaleString()} - {row => row?.['visits']?.toLocaleString()} + {row => row?.visits?.toLocaleString()} - {row => row?.['views']?.toLocaleString()} + {row => row?.views?.toLocaleString()} {row => { - const n = (Math.min(row?.['visits'], row?.['bounces']) / row?.['visits']) * 100; - return Math.round(+n) + '%'; + const n = (Math.min(row?.visits, row?.bounces) / row?.visits) * 100; + return `${Math.round(+n)}%`; }} {row => { - const n = row?.['totaltime'] / row?.['visits']; + const n = row?.totaltime / row?.visits; return `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`; }} diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx index e1bb6711..fdead9fb 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/BreakdownPage.tsx @@ -1,12 +1,12 @@ 'use client'; +import { Column, Row } from '@umami/react-zen'; +import { useState } from 'react'; import { FieldSelectForm } from '@/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { Panel } from '@/components/common/Panel'; import { useDateRange, useMessages } from '@/components/hooks'; import { ListCheck } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; -import { Column, Row } from '@umami/react-zen'; -import { useState } from 'react'; import { Breakdown } from './Breakdown'; export function BreakdownPage({ websiteId }: { websiteId: string }) { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx index bbf69a5b..28e33682 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/FieldSelectForm.tsx @@ -1,6 +1,6 @@ -import { Column, List, ListItem, Grid, Button } from '@umami/react-zen'; -import { useFields, useMessages } from '@/components/hooks'; +import { Button, Column, Grid, List, ListItem } from '@umami/react-zen'; import { useState } from 'react'; +import { useFields, useMessages } from '@/components/hooks'; export function FieldSelectForm({ selectedFields = [], diff --git a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/page.tsx index 89295b3d..841d8635 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/breakdown/page.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/breakdown/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { BreakdownPage } from './BreakdownPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx index 5e266dd6..e336a3db 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx @@ -1,11 +1,11 @@ -import { Grid, Column, Row, Text, Icon, ProgressBar, Dialog, Box } from '@umami/react-zen'; -import { useMessages, useResultQuery } from '@/components/hooks'; +import { Box, Column, Dialog, Grid, Icon, ProgressBar, Row, Text } from '@umami/react-zen'; import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { useMessages, useResultQuery } from '@/components/hooks'; import { File, User } from '@/components/icons'; -import { Lightning } from '@/components/svg'; -import { formatLongNumber } from '@/lib/format'; import { ReportEditButton } from '@/components/input/ReportEditButton'; import { ChangeLabel } from '@/components/metrics/ChangeLabel'; +import { Lightning } from '@/components/svg'; +import { formatLongNumber } from '@/lib/format'; import { FunnelEditForm } from './FunnelEditForm'; type FunnelResult = { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx index 7e776737..29b54803 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelAddButton.tsx @@ -1,7 +1,7 @@ -import { Button, DialogTrigger, Dialog, Icon, Text, Modal } from '@umami/react-zen'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; -import { FunnelEditForm } from './FunnelEditForm'; import { Plus } from '@/components/icons'; +import { FunnelEditForm } from './FunnelEditForm'; export function FunnelAddButton({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx index 13712f2a..5d950ea6 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelEditForm.tsx @@ -1,20 +1,20 @@ import { + Button, + Column, Form, + FormButtons, FormField, FormFieldArray, - TextField, - Grid, - FormButtons, FormSubmitButton, - Button, - Text, + Grid, Icon, - Row, Loading, - Column, + Row, + Text, + TextField, } from '@umami/react-zen'; import { useMessages, useReportQuery, useUpdateQuery } from '@/components/hooks'; -import { X, Plus } from '@/components/icons'; +import { Plus, X } from '@/components/icons'; import { ActionSelect } from '@/components/input/ActionSelect'; import { LookupField } from '@/components/input/LookupField'; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx index c155662f..57bce52f 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/FunnelsPage.tsx @@ -1,12 +1,12 @@ 'use client'; -import { Grid, Column } from '@umami/react-zen'; -import { SectionHeader } from '@/components/common/SectionHeader'; -import { Funnel } from './Funnel'; -import { FunnelAddButton } from './FunnelAddButton'; +import { Column, Grid } from '@umami/react-zen'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; -import { useDateRange, useReportsQuery } from '@/components/hooks'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { Panel } from '@/components/common/Panel'; +import { SectionHeader } from '@/components/common/SectionHeader'; +import { useDateRange, useReportsQuery } from '@/components/hooks'; +import { Funnel } from './Funnel'; +import { FunnelAddButton } from './FunnelAddButton'; export function FunnelsPage({ websiteId }: { websiteId: string }) { const { data, isLoading, error } = useReportsQuery({ websiteId, type: 'funnel' }); @@ -23,7 +23,7 @@ export function FunnelsPage({ websiteId }: { websiteId: string }) { {data && ( - {data['data']?.map((report: any) => ( + {data.data?.map((report: any) => ( diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/page.tsx index 0209b806..2fdcf3b7 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/page.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { FunnelsPage } from './FunnelsPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx index dead3cab..b6c4a11d 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx @@ -1,9 +1,9 @@ -import { Grid, Row, Column, Text, Icon, ProgressBar, Dialog } from '@umami/react-zen'; -import { ReportEditButton } from '@/components/input/ReportEditButton'; +import { Column, Dialog, Grid, Icon, ProgressBar, Row, Text } from '@umami/react-zen'; +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useMessages, useResultQuery } from '@/components/hooks'; import { File, User } from '@/components/icons'; +import { ReportEditButton } from '@/components/input/ReportEditButton'; import { Lightning } from '@/components/svg'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; import { formatLongNumber } from '@/lib/format'; import { GoalEditForm } from './GoalEditForm'; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx index c75d72b0..c85b79c5 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalAddButton.tsx @@ -1,7 +1,7 @@ -import { Button, DialogTrigger, Dialog, Icon, Text, Modal } from '@umami/react-zen'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; -import { GoalEditForm } from './GoalEditForm'; import { Plus } from '@/components/icons'; +import { GoalEditForm } from './GoalEditForm'; export function GoalAddButton({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx index 394cdec9..7f68047c 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalEditForm.tsx @@ -1,18 +1,18 @@ import { - Form, - FormField, - TextField, - Grid, - FormButtons, - FormSubmitButton, Button, - Loading, Column, + Form, + FormButtons, + FormField, + FormSubmitButton, + Grid, Label, + Loading, + TextField, } from '@umami/react-zen'; import { useMessages, useReportQuery, useUpdateQuery } from '@/components/hooks'; -import { LookupField } from '@/components/input/LookupField'; import { ActionSelect } from '@/components/input/ActionSelect'; +import { LookupField } from '@/components/input/LookupField'; export function GoalEditForm({ id, diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx index 29961110..ff7b49fb 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/GoalsPage.tsx @@ -1,12 +1,12 @@ 'use client'; -import { Grid, Column } from '@umami/react-zen'; -import { SectionHeader } from '@/components/common/SectionHeader'; -import { Goal } from './Goal'; -import { GoalAddButton } from './GoalAddButton'; +import { Column, Grid } from '@umami/react-zen'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; -import { useDateRange, useReportsQuery } from '@/components/hooks'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { Panel } from '@/components/common/Panel'; +import { SectionHeader } from '@/components/common/SectionHeader'; +import { useDateRange, useReportsQuery } from '@/components/hooks'; +import { Goal } from './Goal'; +import { GoalAddButton } from './GoalAddButton'; export function GoalsPage({ websiteId }: { websiteId: string }) { const { data, isLoading, error } = useReportsQuery({ websiteId, type: 'goal' }); @@ -23,7 +23,7 @@ export function GoalsPage({ websiteId }: { websiteId: string }) { {data && ( - {data['data'].map((report: any) => ( + {data.data.map((report: any) => ( diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/page.tsx index e59b2c7c..b1ab691a 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/page.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { GoalsPage } from './GoalsPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx index d897a76a..3327a425 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/Journey.tsx @@ -1,13 +1,13 @@ -import { useMemo, useState } from 'react'; -import { TooltipTrigger, Tooltip, Focusable, Icon, Text, Row, Column } from '@umami/react-zen'; -import { firstBy } from 'thenby'; +import { Column, Focusable, Icon, Row, Text, Tooltip, TooltipTrigger } from '@umami/react-zen'; import classNames from 'classnames'; +import { useMemo, useState } from 'react'; +import { firstBy } from 'thenby'; +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useEscapeKey, useMessages, useResultQuery } from '@/components/hooks'; import { File } from '@/components/icons'; import { Lightning } from '@/components/svg'; import { objectToArray } from '@/lib/data'; import { formatLongNumber } from '@/lib/format'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; import styles from './Journey.module.css'; const NODE_HEIGHT = 60; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx index 26927962..14b8341d 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/JourneysPage.tsx @@ -1,10 +1,10 @@ 'use client'; +import { Column, Grid, ListItem, SearchField, Select } from '@umami/react-zen'; import { useState } from 'react'; -import { ListItem, Select, Column, Grid, SearchField } from '@umami/react-zen'; -import { useDateRange, useMessages } from '@/components/hooks'; -import { Panel } from '@/components/common/Panel'; -import { Journey } from './Journey'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; +import { Panel } from '@/components/common/Panel'; +import { useDateRange, useMessages } from '@/components/hooks'; +import { Journey } from './Journey'; const JOURNEY_STEPS = [2, 3, 4, 5, 6, 7]; const DEFAULT_STEP = 3; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/journeys/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/journeys/page.tsx index c055dacd..f6062a61 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/journeys/page.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/journeys/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { JourneysPage } from './JourneysPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/retention/Retention.tsx b/src/app/(main)/websites/[websiteId]/(reports)/retention/Retention.tsx index a8cff457..fdd8a146 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/retention/Retention.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/retention/Retention.tsx @@ -1,11 +1,11 @@ -import { ReactNode } from 'react'; -import { Grid, Row, Column, Text, Icon } from '@umami/react-zen'; +import { Column, Grid, Icon, Row, Text } from '@umami/react-zen'; +import type { ReactNode } from 'react'; +import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { Panel } from '@/components/common/Panel'; +import { useLocale, useMessages, useResultQuery } from '@/components/hooks'; import { Users } from '@/components/icons'; -import { useMessages, useLocale, useResultQuery } from '@/components/hooks'; import { formatDate } from '@/lib/date'; import { formatLongNumber } from '@/lib/format'; -import { Panel } from '@/components/common/Panel'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; const DAYS = [1, 2, 3, 4, 5, 6, 7, 14, 21, 28]; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/retention/RetentionPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/retention/RetentionPage.tsx index 348cfb33..0ec6e95e 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/retention/RetentionPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/retention/RetentionPage.tsx @@ -1,9 +1,9 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { Retention } from './Retention'; +import { endOfMonth, startOfMonth } from 'date-fns'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { useDateRange } from '@/components/hooks'; -import { endOfMonth, startOfMonth } from 'date-fns'; +import { Retention } from './Retention'; export function RetentionPage({ websiteId }: { websiteId: string }) { const { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/retention/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/retention/page.tsx index 41713860..2fbbc0ac 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/retention/page.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/retention/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { RetentionPage } from './RetentionPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx index a5d3b101..0e782a16 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx @@ -1,3 +1,7 @@ +import { Column, Grid, Row, Text } from '@umami/react-zen'; +import classNames from 'classnames'; +import { colord } from 'colord'; +import { useCallback, useMemo, useState } from 'react'; import { BarChart } from '@/components/charts/BarChart'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { Panel } from '@/components/common/Panel'; @@ -11,10 +15,6 @@ import { renderDateLabels } from '@/lib/charts'; import { CHART_COLORS } from '@/lib/constants'; import { generateTimeSeries } from '@/lib/date'; import { formatLongCurrency, formatLongNumber } from '@/lib/format'; -import { Column, Grid, Row, Text } from '@umami/react-zen'; -import classNames from 'classnames'; -import { colord } from 'colord'; -import { useCallback, useMemo, useState } from 'react'; export interface RevenueProps { websiteId: string; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx index ed512062..3e429c18 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenuePage.tsx @@ -1,8 +1,8 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { Revenue } from './Revenue'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { useDateRange } from '@/components/hooks'; +import { Revenue } from './Revenue'; export function RevenuePage({ websiteId }: { websiteId: string }) { const { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/revenue/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/revenue/page.tsx index 4bc56331..fba10f15 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/revenue/page.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/revenue/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { RevenuePage } from './RevenuePage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx index 2bf88754..1399174a 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTM.tsx @@ -1,10 +1,10 @@ +import { Column, Grid, Heading, Text } from '@umami/react-zen'; import { PieChart } from '@/components/charts/PieChart'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { Panel } from '@/components/common/Panel'; import { useMessages, useResultQuery } from '@/components/hooks'; import { ListTable } from '@/components/metrics/ListTable'; import { CHART_COLORS, UTM_PARAMS } from '@/lib/constants'; -import { Column, Grid, Heading, Text } from '@umami/react-zen'; export interface UTMProps { websiteId: string; diff --git a/src/app/(main)/websites/[websiteId]/(reports)/utm/UTMPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTMPage.tsx index 30b9bff2..0d2a7329 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/utm/UTMPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/utm/UTMPage.tsx @@ -1,8 +1,8 @@ 'use client'; import { Column } from '@umami/react-zen'; +import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { useDateRange } from '@/components/hooks'; import { UTM } from './UTM'; -import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; export function UTMPage({ websiteId }: { websiteId: string }) { const { diff --git a/src/app/(main)/websites/[websiteId]/(reports)/utm/page.tsx b/src/app/(main)/websites/[websiteId]/(reports)/utm/page.tsx index d51592cc..8b8fd6af 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/utm/page.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/utm/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { UTMPage } from './UTMPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx b/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx index cd623929..36638121 100644 --- a/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx +++ b/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx @@ -1,6 +1,6 @@ import { Dialog, Modal } from '@umami/react-zen'; import { WebsiteExpandedView } from '@/app/(main)/websites/[websiteId]/WebsiteExpandedView'; -import { useNavigation, useMobile } from '@/components/hooks'; +import { useMobile, useNavigation } from '@/components/hooks'; export function ExpandedViewModal({ websiteId, diff --git a/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx b/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx index b949e60f..b2ea2a83 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx @@ -1,8 +1,8 @@ +import { useMemo } from 'react'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useDateRange, useTimezone } from '@/components/hooks'; import { useWebsitePageviewsQuery } from '@/components/hooks/queries/useWebsitePageviewsQuery'; import { PageviewsChart } from '@/components/metrics/PageviewsChart'; -import { useMemo } from 'react'; export function WebsiteChart({ websiteId, @@ -28,7 +28,7 @@ export function WebsiteChart({ }; if (compare) { - result['compare'] = { + result.compare = { pageviews: result.pageviews.map(({ x }, i) => ({ x, y: compare.pageviews[i]?.y, diff --git a/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx b/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx index 9757a974..6223dbc0 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx @@ -1,9 +1,9 @@ -import { Column, Row, Grid } from '@umami/react-zen'; -import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton'; -import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter'; +import { Column, Grid, Row } from '@umami/react-zen'; +import { ExportButton } from '@/components/input/ExportButton'; import { FilterBar } from '@/components/input/FilterBar'; import { MonthFilter } from '@/components/input/MonthFilter'; -import { ExportButton } from '@/components/input/ExportButton'; +import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter'; +import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton'; export function WebsiteControls({ websiteId, diff --git a/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx b/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx index 63e8f413..29c3954f 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteExpandedMenu.tsx @@ -1,24 +1,24 @@ -import { useMessages, useNavigation } from '@/components/hooks'; import { SideMenu } from '@/components/common/SideMenu'; +import { useMessages, useNavigation } from '@/components/hooks'; import { - LogOut, - LogIn, - Search, - Type, - SquareSlash, - Share2, - Megaphone, + AppWindow, + Cpu, Earth, Globe, Landmark, - MapPin, - AppWindow, - Laptop, Languages, + Laptop, + LogIn, + LogOut, + MapPin, + Megaphone, Monitor, - Cpu, Network, + Search, + Share2, + SquareSlash, Tag, + Type, } from '@/components/icons'; import { Lightning } from '@/components/svg'; diff --git a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx index 448027b6..2c670df1 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx @@ -1,8 +1,8 @@ -import { Grid, Column, Row } from '@umami/react-zen'; -import { useMessages, useNavigation } from '@/components/hooks'; -import { MetricsExpandedTable } from '@/components/metrics/MetricsExpandedTable'; +import { Column, Grid, Row } from '@umami/react-zen'; import { WebsiteExpandedMenu } from '@/app/(main)/websites/[websiteId]/WebsiteExpandedMenu'; +import { useMessages, useNavigation } from '@/components/hooks'; import { MobileMenuButton } from '@/components/input/MobileMenuButton'; +import { MetricsExpandedTable } from '@/components/metrics/MetricsExpandedTable'; export function WebsiteExpandedView({ websiteId, diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index 73eb96b2..7db22912 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -1,12 +1,12 @@ -import { Icon, Text, Row } from '@umami/react-zen'; -import { PageHeader } from '@/components/common/PageHeader'; -import { Share, Edit } from '@/components/icons'; -import { Favicon } from '@/components/common/Favicon'; -import { ActiveUsers } from '@/components/metrics/ActiveUsers'; +import { Icon, Row, Text } from '@umami/react-zen'; import { WebsiteShareForm } from '@/app/(main)/websites/[websiteId]/settings/WebsiteShareForm'; -import { useMessages, useNavigation, useWebsite } from '@/components/hooks'; +import { Favicon } from '@/components/common/Favicon'; import { LinkButton } from '@/components/common/LinkButton'; +import { PageHeader } from '@/components/common/PageHeader'; +import { useMessages, useNavigation, useWebsite } from '@/components/hooks'; +import { Edit, Share } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import { ActiveUsers } from '@/components/metrics/ActiveUsers'; export function WebsiteHeader({ showActions }: { showActions?: boolean }) { const website = useWebsite(); diff --git a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx index c92bbd9c..7260a7ea 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx @@ -1,6 +1,6 @@ 'use client'; -import { ReactNode } from 'react'; import { Column, Grid } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; import { PageBody } from '@/components/common/PageBody'; import { WebsiteHeader } from './WebsiteHeader'; diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx index 03c72008..30189534 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteMenu.tsx @@ -9,8 +9,8 @@ import { Text, } from '@umami/react-zen'; import { Fragment } from 'react'; -import { More, Share, Edit } from '@/components/icons'; import { useMessages, useNavigation } from '@/components/hooks'; +import { Edit, More, Share } from '@/components/icons'; export function WebsiteMenu({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx index 7522c8ec..6c91ba6d 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx @@ -1,9 +1,9 @@ +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useDateRange, useMessages } from '@/components/hooks'; +import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery'; import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; -import { formatShortTime, formatLongNumber } from '@/lib/format'; -import { useWebsiteStatsQuery } from '@/components/hooks/queries/useWebsiteStatsQuery'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { formatLongNumber, formatShortTime } from '@/lib/format'; export function WebsiteMetricsBar({ websiteId, @@ -45,7 +45,7 @@ export function WebsiteMetricsBar({ change: (Math.min(visits, bounces) / visits) * 100 - (Math.min(comparison.visits, comparison.bounces) / comparison.visits) * 100, - formatValue: n => Math.round(+n) + '%', + formatValue: n => `${Math.round(+n)}%`, reverseColors: true, }, { diff --git a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx index 0fb6d565..ad05b706 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx @@ -1,18 +1,18 @@ -import { Text, Column } from '@umami/react-zen'; +import { Column, Text } from '@umami/react-zen'; +import { SideMenu } from '@/components/common/SideMenu'; +import { useMessages, useNavigation } from '@/components/hooks'; import { - Eye, - User, + AlignEndHorizontal, + ChartPie, Clock, + Eye, Sheet, Tag, - ChartPie, + User, UserPlus, - AlignEndHorizontal, } from '@/components/icons'; -import { Lightning, Path, Money, Target, Funnel, Magnet, Network } from '@/components/svg'; -import { useMessages, useNavigation } from '@/components/hooks'; -import { SideMenu } from '@/components/common/SideMenu'; import { WebsiteSelect } from '@/components/input/WebsiteSelect'; +import { Funnel, Lightning, Magnet, Money, Network, Path, Target } from '@/components/svg'; export function WebsiteNav({ websiteId, diff --git a/src/app/(main)/websites/[websiteId]/WebsitePage.tsx b/src/app/(main)/websites/[websiteId]/WebsitePage.tsx index bf8afe98..f587e112 100644 --- a/src/app/(main)/websites/[websiteId]/WebsitePage.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsitePage.tsx @@ -1,11 +1,11 @@ 'use client'; import { Column } from '@umami/react-zen'; +import { ExpandedViewModal } from '@/app/(main)/websites/[websiteId]/ExpandedViewModal'; import { Panel } from '@/components/common/Panel'; import { WebsiteChart } from './WebsiteChart'; +import { WebsiteControls } from './WebsiteControls'; import { WebsiteMetricsBar } from './WebsiteMetricsBar'; import { WebsitePanels } from './WebsitePanels'; -import { WebsiteControls } from './WebsiteControls'; -import { ExpandedViewModal } from '@/app/(main)/websites/[websiteId]/ExpandedViewModal'; export function WebsitePage({ websiteId }: { websiteId: string }) { return ( diff --git a/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx b/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx index db52573d..a91d562e 100644 --- a/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsitePanels.tsx @@ -1,3 +1,4 @@ +import { Grid, Heading, Row, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; import { GridRow } from '@/components/common/GridRow'; import { Panel } from '@/components/common/Panel'; import { useMessages, useNavigation } from '@/components/hooks'; @@ -5,7 +6,6 @@ import { EventsChart } from '@/components/metrics/EventsChart'; import { MetricsTable } from '@/components/metrics/MetricsTable'; import { WeeklyTraffic } from '@/components/metrics/WeeklyTraffic'; import { WorldMap } from '@/components/metrics/WorldMap'; -import { Grid, Heading, Row, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; export function WebsitePanels({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx b/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx index 04db76f1..ac978a23 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteTabs.tsx @@ -1,6 +1,6 @@ -import { Tabs, TabList, Tab, Icon, Text, Row } from '@umami/react-zen'; +import { Icon, Row, Tab, TabList, Tabs, Text } from '@umami/react-zen'; import { useMessages, useNavigation, useWebsite } from '@/components/hooks'; -import { Clock, Eye, User, ChartPie } from '@/components/icons'; +import { ChartPie, Clock, Eye, User } from '@/components/icons'; import { Lightning } from '@/components/svg'; export function WebsiteTabs() { diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx index 7571bf62..94d62ff2 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton.tsx @@ -1,8 +1,8 @@ -import { Trash } from '@/components/icons'; -import { messages } from '@/components/messages'; -import { useDeleteQuery, useMessages } from '@/components/hooks'; import { ConfirmationForm } from '@/components/common/ConfirmationForm'; +import { useDeleteQuery, useMessages } from '@/components/hooks'; +import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import { messages } from '@/components/messages'; export function CohortDeleteButton({ cohortId, diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx index aea02209..07990712 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditButton.tsx @@ -1,8 +1,8 @@ -import { Edit } from '@/components/icons'; import { CohortEditForm } from '@/app/(main)/websites/[websiteId]/cohorts/CohortEditForm'; import { useMessages } from '@/components/hooks'; -import { Filter } from '@/lib/types'; +import { Edit } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import type { Filter } from '@/lib/types'; export function CohortEditButton({ cohortId, diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortEditForm.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditForm.tsx index 2c1ed103..c7550352 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortEditForm.tsx @@ -1,20 +1,20 @@ import { Button, + Column, Form, FormButtons, FormField, FormSubmitButton, - TextField, + Grid, Label, Loading, - Column, - Grid, + TextField, } from '@umami/react-zen'; import { useMessages, useUpdateQuery, useWebsiteCohortQuery } from '@/components/hooks'; +import { ActionSelect } from '@/components/input/ActionSelect'; import { DateFilter } from '@/components/input/DateFilter'; import { FieldFilters } from '@/components/input/FieldFilters'; import { LookupField } from '@/components/input/LookupField'; -import { ActionSelect } from '@/components/input/ActionSelect'; export function CohortEditForm({ cohortId, diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortsDataTable.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortsDataTable.tsx index 5944d415..6734384e 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortsDataTable.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortsDataTable.tsx @@ -1,7 +1,7 @@ -import { CohortAddButton } from './CohortAddButton'; -import { useWebsiteCohortsQuery } from '@/components/hooks'; -import { CohortsTable } from './CohortsTable'; import { DataGrid } from '@/components/common/DataGrid'; +import { useWebsiteCohortsQuery } from '@/components/hooks'; +import { CohortAddButton } from './CohortAddButton'; +import { CohortsTable } from './CohortsTable'; export function CohortsDataTable({ websiteId }: { websiteId?: string }) { const query = useWebsiteCohortsQuery(websiteId, { type: 'cohort' }); diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortsPage.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortsPage.tsx index 211e2526..14f366e5 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortsPage.tsx @@ -1,8 +1,8 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { CohortsDataTable } from './CohortsDataTable'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { Panel } from '@/components/common/Panel'; +import { CohortsDataTable } from './CohortsDataTable'; export function CohortsPage({ websiteId }) { return ( diff --git a/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx b/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx index f9a41255..5c7ac03f 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/CohortsTable.tsx @@ -1,10 +1,10 @@ -import { DataTable, DataColumn, Row, DataTableProps } from '@umami/react-zen'; -import { useMessages, useNavigation } from '@/components/hooks'; -import { DateDistance } from '@/components/common/DateDistance'; -import { filtersObjectToArray } from '@/lib/params'; -import { CohortEditButton } from '@/app/(main)/websites/[websiteId]/cohorts/CohortEditButton'; -import { CohortDeleteButton } from '@/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton'; +import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen'; import Link from 'next/link'; +import { CohortDeleteButton } from '@/app/(main)/websites/[websiteId]/cohorts/CohortDeleteButton'; +import { CohortEditButton } from '@/app/(main)/websites/[websiteId]/cohorts/CohortEditButton'; +import { DateDistance } from '@/components/common/DateDistance'; +import { useMessages, useNavigation } from '@/components/hooks'; +import { filtersObjectToArray } from '@/lib/params'; export function CohortsTable(props: DataTableProps) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/cohorts/page.tsx b/src/app/(main)/websites/[websiteId]/cohorts/page.tsx index a9519c2c..9946f602 100644 --- a/src/app/(main)/websites/[websiteId]/cohorts/page.tsx +++ b/src/app/(main)/websites/[websiteId]/cohorts/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { CohortsPage } from './CohortsPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/compare/ComparePage.tsx b/src/app/(main)/websites/[websiteId]/compare/ComparePage.tsx index 4c5b7b93..bca8d244 100644 --- a/src/app/(main)/websites/[websiteId]/compare/ComparePage.tsx +++ b/src/app/(main)/websites/[websiteId]/compare/ComparePage.tsx @@ -1,10 +1,10 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { CompareTables } from './CompareTables'; +import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { WebsiteMetricsBar } from '@/app/(main)/websites/[websiteId]/WebsiteMetricsBar'; import { Panel } from '@/components/common/Panel'; -import { WebsiteChart } from '@/app/(main)/websites/[websiteId]/WebsiteChart'; +import { CompareTables } from './CompareTables'; export function ComparePage({ websiteId }: { websiteId: string }) { return ( diff --git a/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx b/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx index 2c67b76a..13c05160 100644 --- a/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx +++ b/src/app/(main)/websites/[websiteId]/compare/CompareTables.tsx @@ -1,11 +1,11 @@ +import { Column, Grid, Heading, ListItem, Row, Select } from '@umami/react-zen'; +import { useState } from 'react'; import { DateDisplay } from '@/components/common/DateDisplay'; import { Panel } from '@/components/common/Panel'; import { useDateRange, useMessages, useNavigation } from '@/components/hooks'; import { ChangeLabel } from '@/components/metrics/ChangeLabel'; import { MetricsTable } from '@/components/metrics/MetricsTable'; import { formatNumber } from '@/lib/format'; -import { Column, Grid, Heading, ListItem, Row, Select } from '@umami/react-zen'; -import { useState } from 'react'; export function CompareTables({ websiteId }: { websiteId: string }) { const [data, setData] = useState([]); @@ -106,7 +106,7 @@ export function CompareTables({ websiteId }: { websiteId: string }) { const change = Math.abs(((count - prev) / prev) * 100); return ( - !isNaN(change) && ( + !Number.isNaN(change) && ( {formatNumber(change)}% diff --git a/src/app/(main)/websites/[websiteId]/compare/page.tsx b/src/app/(main)/websites/[websiteId]/compare/page.tsx index 2b2cf5b1..1b2899b2 100644 --- a/src/app/(main)/websites/[websiteId]/compare/page.tsx +++ b/src/app/(main)/websites/[websiteId]/compare/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { ComparePage } from './ComparePage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/events/EventProperties.tsx b/src/app/(main)/websites/[websiteId]/events/EventProperties.tsx index 41a8cfc2..c3b1325d 100644 --- a/src/app/(main)/websites/[websiteId]/events/EventProperties.tsx +++ b/src/app/(main)/websites/[websiteId]/events/EventProperties.tsx @@ -1,14 +1,14 @@ +import { Column, Grid, ListItem, Select } from '@umami/react-zen'; import { useMemo, useState } from 'react'; -import { Select, ListItem, Grid, Column } from '@umami/react-zen'; +import { PieChart } from '@/components/charts/PieChart'; +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useEventDataPropertiesQuery, useEventDataValuesQuery, useMessages, } from '@/components/hooks'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; -import { PieChart } from '@/components/charts/PieChart'; -import { CHART_COLORS } from '@/lib/constants'; import { ListTable } from '@/components/metrics/ListTable'; +import { CHART_COLORS } from '@/lib/constants'; export function EventProperties({ websiteId }: { websiteId: string }) { const [propertyName, setPropertyName] = useState(''); diff --git a/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx b/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx index 805f1252..f686b3fd 100644 --- a/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx +++ b/src/app/(main)/websites/[websiteId]/events/EventsDataTable.tsx @@ -1,9 +1,8 @@ -import { useState } from 'react'; -import { useMessages, useWebsiteEventsQuery } from '@/components/hooks'; -import { EventsTable } from './EventsTable'; +import { type ReactNode, useState } from 'react'; import { DataGrid } from '@/components/common/DataGrid'; -import { ReactNode } from 'react'; +import { useMessages, useWebsiteEventsQuery } from '@/components/hooks'; import { FilterButtons } from '@/components/input/FilterButtons'; +import { EventsTable } from './EventsTable'; export function EventsDataTable({ websiteId, diff --git a/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx index 2712c985..a7ed399c 100644 --- a/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx +++ b/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx @@ -1,9 +1,9 @@ +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useMessages } from '@/components/hooks'; import { useWebsiteSessionStatsQuery } from '@/components/hooks/queries/useWebsiteSessionStatsQuery'; import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; import { formatLongNumber } from '@/lib/format'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; export function EventsMetricsBar({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx b/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx index 780891b5..55ec0403 100644 --- a/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx @@ -1,15 +1,15 @@ 'use client'; -import { TabList, Tab, Tabs, TabPanel, Column } from '@umami/react-zen'; -import { MetricsTable } from '@/components/metrics/MetricsTable'; -import { useState, Key } from 'react'; -import { EventsDataTable } from './EventsDataTable'; -import { Panel } from '@/components/common/Panel'; -import { EventsChart } from '@/components/metrics/EventsChart'; -import { useMessages } from '@/components/hooks'; -import { EventProperties } from './EventProperties'; -import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; -import { getItem, setItem } from '@/lib/storage'; +import { Column, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; +import { type Key, useState } from 'react'; import { SessionModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionModal'; +import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; +import { Panel } from '@/components/common/Panel'; +import { useMessages } from '@/components/hooks'; +import { EventsChart } from '@/components/metrics/EventsChart'; +import { MetricsTable } from '@/components/metrics/MetricsTable'; +import { getItem, setItem } from '@/lib/storage'; +import { EventProperties } from './EventProperties'; +import { EventsDataTable } from './EventsDataTable'; const KEY_NAME = 'umami.events.tab'; diff --git a/src/app/(main)/websites/[websiteId]/events/EventsTable.tsx b/src/app/(main)/websites/[websiteId]/events/EventsTable.tsx index ea0edde1..7fb2eb41 100644 --- a/src/app/(main)/websites/[websiteId]/events/EventsTable.tsx +++ b/src/app/(main)/websites/[websiteId]/events/EventsTable.tsx @@ -1,24 +1,24 @@ import { - DataTable, - DataColumn, - Row, - Text, - DataTableProps, - IconLabel, Button, + DataColumn, + DataTable, + type DataTableProps, Dialog, DialogTrigger, Icon, + IconLabel, Popover, + Row, + Text, } from '@umami/react-zen'; -import { useFormat, useMessages, useNavigation } from '@/components/hooks'; -import { Avatar } from '@/components/common/Avatar'; import Link from 'next/link'; -import { Eye, FileText } from '@/components/icons'; -import { Lightning } from '@/components/svg'; +import { Avatar } from '@/components/common/Avatar'; import { DateDistance } from '@/components/common/DateDistance'; import { TypeIcon } from '@/components/common/TypeIcon'; +import { useFormat, useMessages, useNavigation } from '@/components/hooks'; +import { Eye, FileText } from '@/components/icons'; import { EventData } from '@/components/metrics/EventData'; +import { Lightning } from '@/components/svg'; export function EventsTable(props: DataTableProps) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/events/page.tsx b/src/app/(main)/websites/[websiteId]/events/page.tsx index d68d727d..d77ba3bd 100644 --- a/src/app/(main)/websites/[websiteId]/events/page.tsx +++ b/src/app/(main)/websites/[websiteId]/events/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { EventsPage } from './EventsPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/layout.tsx b/src/app/(main)/websites/[websiteId]/layout.tsx index 8a3ab2a4..67595e9d 100644 --- a/src/app/(main)/websites/[websiteId]/layout.tsx +++ b/src/app/(main)/websites/[websiteId]/layout.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { WebsiteLayout } from '@/app/(main)/websites/[websiteId]/WebsiteLayout'; export default async function ({ diff --git a/src/app/(main)/websites/[websiteId]/page.tsx b/src/app/(main)/websites/[websiteId]/page.tsx index 9755e6d0..d4889c5d 100644 --- a/src/app/(main)/websites/[websiteId]/page.tsx +++ b/src/app/(main)/websites/[websiteId]/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { WebsitePage } from './WebsitePage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { const { websiteId } = await params; diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx index c4ee9c02..6e2495b5 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx @@ -1,8 +1,8 @@ -import { useCallback } from 'react'; import { IconLabel } from '@umami/react-zen'; -import { ListTable } from '@/components/metrics/ListTable'; -import { useLocale, useCountryNames, useMessages } from '@/components/hooks'; +import { useCallback } from 'react'; import { TypeIcon } from '@/components/common/TypeIcon'; +import { useCountryNames, useLocale, useMessages } from '@/components/hooks'; +import { ListTable } from '@/components/metrics/ListTable'; export function RealtimeCountries({ data }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.tsx index cdd67e7a..2b9d881e 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeHeader.tsx @@ -1,5 +1,5 @@ -import { MetricCard } from '@/components/metrics/MetricCard'; import { useMessages } from '@/components/hooks'; +import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; export function RealtimeHeader({ data }: { data: any }) { diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx index 3dec340f..10763618 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx @@ -1,10 +1,11 @@ +import { Column, Heading, IconLabel, Row, SearchField, Text } from '@umami/react-zen'; +import Link from 'next/link'; import { useMemo, useState } from 'react'; import { FixedSizeList } from 'react-window'; -import { SearchField, Text, Column, Row, IconLabel, Heading } from '@umami/react-zen'; -import Link from 'next/link'; +import { SessionModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionModal'; import { useFormat } from '@/components//hooks/useFormat'; +import { Avatar } from '@/components/common/Avatar'; import { Empty } from '@/components/common/Empty'; -import { FilterButtons } from '@/components/input/FilterButtons'; import { useCountryNames, useLocale, @@ -15,10 +16,9 @@ import { useWebsite, } from '@/components/hooks'; import { Eye, User } from '@/components/icons'; +import { FilterButtons } from '@/components/input/FilterButtons'; import { Lightning } from '@/components/svg'; import { BROWSERS, OS_NAMES } from '@/lib/constants'; -import { SessionModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionModal'; -import { Avatar } from '@/components/common/Avatar'; const TYPE_ALL = 'all'; const TYPE_PAGEVIEW = 'pageview'; diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimePage.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimePage.tsx index 0f9fa358..6220c695 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimePage.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimePage.tsx @@ -1,18 +1,18 @@ 'use client'; -import { firstBy } from 'thenby'; import { Grid } from '@umami/react-zen'; +import { firstBy } from 'thenby'; import { GridRow } from '@/components/common/GridRow'; import { PageBody } from '@/components/common/PageBody'; import { Panel } from '@/components/common/Panel'; +import { useMobile, useRealtimeQuery } from '@/components/hooks'; import { RealtimeChart } from '@/components/metrics/RealtimeChart'; import { WorldMap } from '@/components/metrics/WorldMap'; -import { useMobile, useRealtimeQuery } from '@/components/hooks'; -import { RealtimeLog } from './RealtimeLog'; +import { percentFilter } from '@/lib/filters'; +import { RealtimeCountries } from './RealtimeCountries'; import { RealtimeHeader } from './RealtimeHeader'; +import { RealtimeLog } from './RealtimeLog'; import { RealtimePaths } from './RealtimePaths'; import { RealtimeReferrers } from './RealtimeReferrers'; -import { RealtimeCountries } from './RealtimeCountries'; -import { percentFilter } from '@/lib/filters'; export function RealtimePage({ websiteId }: { websiteId: string }) { const { data, isLoading, error } = useRealtimeQuery(websiteId); diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimePaths.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimePaths.tsx index 91c6b4d8..1f90ad83 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimePaths.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimePaths.tsx @@ -1,7 +1,7 @@ import thenby from 'thenby'; -import { percentFilter } from '@/lib/filters'; -import { ListTable } from '@/components/metrics/ListTable'; import { useMessages, useWebsite } from '@/components/hooks'; +import { ListTable } from '@/components/metrics/ListTable'; +import { percentFilter } from '@/lib/filters'; export function RealtimePaths({ data }: { data: any }) { const website = useWebsite(); diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeReferrers.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeReferrers.tsx index 85326cd0..9fd4477b 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeReferrers.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeReferrers.tsx @@ -1,7 +1,7 @@ import thenby from 'thenby'; -import { percentFilter } from '@/lib/filters'; -import { ListTable } from '@/components/metrics/ListTable'; import { useMessages, useWebsite } from '@/components/hooks'; +import { ListTable } from '@/components/metrics/ListTable'; +import { percentFilter } from '@/lib/filters'; export function RealtimeReferrers({ data }: { data: any }) { const website = useWebsite(); diff --git a/src/app/(main)/websites/[websiteId]/realtime/page.tsx b/src/app/(main)/websites/[websiteId]/realtime/page.tsx index c1bdd4c5..1552196c 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/page.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { RealtimePage } from './RealtimePage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { const { websiteId } = await params; diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentAddButton.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentAddButton.tsx index 052d3185..7b70fee6 100644 --- a/src/app/(main)/websites/[websiteId]/segments/SegmentAddButton.tsx +++ b/src/app/(main)/websites/[websiteId]/segments/SegmentAddButton.tsx @@ -1,7 +1,7 @@ import { useMessages } from '@/components/hooks'; import { Plus } from '@/components/icons'; -import { SegmentEditForm } from './SegmentEditForm'; import { DialogButton } from '@/components/input/DialogButton'; +import { SegmentEditForm } from './SegmentEditForm'; export function SegmentAddButton({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton.tsx index 35ef83bb..bb52a220 100644 --- a/src/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton.tsx +++ b/src/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton.tsx @@ -1,8 +1,8 @@ -import { Trash } from '@/components/icons'; import { ConfirmationForm } from '@/components/common/ConfirmationForm'; -import { messages } from '@/components/messages'; import { useDeleteQuery, useMessages } from '@/components/hooks'; +import { Trash } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import { messages } from '@/components/messages'; export function SegmentDeleteButton({ segmentId, diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentEditButton.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentEditButton.tsx index 6d422c95..5c56cf1e 100644 --- a/src/app/(main)/websites/[websiteId]/segments/SegmentEditButton.tsx +++ b/src/app/(main)/websites/[websiteId]/segments/SegmentEditButton.tsx @@ -1,8 +1,8 @@ -import { Edit } from '@/components/icons'; import { useMessages } from '@/components/hooks'; -import { SegmentEditForm } from './SegmentEditForm'; -import { Filter } from '@/lib/types'; +import { Edit } from '@/components/icons'; import { DialogButton } from '@/components/input/DialogButton'; +import type { Filter } from '@/lib/types'; +import { SegmentEditForm } from './SegmentEditForm'; export function SegmentEditButton({ segmentId, diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentEditForm.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentEditForm.tsx index 26b97352..c3529d97 100644 --- a/src/app/(main)/websites/[websiteId]/segments/SegmentEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/segments/SegmentEditForm.tsx @@ -4,12 +4,12 @@ import { FormButtons, FormField, FormSubmitButton, - TextField, - Loading, Label, + Loading, + TextField, } from '@umami/react-zen'; -import { FieldFilters } from '@/components/input/FieldFilters'; import { useMessages, useUpdateQuery, useWebsiteSegmentQuery } from '@/components/hooks'; +import { FieldFilters } from '@/components/input/FieldFilters'; import { messages } from '@/components/messages'; export function SegmentEditForm({ diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentsDataTable.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentsDataTable.tsx index d98bad02..c1ba82eb 100644 --- a/src/app/(main)/websites/[websiteId]/segments/SegmentsDataTable.tsx +++ b/src/app/(main)/websites/[websiteId]/segments/SegmentsDataTable.tsx @@ -1,7 +1,7 @@ -import { SegmentAddButton } from './SegmentAddButton'; -import { useWebsiteSegmentsQuery } from '@/components/hooks'; -import { SegmentsTable } from './SegmentsTable'; import { DataGrid } from '@/components/common/DataGrid'; +import { useWebsiteSegmentsQuery } from '@/components/hooks'; +import { SegmentAddButton } from './SegmentAddButton'; +import { SegmentsTable } from './SegmentsTable'; export function SegmentsDataTable({ websiteId }: { websiteId?: string }) { const query = useWebsiteSegmentsQuery(websiteId, { type: 'segment' }); diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentsPage.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentsPage.tsx index 9f2d8097..cbe7a1c1 100644 --- a/src/app/(main)/websites/[websiteId]/segments/SegmentsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/segments/SegmentsPage.tsx @@ -1,8 +1,8 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { SegmentsDataTable } from './SegmentsDataTable'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { Panel } from '@/components/common/Panel'; +import { SegmentsDataTable } from './SegmentsDataTable'; export function SegmentsPage({ websiteId }) { return ( diff --git a/src/app/(main)/websites/[websiteId]/segments/SegmentsTable.tsx b/src/app/(main)/websites/[websiteId]/segments/SegmentsTable.tsx index 573572aa..4dbe5114 100644 --- a/src/app/(main)/websites/[websiteId]/segments/SegmentsTable.tsx +++ b/src/app/(main)/websites/[websiteId]/segments/SegmentsTable.tsx @@ -1,9 +1,9 @@ -import { DataTable, DataColumn, Row, DataTableProps } from '@umami/react-zen'; -import { useMessages, useNavigation } from '@/components/hooks'; -import { DateDistance } from '@/components/common/DateDistance'; -import { SegmentEditButton } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditButton'; -import { SegmentDeleteButton } from '@/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton'; +import { DataColumn, DataTable, type DataTableProps, Row } from '@umami/react-zen'; import Link from 'next/link'; +import { SegmentDeleteButton } from '@/app/(main)/websites/[websiteId]/segments/SegmentDeleteButton'; +import { SegmentEditButton } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditButton'; +import { DateDistance } from '@/components/common/DateDistance'; +import { useMessages, useNavigation } from '@/components/hooks'; export function SegmentsTable(props: DataTableProps) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/segments/page.tsx b/src/app/(main)/websites/[websiteId]/segments/page.tsx index 9f406b16..0d3faacb 100644 --- a/src/app/(main)/websites/[websiteId]/segments/page.tsx +++ b/src/app/(main)/websites/[websiteId]/segments/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { SegmentsPage } from './SegmentsPage'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx index 7bcf1b76..cbb28108 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx @@ -1,21 +1,21 @@ -import { isSameDay } from 'date-fns'; import { - Icon, - StatusLight, - Column, - Row, - Heading, - Text, Button, - DialogTrigger, - Popover, + Column, Dialog, + DialogTrigger, + Heading, + Icon, + Popover, + Row, + StatusLight, + Text, } from '@umami/react-zen'; +import { isSameDay } from 'date-fns'; import { LoadingPanel } from '@/components/common/LoadingPanel'; -import { Eye, FileText } from '@/components/icons'; -import { Lightning } from '@/components/svg'; import { useMessages, useMobile, useSessionActivityQuery, useTimezone } from '@/components/hooks'; +import { Eye, FileText } from '@/components/icons'; import { EventData } from '@/components/metrics/EventData'; +import { Lightning } from '@/components/svg'; export function SessionActivity({ websiteId, diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx index 849e0b7d..7c82c17a 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx @@ -1,8 +1,8 @@ -import { Text, Column, Row, Label, Box } from '@umami/react-zen'; -import { useSessionDataQuery } from '@/components/hooks'; +import { Box, Column, Label, Row, Text } from '@umami/react-zen'; import { Empty } from '@/components/common/Empty'; -import { DATA_TYPES } from '@/lib/constants'; import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { useSessionDataQuery } from '@/components/hooks'; +import { DATA_TYPES } from '@/lib/constants'; export function SessionData({ websiteId, sessionId }: { websiteId: string; sessionId: string }) { const { data, isLoading, error } = useSessionDataQuery(websiteId, sessionId); diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx index e968daba..f15e6ee5 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx @@ -1,9 +1,9 @@ -import { ReactNode } from 'react'; -import { Icon, Grid, Column, Row, Label } from '@umami/react-zen'; -import { useFormat, useLocale, useMessages, useRegionNames } from '@/components/hooks'; -import { TypeIcon } from '@/components/common/TypeIcon'; -import { KeyRound, Calendar, MapPin, Landmark } from '@/components/icons'; +import { Column, Grid, Icon, Label, Row } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { DateDistance } from '@/components/common/DateDistance'; +import { TypeIcon } from '@/components/common/TypeIcon'; +import { useFormat, useLocale, useMessages, useRegionNames } from '@/components/hooks'; +import { Calendar, KeyRound, Landmark, MapPin } from '@/components/icons'; export function SessionInfo({ data }) { const { locale } = useLocale(); diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionModal.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionModal.tsx index 6c34b97b..d6580388 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionModal.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionModal.tsx @@ -1,4 +1,4 @@ -import { Dialog, Modal, ModalProps, Column } from '@umami/react-zen'; +import { Column, Dialog, Modal, type ModalProps } from '@umami/react-zen'; import { SessionProfile } from '@/app/(main)/websites/[websiteId]/sessions/SessionProfile'; import { useNavigation } from '@/components/hooks'; diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx index e83c7957..6624d439 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx @@ -1,14 +1,15 @@ import { - TextField, - Row, - Column, - Tabs, - TabList, - Tab, - TabPanel, Button, + Column, Icon, + Row, + Tab, + TabList, + TabPanel, + Tabs, + TextField, } from '@umami/react-zen'; +import { X } from 'lucide-react'; import { Avatar } from '@/components/common/Avatar'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useMessages, useWebsiteSessionQuery } from '@/components/hooks'; @@ -16,7 +17,6 @@ import { SessionActivity } from './SessionActivity'; import { SessionData } from './SessionData'; import { SessionInfo } from './SessionInfo'; import { SessionStats } from './SessionStats'; -import { X } from 'lucide-react'; export function SessionProfile({ websiteId, diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx index e66302ad..1693d057 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx @@ -1,14 +1,14 @@ +import { Column, Grid, ListItem, Select } from '@umami/react-zen'; import { useMemo, useState } from 'react'; -import { Select, ListItem, Grid, Column } from '@umami/react-zen'; +import { PieChart } from '@/components/charts/PieChart'; +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useMessages, useSessionDataPropertiesQuery, useSessionDataValuesQuery, } from '@/components/hooks'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; -import { PieChart } from '@/components/charts/PieChart'; -import { CHART_COLORS } from '@/lib/constants'; import { ListTable } from '@/components/metrics/ListTable'; +import { CHART_COLORS } from '@/lib/constants'; export function SessionProperties({ websiteId }: { websiteId: string }) { const [propertyName, setPropertyName] = useState(''); diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx index 53b35b21..b1b9f658 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsDataTable.tsx @@ -1,6 +1,6 @@ +import { DataGrid } from '@/components/common/DataGrid'; import { useWebsiteSessionsQuery } from '@/components/hooks'; import { SessionsTable } from './SessionsTable'; -import { DataGrid } from '@/components/common/DataGrid'; export function SessionsDataTable({ websiteId }: { websiteId?: string; teamId?: string }) { const queryResult = useWebsiteSessionsQuery(websiteId); diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx index b959f0da..c8317a2b 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsMetricsBar.tsx @@ -1,9 +1,9 @@ +import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useMessages } from '@/components/hooks'; import { useWebsiteSessionStatsQuery } from '@/components/hooks/queries/useWebsiteSessionStatsQuery'; import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; import { formatLongNumber } from '@/lib/format'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; export function SessionsMetricsBar({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx index 8a096aa7..8e9d2f21 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx @@ -1,13 +1,13 @@ 'use client'; -import { Key, useState } from 'react'; -import { TabList, Tab, Tabs, TabPanel, Column } from '@umami/react-zen'; -import { SessionsDataTable } from './SessionsDataTable'; -import { SessionProperties } from './SessionProperties'; -import { useMessages } from '@/components/hooks'; -import { Panel } from '@/components/common/Panel'; -import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; -import { getItem, setItem } from '@/lib/storage'; +import { Column, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; +import { type Key, useState } from 'react'; import { SessionModal } from '@/app/(main)/websites/[websiteId]/sessions/SessionModal'; +import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; +import { Panel } from '@/components/common/Panel'; +import { useMessages } from '@/components/hooks'; +import { getItem, setItem } from '@/lib/storage'; +import { SessionProperties } from './SessionProperties'; +import { SessionsDataTable } from './SessionsDataTable'; const KEY_NAME = 'umami.sessions.tab'; diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx index ab4977ea..5d3bb374 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx @@ -1,9 +1,9 @@ +import { DataColumn, DataTable, type DataTableProps } from '@umami/react-zen'; import Link from 'next/link'; -import { DataColumn, DataTable, DataTableProps } from '@umami/react-zen'; -import { useFormat, useMessages, useNavigation } from '@/components/hooks'; import { Avatar } from '@/components/common/Avatar'; -import { TypeIcon } from '@/components/common/TypeIcon'; import { DateDistance } from '@/components/common/DateDistance'; +import { TypeIcon } from '@/components/common/TypeIcon'; +import { useFormat, useMessages, useNavigation } from '@/components/hooks'; export function SessionsTable(props: DataTableProps) { const { formatMessage, labels } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/sessions/page.tsx b/src/app/(main)/websites/[websiteId]/sessions/page.tsx index 7bf8216b..221ab71c 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/page.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { SessionsPage } from './SessionsPage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { const { websiteId } = await params; diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx index 1c186385..21cd6137 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx @@ -1,16 +1,16 @@ -import { Button, Modal, DialogTrigger, Dialog, Column } from '@umami/react-zen'; +import { Button, Column, Dialog, DialogTrigger, Modal } from '@umami/react-zen'; +import { ActionForm } from '@/components/common/ActionForm'; import { useLoginQuery, useMessages, useModified, - useUserTeamsQuery, useNavigation, + useUserTeamsQuery, } from '@/components/hooks'; +import { ROLES } from '@/lib/constants'; import { WebsiteDeleteForm } from './WebsiteDeleteForm'; import { WebsiteResetForm } from './WebsiteResetForm'; import { WebsiteTransferForm } from './WebsiteTransferForm'; -import { ActionForm } from '@/components/common/ActionForm'; -import { ROLES } from '@/lib/constants'; export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) { const { formatMessage, labels, messages } = useMessages(); diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx index 780aab74..2fc02768 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteDeleteForm.tsx @@ -1,5 +1,5 @@ -import { useDeleteQuery, useMessages } from '@/components/hooks'; import { TypeConfirmationForm } from '@/components/common/TypeConfirmationForm'; +import { useDeleteQuery, useMessages } from '@/components/hooks'; const CONFIRM_VALUE = 'DELETE'; diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx index c7cb3d89..4ae819ee 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteEditForm.tsx @@ -1,4 +1,4 @@ -import { FormSubmitButton, Form, FormField, FormButtons, TextField } from '@umami/react-zen'; +import { Form, FormButtons, FormField, FormSubmitButton, TextField } from '@umami/react-zen'; import { useMessages, useUpdateQuery, useWebsite } from '@/components/hooks'; import { DOMAIN_REGEX } from '@/lib/constants'; diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx index 43583c3e..d791bc96 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteResetForm.tsx @@ -1,5 +1,5 @@ -import { useMessages, useUpdateQuery } from '@/components/hooks'; import { TypeConfirmationForm } from '@/components/common/TypeConfirmationForm'; +import { useMessages, useUpdateQuery } from '@/components/hooks'; const CONFIRM_VALUE = 'RESET'; diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx index a50aceee..3970cdbd 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettings.tsx @@ -1,10 +1,10 @@ import { Column } from '@umami/react-zen'; +import { Panel } from '@/components/common/Panel'; import { useWebsite } from '@/components/hooks'; -import { WebsiteShareForm } from './WebsiteShareForm'; -import { WebsiteTrackingCode } from './WebsiteTrackingCode'; import { WebsiteData } from './WebsiteData'; import { WebsiteEditForm } from './WebsiteEditForm'; -import { Panel } from '@/components/common/Panel'; +import { WebsiteShareForm } from './WebsiteShareForm'; +import { WebsiteTrackingCode } from './WebsiteTrackingCode'; export function WebsiteSettings({ websiteId }: { websiteId: string; openExternal?: boolean }) { const website = useWebsite(); diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx index 216142ec..99977a0b 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader.tsx @@ -1,8 +1,8 @@ +import { IconLabel, Row } from '@umami/react-zen'; import Link from 'next/link'; import { PageHeader } from '@/components/common/PageHeader'; -import { Globe, ArrowLeft } from '@/components/icons'; import { useMessages, useNavigation, useWebsite } from '@/components/hooks'; -import { IconLabel, Row } from '@umami/react-zen'; +import { ArrowLeft, Globe } from '@/components/icons'; export function WebsiteSettingsHeader() { const website = useWebsite(); diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx index f89d25fd..56c6f436 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteShareForm.tsx @@ -1,19 +1,19 @@ import { + Button, + Column, Form, FormButtons, - TextField, - Button, - Switch, FormSubmitButton, - Column, + IconLabel, Label, Row, - IconLabel, + Switch, + TextField, } from '@umami/react-zen'; -import { useState } from 'react'; -import { getRandomChars } from '@/lib/generate'; -import { useMessages, useUpdateQuery, useConfig } from '@/components/hooks'; import { RefreshCcw } from 'lucide-react'; +import { useState } from 'react'; +import { useConfig, useMessages, useUpdateQuery } from '@/components/hooks'; +import { getRandomChars } from '@/lib/generate'; const generateId = () => getRandomChars(16); diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx index bdc49c75..d24f9485 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteTrackingCode.tsx @@ -1,5 +1,5 @@ -import { TextField, Text, Column, Label } from '@umami/react-zen'; -import { useMessages, useConfig } from '@/components/hooks'; +import { Column, Label, Text, TextField } from '@umami/react-zen'; +import { useConfig, useMessages } from '@/components/hooks'; const SCRIPT_NAME = 'script.js'; diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx index f16ab93c..8af4f05c 100644 --- a/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteTransferForm.tsx @@ -1,15 +1,15 @@ -import { Key, useState } from 'react'; import { Button, Form, FormButtons, FormField, FormSubmitButton, + ListItem, Loading, Select, - ListItem, Text, } from '@umami/react-zen'; +import { type Key, useState } from 'react'; import { useLoginQuery, useMessages, diff --git a/src/app/(main)/websites/[websiteId]/settings/page.tsx b/src/app/(main)/websites/[websiteId]/settings/page.tsx index a3aed621..a26d14f7 100644 --- a/src/app/(main)/websites/[websiteId]/settings/page.tsx +++ b/src/app/(main)/websites/[websiteId]/settings/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { SettingsPage } from './SettingsPage'; -import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { const { websiteId } = await params; diff --git a/src/app/(main)/websites/page.tsx b/src/app/(main)/websites/page.tsx index c3e54be6..cefaf809 100644 --- a/src/app/(main)/websites/page.tsx +++ b/src/app/(main)/websites/page.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { WebsitesPage } from './WebsitesPage'; -import { Metadata } from 'next'; export default function () { return ; diff --git a/src/app/Providers.tsx b/src/app/Providers.tsx index b8898e88..ae1a0007 100644 --- a/src/app/Providers.tsx +++ b/src/app/Providers.tsx @@ -1,9 +1,9 @@ 'use client'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { RouterProvider, ZenProvider } from '@umami/react-zen'; +import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; import { IntlProvider } from 'react-intl'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { ZenProvider, RouterProvider } from '@umami/react-zen'; -import { useRouter } from 'next/navigation'; import { ErrorBoundary } from '@/components/common/ErrorBoundary'; import { useLocale } from '@/components/hooks'; import 'chartjs-adapter-date-fns'; diff --git a/src/app/api/admin/websites/route.ts b/src/app/api/admin/websites/route.ts index 8d6d81bf..09b2ef98 100644 --- a/src/app/api/admin/websites/route.ts +++ b/src/app/api/admin/websites/route.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; +import { ROLES } from '@/lib/constants'; import { parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams } from '@/lib/schema'; import { canViewAllWebsites } from '@/permissions'; import { getWebsites } from '@/queries/prisma/website'; -import { ROLES } from '@/lib/constants'; export async function GET(request: Request) { const schema = z.object({ diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index 2c312a91..7c2b2fed 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -1,13 +1,13 @@ import { z } from 'zod'; -import { createSecureToken } from '@/lib/jwt'; -import redis from '@/lib/redis'; -import { getUserByUsername } from '@/queries/prisma'; -import { json, unauthorized } from '@/lib/response'; -import { parseRequest } from '@/lib/request'; import { saveAuth } from '@/lib/auth'; -import { checkPassword } from '@/lib/password'; -import { secret } from '@/lib/crypto'; import { ROLES } from '@/lib/constants'; +import { secret } from '@/lib/crypto'; +import { createSecureToken } from '@/lib/jwt'; +import { checkPassword } from '@/lib/password'; +import redis from '@/lib/redis'; +import { parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; +import { getUserByUsername } from '@/queries/prisma'; export async function POST(request: Request) { const schema = z.object({ diff --git a/src/app/api/auth/sso/route.ts b/src/app/api/auth/sso/route.ts index fc8fb9bf..bba3dde3 100644 --- a/src/app/api/auth/sso/route.ts +++ b/src/app/api/auth/sso/route.ts @@ -1,7 +1,7 @@ -import redis from '@/lib/redis'; -import { json } from '@/lib/response'; -import { parseRequest } from '@/lib/request'; import { saveAuth } from '@/lib/auth'; +import redis from '@/lib/redis'; +import { parseRequest } from '@/lib/request'; +import { json } from '@/lib/response'; export async function POST(request: Request) { const { auth, error } = await parseRequest(request); diff --git a/src/app/api/links/[linkId]/route.ts b/src/app/api/links/[linkId]/route.ts index 512f39c9..92f572c4 100644 --- a/src/app/api/links/[linkId]/route.ts +++ b/src/app/api/links/[linkId]/route.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import { canUpdateLink, canDeleteLink, canViewLink } from '@/permissions'; import { parseRequest } from '@/lib/request'; -import { ok, json, unauthorized, serverError, badRequest } from '@/lib/response'; +import { badRequest, json, ok, serverError, unauthorized } from '@/lib/response'; +import { canDeleteLink, canUpdateLink, canViewLink } from '@/permissions'; import { deleteLink, getLink, updateLink } from '@/queries/prisma'; export async function GET(request: Request, { params }: { params: Promise<{ linkId: string }> }) { diff --git a/src/app/api/links/route.ts b/src/app/api/links/route.ts index 2d1e70ea..a639888b 100644 --- a/src/app/api/links/route.ts +++ b/src/app/api/links/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions'; -import { json, unauthorized } from '@/lib/response'; import { uuid } from '@/lib/crypto'; import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams } from '@/lib/schema'; +import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions'; import { createLink, getUserLinks } from '@/queries/prisma'; export async function GET(request: Request) { diff --git a/src/app/api/me/password/route.ts b/src/app/api/me/password/route.ts index 51812910..24c73705 100644 --- a/src/app/api/me/password/route.ts +++ b/src/app/api/me/password/route.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; import { checkPassword, hashPassword } from '@/lib/password'; import { parseRequest } from '@/lib/request'; -import { json, badRequest } from '@/lib/response'; +import { badRequest, json } from '@/lib/response'; import { getUser, updateUser } from '@/queries/prisma/user'; export async function POST(request: Request) { diff --git a/src/app/api/me/teams/route.ts b/src/app/api/me/teams/route.ts index 3fa5b419..555bf300 100644 --- a/src/app/api/me/teams/route.ts +++ b/src/app/api/me/teams/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; +import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json } from '@/lib/response'; import { pagingParams } from '@/lib/schema'; import { getUserTeams } from '@/queries/prisma'; -import { json } from '@/lib/response'; -import { getQueryFilters, parseRequest } from '@/lib/request'; export async function GET(request: Request) { const schema = z.object({ diff --git a/src/app/api/me/websites/route.ts b/src/app/api/me/websites/route.ts index 06d5daaa..9ec39c78 100644 --- a/src/app/api/me/websites/route.ts +++ b/src/app/api/me/websites/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; +import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json } from '@/lib/response'; import { pagingParams } from '@/lib/schema'; import { getAllUserWebsitesIncludingTeamOwner, getUserWebsites } from '@/queries/prisma'; -import { json } from '@/lib/response'; -import { parseRequest, getQueryFilters } from '@/lib/request'; export async function GET(request: Request) { const schema = z.object({ diff --git a/src/app/api/pixels/[pixelId]/route.ts b/src/app/api/pixels/[pixelId]/route.ts index 2f547c04..ecaf1fdf 100644 --- a/src/app/api/pixels/[pixelId]/route.ts +++ b/src/app/api/pixels/[pixelId]/route.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import { canUpdatePixel, canDeletePixel, canViewPixel } from '@/permissions'; import { parseRequest } from '@/lib/request'; -import { ok, json, unauthorized, serverError, badRequest } from '@/lib/response'; +import { badRequest, json, ok, serverError, unauthorized } from '@/lib/response'; +import { canDeletePixel, canUpdatePixel, canViewPixel } from '@/permissions'; import { deletePixel, getPixel, updatePixel } from '@/queries/prisma'; export async function GET(request: Request, { params }: { params: Promise<{ pixelId: string }> }) { diff --git a/src/app/api/pixels/route.ts b/src/app/api/pixels/route.ts index 2302c424..8baae4f3 100644 --- a/src/app/api/pixels/route.ts +++ b/src/app/api/pixels/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions'; -import { json, unauthorized } from '@/lib/response'; import { uuid } from '@/lib/crypto'; import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams } from '@/lib/schema'; +import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions'; import { createPixel, getUserPixels } from '@/queries/prisma'; export async function GET(request: Request) { diff --git a/src/app/api/realtime/[websiteId]/route.ts b/src/app/api/realtime/[websiteId]/route.ts index eaa0bbd8..32b7a16c 100644 --- a/src/app/api/realtime/[websiteId]/route.ts +++ b/src/app/api/realtime/[websiteId]/route.ts @@ -1,9 +1,9 @@ +import { startOfMinute, subMinutes } from 'date-fns'; import { REALTIME_RANGE } from '@/lib/constants'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; import { canViewWebsite } from '@/permissions'; import { getRealtimeData } from '@/queries/sql'; -import { startOfMinute, subMinutes } from 'date-fns'; export async function GET( request: Request, diff --git a/src/app/api/reports/attribution/route.ts b/src/app/api/reports/attribution/route.ts index 4c500377..bd7d86dc 100644 --- a/src/app/api/reports/attribution/route.ts +++ b/src/app/api/reports/attribution/route.ts @@ -1,8 +1,8 @@ -import { canViewWebsite } from '@/permissions'; import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; import { reportResultSchema } from '@/lib/schema'; -import { AttributionParameters, getAttribution } from '@/queries/sql/reports/getAttribution'; +import { canViewWebsite } from '@/permissions'; +import { type AttributionParameters, getAttribution } from '@/queries/sql/reports/getAttribution'; export async function POST(request: Request) { const { auth, body, error } = await parseRequest(request, reportResultSchema); diff --git a/src/app/api/reports/breakdown/route.ts b/src/app/api/reports/breakdown/route.ts index 8d96cf5d..3c593145 100644 --- a/src/app/api/reports/breakdown/route.ts +++ b/src/app/api/reports/breakdown/route.ts @@ -1,8 +1,8 @@ -import { canViewWebsite } from '@/permissions'; -import { unauthorized, json } from '@/lib/response'; import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request'; -import { BreakdownParameters, getBreakdown } from '@/queries/sql'; +import { json, unauthorized } from '@/lib/response'; import { reportResultSchema } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { type BreakdownParameters, getBreakdown } from '@/queries/sql'; export async function POST(request: Request) { const { auth, body, error } = await parseRequest(request, reportResultSchema); diff --git a/src/app/api/reports/funnel/route.ts b/src/app/api/reports/funnel/route.ts index 2ba4b862..c13f6f1c 100644 --- a/src/app/api/reports/funnel/route.ts +++ b/src/app/api/reports/funnel/route.ts @@ -1,8 +1,8 @@ -import { canViewWebsite } from '@/permissions'; -import { unauthorized, json } from '@/lib/response'; -import { parseRequest, getQueryFilters, setWebsiteDate } from '@/lib/request'; -import { FunnelParameters, getFunnel } from '@/queries/sql'; +import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { reportResultSchema } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { type FunnelParameters, getFunnel } from '@/queries/sql'; export async function POST(request: Request) { const { auth, body, error } = await parseRequest(request, reportResultSchema); diff --git a/src/app/api/reports/goal/route.ts b/src/app/api/reports/goal/route.ts index f9848fa7..3bd0415d 100644 --- a/src/app/api/reports/goal/route.ts +++ b/src/app/api/reports/goal/route.ts @@ -1,8 +1,8 @@ -import { canViewWebsite } from '@/permissions'; -import { unauthorized, json } from '@/lib/response'; import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request'; -import { getGoal, GoalParameters } from '@/queries/sql/reports/getGoal'; +import { json, unauthorized } from '@/lib/response'; import { reportResultSchema } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { type GoalParameters, getGoal } from '@/queries/sql/reports/getGoal'; export async function POST(request: Request) { const { auth, body, error } = await parseRequest(request, reportResultSchema); diff --git a/src/app/api/reports/journey/route.ts b/src/app/api/reports/journey/route.ts index d4e5e18d..29e85319 100644 --- a/src/app/api/reports/journey/route.ts +++ b/src/app/api/reports/journey/route.ts @@ -1,8 +1,8 @@ -import { canViewWebsite } from '@/permissions'; -import { unauthorized, json } from '@/lib/response'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { getJourney } from '@/queries/sql'; +import { json, unauthorized } from '@/lib/response'; import { reportResultSchema } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { getJourney } from '@/queries/sql'; export async function POST(request: Request) { const { auth, body, error } = await parseRequest(request, reportResultSchema); diff --git a/src/app/api/reports/retention/route.ts b/src/app/api/reports/retention/route.ts index 69d61c0e..d1a7d698 100644 --- a/src/app/api/reports/retention/route.ts +++ b/src/app/api/reports/retention/route.ts @@ -1,8 +1,8 @@ -import { canViewWebsite } from '@/permissions'; -import { unauthorized, json } from '@/lib/response'; -import { parseRequest, getQueryFilters, setWebsiteDate } from '@/lib/request'; -import { getRetention, RetentionParameters } from '@/queries/sql'; +import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { reportResultSchema } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { getRetention, type RetentionParameters } from '@/queries/sql'; export async function POST(request: Request) { const { auth, body, error } = await parseRequest(request, reportResultSchema); diff --git a/src/app/api/reports/revenue/route.ts b/src/app/api/reports/revenue/route.ts index 75930adc..6a556612 100644 --- a/src/app/api/reports/revenue/route.ts +++ b/src/app/api/reports/revenue/route.ts @@ -1,8 +1,8 @@ -import { canViewWebsite } from '@/permissions'; -import { unauthorized, json } from '@/lib/response'; -import { parseRequest, getQueryFilters, setWebsiteDate } from '@/lib/request'; +import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { reportResultSchema } from '@/lib/schema'; -import { getRevenue, RevenuParameters } from '@/queries/sql/reports/getRevenue'; +import { canViewWebsite } from '@/permissions'; +import { getRevenue, type RevenuParameters } from '@/queries/sql/reports/getRevenue'; export async function POST(request: Request) { const { auth, body, error } = await parseRequest(request, reportResultSchema); diff --git a/src/app/api/reports/route.ts b/src/app/api/reports/route.ts index 123a7e66..b0a41354 100644 --- a/src/app/api/reports/route.ts +++ b/src/app/api/reports/route.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; import { uuid } from '@/lib/crypto'; -import { pagingParams, reportSchema, reportTypeParam } from '@/lib/schema'; import { parseRequest } from '@/lib/request'; -import { canViewWebsite, canUpdateWebsite } from '@/permissions'; -import { unauthorized, json } from '@/lib/response'; -import { getReports, createReport } from '@/queries/prisma'; +import { json, unauthorized } from '@/lib/response'; +import { pagingParams, reportSchema, reportTypeParam } from '@/lib/schema'; +import { canUpdateWebsite, canViewWebsite } from '@/permissions'; +import { createReport, getReports } from '@/queries/prisma'; export async function GET(request: Request) { const schema = z.object({ diff --git a/src/app/api/reports/utm/route.ts b/src/app/api/reports/utm/route.ts index ef0ff5fe..577fdab7 100644 --- a/src/app/api/reports/utm/route.ts +++ b/src/app/api/reports/utm/route.ts @@ -1,9 +1,9 @@ -import { canViewWebsite } from '@/permissions'; -import { unauthorized, json } from '@/lib/response'; -import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request'; -import { getUTM, UTMParameters } from '@/queries/sql'; -import { reportResultSchema } from '@/lib/schema'; import { UTM_PARAMS } from '@/lib/constants'; +import { getQueryFilters, parseRequest, setWebsiteDate } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; +import { reportResultSchema } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { getUTM, type UTMParameters } from '@/queries/sql'; export async function POST(request: Request) { const { auth, body, error } = await parseRequest(request, reportResultSchema); diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts index 2c2085bf..d1a7b90b 100644 --- a/src/app/api/send/route.ts +++ b/src/app/api/send/route.ts @@ -1,18 +1,18 @@ -import { z } from 'zod'; -import { isbot } from 'isbot'; import { startOfHour, startOfMonth } from 'date-fns'; +import { isbot } from 'isbot'; +import { serializeError } from 'serialize-error'; +import { z } from 'zod'; import clickhouse from '@/lib/clickhouse'; -import { parseRequest } from '@/lib/request'; -import { badRequest, json, forbidden, serverError } from '@/lib/response'; -import { fetchWebsite } from '@/lib/load'; +import { COLLECTION_TYPE, EVENT_TYPE } from '@/lib/constants'; +import { hash, secret, uuid } from '@/lib/crypto'; import { getClientInfo, hasBlockedIp } from '@/lib/detect'; import { createToken, parseToken } from '@/lib/jwt'; -import { secret, uuid, hash } from '@/lib/crypto'; -import { COLLECTION_TYPE, EVENT_TYPE } from '@/lib/constants'; +import { fetchWebsite } from '@/lib/load'; +import { parseRequest } from '@/lib/request'; +import { badRequest, forbidden, json, serverError } from '@/lib/response'; import { anyObjectParam, urlOrPathParam } from '@/lib/schema'; import { safeDecodeURI, safeDecodeURIComponent } from '@/lib/url'; import { createSession, saveEvent, saveSessionData } from '@/queries/sql'; -import { serializeError } from 'serialize-error'; interface Cache { websiteId: string; @@ -125,7 +125,7 @@ export async function POST(request: Request) { } const createdAt = timestamp ? new Date(timestamp * 1000) : new Date(); - const now = Math.floor(new Date().getTime() / 1000); + const now = Math.floor(Date.now() / 1000); const sessionSalt = hash(startOfMonth(createdAt).toUTCString()); const visitSalt = hash(startOfHour(createdAt).toUTCString()); diff --git a/src/app/api/share/[shareId]/route.ts b/src/app/api/share/[shareId]/route.ts index 9b2960a1..bef87c4f 100644 --- a/src/app/api/share/[shareId]/route.ts +++ b/src/app/api/share/[shareId]/route.ts @@ -1,9 +1,9 @@ -import { json, notFound } from '@/lib/response'; -import { createToken } from '@/lib/jwt'; import { secret } from '@/lib/crypto'; +import { createToken } from '@/lib/jwt'; +import { json, notFound } from '@/lib/response'; import { getSharedWebsite } from '@/queries/prisma'; -export async function GET(request: Request, { params }: { params: Promise<{ shareId: string }> }) { +export async function GET(_request: Request, { params }: { params: Promise<{ shareId: string }> }) { const { shareId } = await params; const website = await getSharedWebsite(shareId); diff --git a/src/app/api/teams/[teamId]/links/route.ts b/src/app/api/teams/[teamId]/links/route.ts index 39ac769e..41e139b3 100644 --- a/src/app/api/teams/[teamId]/links/route.ts +++ b/src/app/api/teams/[teamId]/links/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { unauthorized, json } from '@/lib/response'; -import { canViewTeam } from '@/permissions'; import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams } from '@/lib/schema'; +import { canViewTeam } from '@/permissions'; import { getTeamLinks } from '@/queries/prisma'; export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) { diff --git a/src/app/api/teams/[teamId]/pixels/route.ts b/src/app/api/teams/[teamId]/pixels/route.ts index bacb6668..daac2040 100644 --- a/src/app/api/teams/[teamId]/pixels/route.ts +++ b/src/app/api/teams/[teamId]/pixels/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { unauthorized, json } from '@/lib/response'; -import { canViewTeam } from '@/permissions'; import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams } from '@/lib/schema'; +import { canViewTeam } from '@/permissions'; import { getTeamPixels } from '@/queries/prisma'; export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) { diff --git a/src/app/api/teams/[teamId]/route.ts b/src/app/api/teams/[teamId]/route.ts index de3e3143..c334b2af 100644 --- a/src/app/api/teams/[teamId]/route.ts +++ b/src/app/api/teams/[teamId]/route.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import { unauthorized, json, notFound, ok } from '@/lib/response'; -import { canDeleteTeam, canUpdateTeam, canViewTeam } from '@/permissions'; import { parseRequest } from '@/lib/request'; +import { json, notFound, ok, unauthorized } from '@/lib/response'; +import { canDeleteTeam, canUpdateTeam, canViewTeam } from '@/permissions'; import { deleteTeam, getTeam, updateTeam } from '@/queries/prisma'; export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) { diff --git a/src/app/api/teams/[teamId]/users/[userId]/route.ts b/src/app/api/teams/[teamId]/users/[userId]/route.ts index 7e3c154b..d09af9da 100644 --- a/src/app/api/teams/[teamId]/users/[userId]/route.ts +++ b/src/app/api/teams/[teamId]/users/[userId]/route.ts @@ -1,9 +1,9 @@ -import { canDeleteTeamUser, canUpdateTeam } from '@/permissions'; +import { z } from 'zod'; import { parseRequest } from '@/lib/request'; import { badRequest, json, ok, unauthorized } from '@/lib/response'; -import { deleteTeamUser, getTeamUser, updateTeamUser } from '@/queries/prisma'; -import { z } from 'zod'; import { teamRoleParam } from '@/lib/schema'; +import { canDeleteTeamUser, canUpdateTeam } from '@/permissions'; +import { deleteTeamUser, getTeamUser, updateTeamUser } from '@/queries/prisma'; export async function GET( request: Request, diff --git a/src/app/api/teams/[teamId]/users/route.ts b/src/app/api/teams/[teamId]/users/route.ts index 6f97ac29..c1297636 100644 --- a/src/app/api/teams/[teamId]/users/route.ts +++ b/src/app/api/teams/[teamId]/users/route.ts @@ -1,9 +1,9 @@ +import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { badRequest, json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams, teamRoleParam } from '@/lib/schema'; import { canUpdateTeam, canViewTeam } from '@/permissions'; import { createTeamUser, getTeamUser, getTeamUsers } from '@/queries/prisma'; -import { z } from 'zod'; export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) { const schema = z.object({ diff --git a/src/app/api/teams/[teamId]/websites/route.ts b/src/app/api/teams/[teamId]/websites/route.ts index a51076dc..05c6d804 100644 --- a/src/app/api/teams/[teamId]/websites/route.ts +++ b/src/app/api/teams/[teamId]/websites/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { unauthorized, json } from '@/lib/response'; -import { canViewTeam } from '@/permissions'; import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams } from '@/lib/schema'; +import { canViewTeam } from '@/permissions'; import { getTeamWebsites } from '@/queries/prisma'; export async function GET(request: Request, { params }: { params: Promise<{ teamId: string }> }) { diff --git a/src/app/api/teams/join/route.ts b/src/app/api/teams/join/route.ts index e6bfb871..3ce0913f 100644 --- a/src/app/api/teams/join/route.ts +++ b/src/app/api/teams/join/route.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import { json, badRequest, notFound } from '@/lib/response'; -import { parseRequest } from '@/lib/request'; import { ROLES } from '@/lib/constants'; +import { parseRequest } from '@/lib/request'; +import { badRequest, json, notFound } from '@/lib/response'; import { createTeamUser, findTeam, getTeamUser } from '@/queries/prisma'; export async function POST(request: Request) { diff --git a/src/app/api/teams/route.ts b/src/app/api/teams/route.ts index 2b9985ba..53ef5923 100644 --- a/src/app/api/teams/route.ts +++ b/src/app/api/teams/route.ts @@ -1,11 +1,11 @@ import { z } from 'zod'; -import { getRandomChars } from '@/lib/generate'; -import { unauthorized, json } from '@/lib/response'; -import { canCreateTeam } from '@/permissions'; import { uuid } from '@/lib/crypto'; +import { getRandomChars } from '@/lib/generate'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { createTeam, getUserTeams } from '@/queries/prisma'; +import { json, unauthorized } from '@/lib/response'; import { pagingParams } from '@/lib/schema'; +import { canCreateTeam } from '@/permissions'; +import { createTeam, getUserTeams } from '@/queries/prisma'; export async function GET(request: Request) { const schema = z.object({ diff --git a/src/app/api/users/[userId]/route.ts b/src/app/api/users/[userId]/route.ts index c15b4b71..aade8aa8 100644 --- a/src/app/api/users/[userId]/route.ts +++ b/src/app/api/users/[userId]/route.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -import { canUpdateUser, canViewUser, canDeleteUser } from '@/permissions'; -import { getUser, getUserByUsername, updateUser, deleteUser } from '@/queries/prisma'; -import { json, unauthorized, badRequest, ok } from '@/lib/response'; import { hashPassword } from '@/lib/password'; import { parseRequest } from '@/lib/request'; +import { badRequest, json, ok, unauthorized } from '@/lib/response'; import { userRoleParam } from '@/lib/schema'; +import { canDeleteUser, canUpdateUser, canViewUser } from '@/permissions'; +import { deleteUser, getUser, getUserByUsername, updateUser } from '@/queries/prisma'; export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) { const { auth, error } = await parseRequest(request); diff --git a/src/app/api/users/[userId]/teams/route.ts b/src/app/api/users/[userId]/teams/route.ts index c2c34342..7a834a3f 100644 --- a/src/app/api/users/[userId]/teams/route.ts +++ b/src/app/api/users/[userId]/teams/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; +import { parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { pagingParams } from '@/lib/schema'; import { getUserTeams } from '@/queries/prisma'; -import { unauthorized, json } from '@/lib/response'; -import { parseRequest } from '@/lib/request'; export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) { const schema = z.object({ diff --git a/src/app/api/users/[userId]/websites/route.ts b/src/app/api/users/[userId]/websites/route.ts index 1c2285ba..1107d8e1 100644 --- a/src/app/api/users/[userId]/websites/route.ts +++ b/src/app/api/users/[userId]/websites/route.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import { unauthorized, json } from '@/lib/response'; -import { pagingParams, searchParams } from '@/lib/schema'; import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; +import { pagingParams, searchParams } from '@/lib/schema'; import { getAllUserWebsitesIncludingTeamOwner, getUserWebsites } from '@/queries/prisma/website'; export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) { diff --git a/src/app/api/users/route.ts b/src/app/api/users/route.ts index 1e7ed9eb..dbb114cf 100644 --- a/src/app/api/users/route.ts +++ b/src/app/api/users/route.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -import { hashPassword } from '@/lib/password'; -import { canCreateUser } from '@/permissions'; import { ROLES } from '@/lib/constants'; import { uuid } from '@/lib/crypto'; +import { hashPassword } from '@/lib/password'; import { parseRequest } from '@/lib/request'; -import { unauthorized, json, badRequest } from '@/lib/response'; +import { badRequest, json, unauthorized } from '@/lib/response'; +import { canCreateUser } from '@/permissions'; import { createUser, getUserByUsername } from '@/queries/prisma'; export async function POST(request: Request) { diff --git a/src/app/api/websites/[websiteId]/active/route.ts b/src/app/api/websites/[websiteId]/active/route.ts index f0abd4c3..233b97e5 100644 --- a/src/app/api/websites/[websiteId]/active/route.ts +++ b/src/app/api/websites/[websiteId]/active/route.ts @@ -1,7 +1,7 @@ -import { canViewWebsite } from '@/permissions'; -import { json, unauthorized } from '@/lib/response'; -import { getActiveVisitors } from '@/queries/sql'; import { parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; +import { canViewWebsite } from '@/permissions'; +import { getActiveVisitors } from '@/queries/sql'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/daterange/route.ts b/src/app/api/websites/[websiteId]/daterange/route.ts index 312daad6..14a241fd 100644 --- a/src/app/api/websites/[websiteId]/daterange/route.ts +++ b/src/app/api/websites/[websiteId]/daterange/route.ts @@ -1,7 +1,7 @@ +import { parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { canViewWebsite } from '@/permissions'; import { getWebsiteDateRange } from '@/queries/sql'; -import { json, unauthorized } from '@/lib/response'; -import { parseRequest } from '@/lib/request'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/event-data/[eventId]/route.ts b/src/app/api/websites/[websiteId]/event-data/[eventId]/route.ts index 1dea7896..54afab21 100644 --- a/src/app/api/websites/[websiteId]/event-data/[eventId]/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/[eventId]/route.ts @@ -1,5 +1,5 @@ import { parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; +import { json, unauthorized } from '@/lib/response'; import { canViewWebsite } from '@/permissions'; import { getEventData } from '@/queries/sql/events/getEventData'; diff --git a/src/app/api/websites/[websiteId]/event-data/events/route.ts b/src/app/api/websites/[websiteId]/event-data/events/route.ts index 2420f0fa..eb6ee6ed 100644 --- a/src/app/api/websites/[websiteId]/event-data/events/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/events/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; +import { json, unauthorized } from '@/lib/response'; +import { filterParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getEventDataEvents } from '@/queries/sql/events/getEventDataEvents'; -import { filterParams } from '@/lib/schema'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/event-data/fields/route.ts b/src/app/api/websites/[websiteId]/event-data/fields/route.ts index cfee4967..bce6a977 100644 --- a/src/app/api/websites/[websiteId]/event-data/fields/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/fields/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; +import { json, unauthorized } from '@/lib/response'; +import { filterParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getEventDataFields } from '@/queries/sql'; -import { filterParams } from '@/lib/schema'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/event-data/properties/route.ts b/src/app/api/websites/[websiteId]/event-data/properties/route.ts index df513e5a..52d15cfb 100644 --- a/src/app/api/websites/[websiteId]/event-data/properties/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/properties/route.ts @@ -1,9 +1,9 @@ +import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; import { filterParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getEventDataProperties } from '@/queries/sql'; -import { z } from 'zod'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/event-data/stats/route.ts b/src/app/api/websites/[websiteId]/event-data/stats/route.ts index bb482e2c..042e989a 100644 --- a/src/app/api/websites/[websiteId]/event-data/stats/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/stats/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; +import { json, unauthorized } from '@/lib/response'; +import { filterParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getEventDataStats } from '@/queries/sql'; -import { filterParams } from '@/lib/schema'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/event-data/values/route.ts b/src/app/api/websites/[websiteId]/event-data/values/route.ts index 2921af9f..12e8f2dc 100644 --- a/src/app/api/websites/[websiteId]/event-data/values/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/values/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; +import { json, unauthorized } from '@/lib/response'; +import { filterParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getEventDataValues } from '@/queries/sql'; -import { filterParams } from '@/lib/schema'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/events/route.ts b/src/app/api/websites/[websiteId]/events/route.ts index 6dbdea7d..74ec3ece 100644 --- a/src/app/api/websites/[websiteId]/events/route.ts +++ b/src/app/api/websites/[websiteId]/events/route.ts @@ -1,9 +1,9 @@ +import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; import { filterParams, pagingParams, searchParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getWebsiteEvents } from '@/queries/sql'; -import { z } from 'zod'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/events/series/route.ts b/src/app/api/websites/[websiteId]/events/series/route.ts index a579991b..977e9c81 100644 --- a/src/app/api/websites/[websiteId]/events/series/route.ts +++ b/src/app/api/websites/[websiteId]/events/series/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { parseRequest, getQueryFilters } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; -import { canViewWebsite } from '@/permissions'; +import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { filterParams, timezoneParam, unitParam } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; import { getEventStats } from '@/queries/sql'; export async function GET( diff --git a/src/app/api/websites/[websiteId]/export/route.ts b/src/app/api/websites/[websiteId]/export/route.ts index fbf250e6..eec81c6d 100644 --- a/src/app/api/websites/[websiteId]/export/route.ts +++ b/src/app/api/websites/[websiteId]/export/route.ts @@ -1,10 +1,10 @@ -import { z } from 'zod'; import JSZip from 'jszip'; import Papa from 'papaparse'; +import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; +import { json, unauthorized } from '@/lib/response'; +import { dateRangeParams, pagingParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; -import { pagingParams, dateRangeParams } from '@/lib/schema'; import { getEventMetrics, getPageviewMetrics, getSessionMetrics } from '@/queries/sql'; export async function GET( diff --git a/src/app/api/websites/[websiteId]/metrics/expanded/route.ts b/src/app/api/websites/[websiteId]/metrics/expanded/route.ts index 703cf5ee..d52c1773 100644 --- a/src/app/api/websites/[websiteId]/metrics/expanded/route.ts +++ b/src/app/api/websites/[websiteId]/metrics/expanded/route.ts @@ -1,3 +1,4 @@ +import { z } from 'zod'; import { EVENT_COLUMNS, EVENT_TYPE, SESSION_COLUMNS } from '@/lib/constants'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { badRequest, json, unauthorized } from '@/lib/response'; @@ -9,7 +10,6 @@ import { getPageviewExpandedMetrics, getSessionExpandedMetrics, } from '@/queries/sql'; -import { z } from 'zod'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/metrics/route.ts b/src/app/api/websites/[websiteId]/metrics/route.ts index 3bfeaa6a..12784adb 100644 --- a/src/app/api/websites/[websiteId]/metrics/route.ts +++ b/src/app/api/websites/[websiteId]/metrics/route.ts @@ -1,3 +1,4 @@ +import { z } from 'zod'; import { EVENT_COLUMNS, EVENT_TYPE, SESSION_COLUMNS } from '@/lib/constants'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { badRequest, json, unauthorized } from '@/lib/response'; @@ -9,7 +10,6 @@ import { getPageviewMetrics, getSessionMetrics, } from '@/queries/sql'; -import { z } from 'zod'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/pageviews/route.ts b/src/app/api/websites/[websiteId]/pageviews/route.ts index 939fa7f4..af59bce4 100644 --- a/src/app/api/websites/[websiteId]/pageviews/route.ts +++ b/src/app/api/websites/[websiteId]/pageviews/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { canViewWebsite } from '@/permissions'; -import { getQueryFilters, parseRequest } from '@/lib/request'; -import { dateRangeParams, filterParams } from '@/lib/schema'; import { getCompareDate } from '@/lib/date'; -import { unauthorized, json } from '@/lib/response'; +import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; +import { dateRangeParams, filterParams } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; import { getPageviewStats, getSessionStats } from '@/queries/sql'; export async function GET( diff --git a/src/app/api/websites/[websiteId]/reports/route.ts b/src/app/api/websites/[websiteId]/reports/route.ts index 22851f44..93e7ab46 100644 --- a/src/app/api/websites/[websiteId]/reports/route.ts +++ b/src/app/api/websites/[websiteId]/reports/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; +import { parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; +import { filterParams, pagingParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getReports } from '@/queries/prisma'; -import { filterParams, pagingParams } from '@/lib/schema'; -import { parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/reset/route.ts b/src/app/api/websites/[websiteId]/reset/route.ts index c5ac3dff..e0be5a53 100644 --- a/src/app/api/websites/[websiteId]/reset/route.ts +++ b/src/app/api/websites/[websiteId]/reset/route.ts @@ -1,7 +1,7 @@ +import { parseRequest } from '@/lib/request'; +import { ok, unauthorized } from '@/lib/response'; import { canUpdateWebsite } from '@/permissions'; import { resetWebsite } from '@/queries/prisma'; -import { unauthorized, ok } from '@/lib/response'; -import { parseRequest } from '@/lib/request'; export async function POST( request: Request, diff --git a/src/app/api/websites/[websiteId]/route.ts b/src/app/api/websites/[websiteId]/route.ts index 4c147707..b4c0e7e8 100644 --- a/src/app/api/websites/[websiteId]/route.ts +++ b/src/app/api/websites/[websiteId]/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { canUpdateWebsite, canDeleteWebsite, canViewWebsite } from '@/permissions'; import { SHARE_ID_REGEX } from '@/lib/constants'; import { parseRequest } from '@/lib/request'; -import { ok, json, unauthorized, serverError, badRequest } from '@/lib/response'; +import { badRequest, json, ok, serverError, unauthorized } from '@/lib/response'; +import { canDeleteWebsite, canUpdateWebsite, canViewWebsite } from '@/permissions'; import { deleteWebsite, getWebsite, updateWebsite } from '@/queries/prisma'; export async function GET( diff --git a/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts b/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts index 0aa36e70..b51f783b 100644 --- a/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts +++ b/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts @@ -1,9 +1,9 @@ -import { canDeleteWebsite, canUpdateWebsite, canViewWebsite } from '@/permissions'; +import { z } from 'zod'; import { parseRequest } from '@/lib/request'; import { json, notFound, ok, unauthorized } from '@/lib/response'; import { anyObjectParam, segmentTypeParam } from '@/lib/schema'; +import { canDeleteWebsite, canUpdateWebsite, canViewWebsite } from '@/permissions'; import { deleteSegment, getSegment, updateSegment } from '@/queries/prisma'; -import { z } from 'zod'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/segments/route.ts b/src/app/api/websites/[websiteId]/segments/route.ts index 26afd99e..45927656 100644 --- a/src/app/api/websites/[websiteId]/segments/route.ts +++ b/src/app/api/websites/[websiteId]/segments/route.ts @@ -1,10 +1,10 @@ -import { canUpdateWebsite, canViewWebsite } from '@/permissions'; +import { z } from 'zod'; import { uuid } from '@/lib/crypto'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; -import { segmentTypeParam, searchParams, anyObjectParam } from '@/lib/schema'; +import { anyObjectParam, searchParams, segmentTypeParam } from '@/lib/schema'; +import { canUpdateWebsite, canViewWebsite } from '@/permissions'; import { createSegment, getWebsiteSegments } from '@/queries/prisma'; -import { z } from 'zod'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/session-data/properties/route.ts b/src/app/api/websites/[websiteId]/session-data/properties/route.ts index 64328ce5..2d8db153 100644 --- a/src/app/api/websites/[websiteId]/session-data/properties/route.ts +++ b/src/app/api/websites/[websiteId]/session-data/properties/route.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; +import { json, unauthorized } from '@/lib/response'; +import { filterParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getSessionDataProperties } from '@/queries/sql'; -import { filterParams } from '@/lib/schema'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/session-data/values/route.ts b/src/app/api/websites/[websiteId]/session-data/values/route.ts index 75464ba4..7d06870a 100644 --- a/src/app/api/websites/[websiteId]/session-data/values/route.ts +++ b/src/app/api/websites/[websiteId]/session-data/values/route.ts @@ -1,9 +1,9 @@ -import { canViewWebsite } from '@/permissions'; +import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; -import { getSessionDataValues } from '@/queries/sql'; -import { z } from 'zod'; import { filterParams } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { getSessionDataValues } from '@/queries/sql'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts index f68a9cc3..41b766d0 100644 --- a/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { parseRequest, getQueryFilters } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; +import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { canViewWebsite } from '@/permissions'; import { getSessionActivity } from '@/queries/sql'; diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/properties/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/properties/route.ts index ca108d76..6b5c2418 100644 --- a/src/app/api/websites/[websiteId]/sessions/[sessionId]/properties/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/properties/route.ts @@ -1,7 +1,7 @@ -import { unauthorized, json } from '@/lib/response'; +import { parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { canViewWebsite } from '@/permissions'; import { getSessionData } from '@/queries/sql'; -import { parseRequest } from '@/lib/request'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/route.ts index 3001b857..10916637 100644 --- a/src/app/api/websites/[websiteId]/sessions/[sessionId]/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/route.ts @@ -1,7 +1,7 @@ -import { unauthorized, json } from '@/lib/response'; +import { parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { canViewWebsite } from '@/permissions'; import { getWebsiteSession } from '@/queries/sql'; -import { parseRequest } from '@/lib/request'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/sessions/route.ts b/src/app/api/websites/[websiteId]/sessions/route.ts index 340774b2..ed4757a1 100644 --- a/src/app/api/websites/[websiteId]/sessions/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; -import { canViewWebsite } from '@/permissions'; +import { json, unauthorized } from '@/lib/response'; import { dateRangeParams, filterParams, pagingParams, searchParams } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; import { getWebsiteSessions } from '@/queries/sql'; export async function GET( diff --git a/src/app/api/websites/[websiteId]/sessions/stats/route.ts b/src/app/api/websites/[websiteId]/sessions/stats/route.ts index 8179bdb2..459830ed 100644 --- a/src/app/api/websites/[websiteId]/sessions/stats/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/stats/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { parseRequest, getQueryFilters } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; -import { canViewWebsite } from '@/permissions'; +import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { filterParams } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; import { getWebsiteSessionStats } from '@/queries/sql'; export async function GET( diff --git a/src/app/api/websites/[websiteId]/sessions/weekly/route.ts b/src/app/api/websites/[websiteId]/sessions/weekly/route.ts index f3d17f94..b9ccf3ef 100644 --- a/src/app/api/websites/[websiteId]/sessions/weekly/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/weekly/route.ts @@ -1,9 +1,9 @@ +import { z } from 'zod'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; import { filterParams, timezoneParam } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getWeeklyTraffic } from '@/queries/sql'; -import { z } from 'zod'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/stats/route.ts b/src/app/api/websites/[websiteId]/stats/route.ts index 8fcb0132..07c8b969 100644 --- a/src/app/api/websites/[websiteId]/stats/route.ts +++ b/src/app/api/websites/[websiteId]/stats/route.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -import { parseRequest, getQueryFilters } from '@/lib/request'; -import { unauthorized, json } from '@/lib/response'; -import { canViewWebsite } from '@/permissions'; -import { dateRangeParams, filterParams } from '@/lib/schema'; -import { getWebsiteStats } from '@/queries/sql'; import { getCompareDate } from '@/lib/date'; +import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; +import { dateRangeParams, filterParams } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { getWebsiteStats } from '@/queries/sql'; export async function GET( request: Request, diff --git a/src/app/api/websites/[websiteId]/transfer/route.ts b/src/app/api/websites/[websiteId]/transfer/route.ts index 8ae7a927..df2fed20 100644 --- a/src/app/api/websites/[websiteId]/transfer/route.ts +++ b/src/app/api/websites/[websiteId]/transfer/route.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; +import { parseRequest } from '@/lib/request'; +import { badRequest, json, unauthorized } from '@/lib/response'; import { canTransferWebsiteToTeam, canTransferWebsiteToUser } from '@/permissions'; import { updateWebsite } from '@/queries/prisma'; -import { parseRequest } from '@/lib/request'; -import { badRequest, unauthorized, json } from '@/lib/response'; export async function POST( request: Request, diff --git a/src/app/api/websites/[websiteId]/values/route.ts b/src/app/api/websites/[websiteId]/values/route.ts index 35983d04..172325e3 100644 --- a/src/app/api/websites/[websiteId]/values/route.ts +++ b/src/app/api/websites/[websiteId]/values/route.ts @@ -1,11 +1,11 @@ -import { canViewWebsite } from '@/permissions'; +import { z } from 'zod'; import { EVENT_COLUMNS, FILTER_COLUMNS, SEGMENT_TYPES, SESSION_COLUMNS } from '@/lib/constants'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { badRequest, json, unauthorized } from '@/lib/response'; -import { getValues } from '@/queries/sql'; -import { getWebsiteSegments } from '@/queries/prisma'; -import { z } from 'zod'; import { dateRangeParams, fieldsParam, searchParams } from '@/lib/schema'; +import { canViewWebsite } from '@/permissions'; +import { getWebsiteSegments } from '@/queries/prisma'; +import { getValues } from '@/queries/sql'; export async function GET( request: Request, diff --git a/src/app/api/websites/route.ts b/src/app/api/websites/route.ts index 994e22bd..e2b26c10 100644 --- a/src/app/api/websites/route.ts +++ b/src/app/api/websites/route.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -import redis from '@/lib/redis'; -import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions'; -import { json, unauthorized } from '@/lib/response'; import { uuid } from '@/lib/crypto'; +import redis from '@/lib/redis'; import { getQueryFilters, parseRequest } from '@/lib/request'; +import { json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams } from '@/lib/schema'; +import { canCreateTeamWebsite, canCreateWebsite } from '@/permissions'; import { createWebsite, getWebsiteCount } from '@/queries/prisma'; import { getAllUserWebsitesIncludingTeamOwner, getUserWebsites } from '@/queries/prisma/website'; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 745f6461..afcbfc60 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,5 @@ +import type { Metadata } from 'next'; import { Suspense } from 'react'; -import { Metadata } from 'next'; import { Providers } from './Providers'; import '@fontsource/inter/300.css'; import '@fontsource/inter/400.css'; diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx index b151b94e..63711795 100644 --- a/src/app/login/LoginForm.tsx +++ b/src/app/login/LoginForm.tsx @@ -1,19 +1,19 @@ import { + Column, Form, FormButtons, FormField, FormSubmitButton, - TextField, - PasswordField, - Icon, - Column, Heading, + Icon, + PasswordField, + TextField, } from '@umami/react-zen'; import { useRouter } from 'next/navigation'; import { useMessages, useUpdateQuery } from '@/components/hooks'; -import { setUser } from '@/store/app'; -import { setClientAuthToken } from '@/lib/client'; import { Logo } from '@/components/svg'; +import { setClientAuthToken } from '@/lib/client'; +import { setUser } from '@/store/app'; export function LoginForm() { const { formatMessage, labels, getErrorMessage } = useMessages(); diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 8abf7a4e..ea27735a 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { LoginPage } from './LoginPage'; export default async function () { diff --git a/src/app/logout/LogoutPage.tsx b/src/app/logout/LogoutPage.tsx index d66d62a9..33e1615d 100644 --- a/src/app/logout/LogoutPage.tsx +++ b/src/app/logout/LogoutPage.tsx @@ -1,9 +1,9 @@ 'use client'; -import { useEffect } from 'react'; import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; import { useApi } from '@/components/hooks'; -import { setUser } from '@/store/app'; import { removeClientAuthToken } from '@/lib/client'; +import { setUser } from '@/store/app'; export function LogoutPage() { const router = useRouter(); diff --git a/src/app/logout/page.tsx b/src/app/logout/page.tsx index 0617c2e2..20952788 100644 --- a/src/app/logout/page.tsx +++ b/src/app/logout/page.tsx @@ -1,4 +1,4 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { LogoutPage } from './LogoutPage'; export default function () { diff --git a/src/app/page.tsx b/src/app/page.tsx index 8bf748f9..38eda1de 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,8 +1,8 @@ 'use client'; -import { useEffect } from 'react'; import { redirect } from 'next/navigation'; -import { getItem, removeItem } from '@/lib/storage'; +import { useEffect } from 'react'; import { LAST_TEAM_CONFIG } from '@/lib/constants'; +import { getItem, removeItem } from '@/lib/storage'; export default function RootPage() { useEffect(() => { diff --git a/src/app/share/[...shareId]/Header.tsx b/src/app/share/[...shareId]/Header.tsx index ef4fe5ea..d7b7dcb4 100644 --- a/src/app/share/[...shareId]/Header.tsx +++ b/src/app/share/[...shareId]/Header.tsx @@ -1,4 +1,4 @@ -import { Row, Icon, Text, ThemeButton } from '@umami/react-zen'; +import { Icon, Row, Text, ThemeButton } from '@umami/react-zen'; import { LanguageButton } from '@/components/input/LanguageButton'; import { PreferencesButton } from '@/components/input/PreferencesButton'; import { Logo } from '@/components/svg'; @@ -6,7 +6,7 @@ import { Logo } from '@/components/svg'; export function Header() { return ( - + diff --git a/src/app/share/[...shareId]/SharePage.tsx b/src/app/share/[...shareId]/SharePage.tsx index f33798a1..55d3ee9f 100644 --- a/src/app/share/[...shareId]/SharePage.tsx +++ b/src/app/share/[...shareId]/SharePage.tsx @@ -1,12 +1,12 @@ 'use client'; import { Column } from '@umami/react-zen'; -import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; -import { WebsitePage } from '@/app/(main)/websites/[websiteId]/WebsitePage'; -import { useShareTokenQuery } from '@/components/hooks'; -import { PageBody } from '@/components/common/PageBody'; -import { Header } from './Header'; -import { Footer } from './Footer'; import { WebsiteHeader } from '@/app/(main)/websites/[websiteId]/WebsiteHeader'; +import { WebsitePage } from '@/app/(main)/websites/[websiteId]/WebsitePage'; +import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; +import { PageBody } from '@/components/common/PageBody'; +import { useShareTokenQuery } from '@/components/hooks'; +import { Footer } from './Footer'; +import { Header } from './Header'; export function SharePage({ shareId }) { const { shareToken, isLoading } = useShareTokenQuery(shareId); diff --git a/src/app/sso/SSOPage.tsx b/src/app/sso/SSOPage.tsx index ec04c090..3cc95093 100644 --- a/src/app/sso/SSOPage.tsx +++ b/src/app/sso/SSOPage.tsx @@ -1,7 +1,7 @@ 'use client'; -import { useEffect } from 'react'; import { Loading } from '@umami/react-zen'; import { useRouter, useSearchParams } from 'next/navigation'; +import { useEffect } from 'react'; import { setClientAuthToken } from '@/lib/client'; export function SSOPage() { diff --git a/src/components/charts/BarChart.tsx b/src/components/charts/BarChart.tsx index 3f3efd3b..7bfc72d2 100644 --- a/src/components/charts/BarChart.tsx +++ b/src/components/charts/BarChart.tsx @@ -1,11 +1,11 @@ -import { useMemo, useState } from 'react'; import { useTheme } from '@umami/react-zen'; +import { useMemo, useState } from 'react'; +import { Chart, type ChartProps } from '@/components/charts/Chart'; import { ChartTooltip } from '@/components/charts/ChartTooltip'; -import { Chart, ChartProps } from '@/components/charts/Chart'; import { useLocale } from '@/components/hooks'; import { renderNumberLabels } from '@/lib/charts'; import { getThemeColors } from '@/lib/colors'; -import { formatDate, DATE_FORMATS } from '@/lib/date'; +import { DATE_FORMATS, formatDate } from '@/lib/date'; import { formatLongCurrency, formatLongNumber } from '@/lib/format'; const dateFormats = { @@ -52,7 +52,7 @@ export function BarChart({ const chartOptions: any = useMemo(() => { return { - __id: new Date().getTime(), + __id: Date.now(), scales: { x: { type: XAxisType, diff --git a/src/components/charts/BubbleChart.tsx b/src/components/charts/BubbleChart.tsx index 91c47b59..bf487ac0 100644 --- a/src/components/charts/BubbleChart.tsx +++ b/src/components/charts/BubbleChart.tsx @@ -1,5 +1,5 @@ -import { Chart, ChartProps } from '@/components/charts/Chart'; import { useState } from 'react'; +import { Chart, type ChartProps } from '@/components/charts/Chart'; import { ChartTooltip } from '@/components/charts/ChartTooltip'; export interface BubbleChartProps extends ChartProps { diff --git a/src/components/charts/Chart.tsx b/src/components/charts/Chart.tsx index b68e45a0..b6ae9d79 100644 --- a/src/components/charts/Chart.tsx +++ b/src/components/charts/Chart.tsx @@ -1,6 +1,11 @@ -import { useState, useRef, useEffect, useMemo } from 'react'; -import { Box, Column, BoxProps } from '@umami/react-zen'; -import ChartJS, { LegendItem, ChartOptions, ChartData, UpdateMode } from 'chart.js/auto'; +import { Box, type BoxProps, Column } from '@umami/react-zen'; +import ChartJS, { + type ChartData, + type ChartOptions, + type LegendItem, + type UpdateMode, +} from 'chart.js/auto'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { Legend } from '@/components/metrics/Legend'; import { DEFAULT_ANIMATION_DURATION } from '@/lib/constants'; diff --git a/src/components/charts/ChartTooltip.tsx b/src/components/charts/ChartTooltip.tsx index e93d669e..95ba2a2b 100644 --- a/src/components/charts/ChartTooltip.tsx +++ b/src/components/charts/ChartTooltip.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { Column, Row, StatusLight, FloatingTooltip } from '@umami/react-zen'; +import { Column, FloatingTooltip, Row, StatusLight } from '@umami/react-zen'; +import type { ReactNode } from 'react'; export function ChartTooltip({ title, diff --git a/src/components/charts/PieChart.tsx b/src/components/charts/PieChart.tsx index f9a9ea52..2470fe77 100644 --- a/src/components/charts/PieChart.tsx +++ b/src/components/charts/PieChart.tsx @@ -1,5 +1,5 @@ -import { Chart, ChartProps } from '@/components/charts/Chart'; import { useState } from 'react'; +import { Chart, type ChartProps } from '@/components/charts/Chart'; import { ChartTooltip } from '@/components/charts/ChartTooltip'; export interface PieChartProps extends ChartProps { diff --git a/src/components/common/ActionForm.tsx b/src/components/common/ActionForm.tsx index d9706475..c6f44e80 100644 --- a/src/components/common/ActionForm.tsx +++ b/src/components/common/ActionForm.tsx @@ -1,4 +1,4 @@ -import { Row, Column, Text } from '@umami/react-zen'; +import { Column, Row, Text } from '@umami/react-zen'; export function ActionForm({ label, description, children }) { return ( diff --git a/src/components/common/AnimatedDiv.tsx b/src/components/common/AnimatedDiv.tsx index 04a28c5b..f9948971 100644 --- a/src/components/common/AnimatedDiv.tsx +++ b/src/components/common/AnimatedDiv.tsx @@ -1,3 +1,3 @@ -import { animated, AnimatedComponent } from '@react-spring/web'; +import { type AnimatedComponent, animated } from '@react-spring/web'; export const AnimatedDiv: AnimatedComponent = animated.div; diff --git a/src/components/common/Avatar.tsx b/src/components/common/Avatar.tsx index f8ed7c94..9b198b30 100644 --- a/src/components/common/Avatar.tsx +++ b/src/components/common/Avatar.tsx @@ -1,6 +1,6 @@ -import { useMemo } from 'react'; -import { createAvatar } from '@dicebear/core'; import { lorelei } from '@dicebear/collection'; +import { createAvatar } from '@dicebear/core'; +import { useMemo } from 'react'; import { getColor, getPastel } from '@/lib/colors'; const lib = lorelei; diff --git a/src/components/common/ConfirmationForm.tsx b/src/components/common/ConfirmationForm.tsx index ce82b54f..b909ef58 100644 --- a/src/components/common/ConfirmationForm.tsx +++ b/src/components/common/ConfirmationForm.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { Box, Button, FormSubmitButton, Form, FormButtons } from '@umami/react-zen'; +import { Box, Button, Form, FormButtons, FormSubmitButton } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { useMessages } from '@/components/hooks'; export interface ConfirmationFormProps { diff --git a/src/components/common/DataGrid.tsx b/src/components/common/DataGrid.tsx index 4d09135f..7e07b8dc 100644 --- a/src/components/common/DataGrid.tsx +++ b/src/components/common/DataGrid.tsx @@ -1,18 +1,18 @@ +import type { UseQueryResult } from '@tanstack/react-query'; +import { Column, Row, SearchField } from '@umami/react-zen'; import { - ReactNode, - useState, - useCallback, - ReactElement, cloneElement, isValidElement, + type ReactElement, + type ReactNode, + useCallback, + useState, } from 'react'; -import { SearchField, Row, Column } from '@umami/react-zen'; -import { UseQueryResult } from '@tanstack/react-query'; -import { useMessages, useMobile, useNavigation } from '@/components/hooks'; -import { Pager } from '@/components/common/Pager'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; -import { PageResult } from '@/lib/types'; import { Empty } from '@/components/common/Empty'; +import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { Pager } from '@/components/common/Pager'; +import { useMessages, useMobile, useNavigation } from '@/components/hooks'; +import type { PageResult } from '@/lib/types'; const DEFAULT_SEARCH_DELAY = 600; diff --git a/src/components/common/DateDisplay.tsx b/src/components/common/DateDisplay.tsx index ea94d727..0bece8ae 100644 --- a/src/components/common/DateDisplay.tsx +++ b/src/components/common/DateDisplay.tsx @@ -15,7 +15,7 @@ export function DateDisplay({ startDate, endDate }) { {isSingleDate ? ( - <>{formatDate(startDate, 'PP', locale)} + formatDate(startDate, 'PP', locale) ) : ( <> {formatDate(startDate, 'PP', locale)} diff --git a/src/components/common/EmptyPlaceholder.tsx b/src/components/common/EmptyPlaceholder.tsx index 16f6cb90..64492e04 100644 --- a/src/components/common/EmptyPlaceholder.tsx +++ b/src/components/common/EmptyPlaceholder.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { Icon, Text, Column } from '@umami/react-zen'; +import { Column, Icon, Text } from '@umami/react-zen'; +import type { ReactNode } from 'react'; export interface EmptyPlaceholderProps { title?: string; diff --git a/src/components/common/ErrorBoundary.tsx b/src/components/common/ErrorBoundary.tsx index acb979ed..4c0c82ed 100644 --- a/src/components/common/ErrorBoundary.tsx +++ b/src/components/common/ErrorBoundary.tsx @@ -1,6 +1,6 @@ -import { ErrorInfo, ReactNode } from 'react'; -import { ErrorBoundary as Boundary } from 'react-error-boundary'; import { Button, Column } from '@umami/react-zen'; +import type { ErrorInfo, ReactNode } from 'react'; +import { ErrorBoundary as Boundary } from 'react-error-boundary'; import { useMessages } from '@/components/hooks'; const logError = (error: Error, info: ErrorInfo) => { diff --git a/src/components/common/ErrorMessage.tsx b/src/components/common/ErrorMessage.tsx index 6bf9003c..3c301513 100644 --- a/src/components/common/ErrorMessage.tsx +++ b/src/components/common/ErrorMessage.tsx @@ -1,4 +1,4 @@ -import { Icon, Text, Row } from '@umami/react-zen'; +import { Icon, Row, Text } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; import { AlertTriangle } from '@/components/icons'; diff --git a/src/components/common/ExternalLink.tsx b/src/components/common/ExternalLink.tsx index 330e972a..6b6dbb99 100644 --- a/src/components/common/ExternalLink.tsx +++ b/src/components/common/ExternalLink.tsx @@ -1,5 +1,5 @@ -import Link from 'next/link'; import { Icon, Row, Text } from '@umami/react-zen'; +import Link from 'next/link'; import { ExternalLink as LinkIcon } from '@/components/icons'; export function ExternalLink({ href, children, ...props }) { diff --git a/src/components/common/FilterLink.tsx b/src/components/common/FilterLink.tsx index 69e225b9..d719a37e 100644 --- a/src/components/common/FilterLink.tsx +++ b/src/components/common/FilterLink.tsx @@ -1,6 +1,6 @@ -import { HTMLAttributes, ReactNode, useState } from 'react'; -import Link from 'next/link'; import { Icon, Row, Text } from '@umami/react-zen'; +import Link from 'next/link'; +import { type HTMLAttributes, type ReactNode, useState } from 'react'; import { useMessages, useNavigation } from '@/components/hooks'; import { ExternalLink } from '@/components/icons'; diff --git a/src/components/common/FilterRecord.tsx b/src/components/common/FilterRecord.tsx index c1ff59eb..04002648 100644 --- a/src/components/common/FilterRecord.tsx +++ b/src/components/common/FilterRecord.tsx @@ -1,9 +1,9 @@ +import { Button, Column, Grid, Icon, Label, ListItem, Select, TextField } from '@umami/react-zen'; import { useState } from 'react'; -import { Grid, Column, TextField, Label, Select, Icon, Button, ListItem } from '@umami/react-zen'; +import { Empty } from '@/components/common/Empty'; import { useFilters, useFormat, useWebsiteValuesQuery } from '@/components/hooks'; import { X } from '@/components/icons'; import { isSearchOperator } from '@/lib/params'; -import { Empty } from '@/components/common/Empty'; export interface FilterRecordProps { websiteId: string; diff --git a/src/components/common/LinkButton.tsx b/src/components/common/LinkButton.tsx index 251f7762..682970e8 100644 --- a/src/components/common/LinkButton.tsx +++ b/src/components/common/LinkButton.tsx @@ -1,6 +1,6 @@ -import { ReactNode } from 'react'; +import { Button, type ButtonProps } from '@umami/react-zen'; import Link from 'next/link'; -import { Button, ButtonProps } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { useLocale } from '@/components/hooks'; export interface LinkButtonProps extends ButtonProps { diff --git a/src/components/common/LoadingPanel.tsx b/src/components/common/LoadingPanel.tsx index c781bd90..fb37e140 100644 --- a/src/components/common/LoadingPanel.tsx +++ b/src/components/common/LoadingPanel.tsx @@ -1,7 +1,7 @@ -import { ReactNode } from 'react'; -import { Loading, Column, type ColumnProps } from '@umami/react-zen'; -import { ErrorMessage } from '@/components/common/ErrorMessage'; +import { Column, type ColumnProps, Loading } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { Empty } from '@/components/common/Empty'; +import { ErrorMessage } from '@/components/common/ErrorMessage'; export interface LoadingPanelProps extends ColumnProps { data?: any; diff --git a/src/components/common/PageBody.tsx b/src/components/common/PageBody.tsx index a05224f0..f07e589b 100644 --- a/src/components/common/PageBody.tsx +++ b/src/components/common/PageBody.tsx @@ -1,6 +1,6 @@ 'use client'; -import { ReactNode } from 'react'; -import { AlertBanner, Loading, Column, ColumnProps } from '@umami/react-zen'; +import { AlertBanner, Column, type ColumnProps, Loading } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { useMessages } from '@/components/hooks'; const DEFAULT_WIDTH = '1320px'; diff --git a/src/components/common/PageHeader.tsx b/src/components/common/PageHeader.tsx index 12b1a644..b4605150 100644 --- a/src/components/common/PageHeader.tsx +++ b/src/components/common/PageHeader.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { Heading, Icon, Row, Text, Column, Grid } from '@umami/react-zen'; +import { Column, Grid, Heading, Icon, Row, Text } from '@umami/react-zen'; +import type { ReactNode } from 'react'; export function PageHeader({ title, diff --git a/src/components/common/Panel.tsx b/src/components/common/Panel.tsx index da901d41..bb667465 100644 --- a/src/components/common/Panel.tsx +++ b/src/components/common/Panel.tsx @@ -1,16 +1,16 @@ -import { useState } from 'react'; import { + Button, Column, type ColumnProps, - Row, - Icon, - Button, - TooltipTrigger, - Tooltip, Heading, + Icon, + Row, + Tooltip, + TooltipTrigger, } from '@umami/react-zen'; -import { Maximize, X } from '@/components/icons'; +import { useState } from 'react'; import { useMessages } from '@/components/hooks'; +import { Maximize, X } from '@/components/icons'; export interface PanelProps extends ColumnProps { title?: string; diff --git a/src/components/common/SectionHeader.tsx b/src/components/common/SectionHeader.tsx index baaaa8b9..5b911efb 100644 --- a/src/components/common/SectionHeader.tsx +++ b/src/components/common/SectionHeader.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { Heading, Icon, Row, Text, RowProps } from '@umami/react-zen'; +import { Heading, Icon, Row, type RowProps, Text } from '@umami/react-zen'; +import type { ReactNode } from 'react'; export function SectionHeader({ title, diff --git a/src/components/common/SideMenu.tsx b/src/components/common/SideMenu.tsx index 429ec336..bdd24952 100644 --- a/src/components/common/SideMenu.tsx +++ b/src/components/common/SideMenu.tsx @@ -1,12 +1,12 @@ import { - Heading, - NavMenu, - NavMenuItem, - Row, Column, - NavMenuGroup, - NavMenuProps, + Heading, IconLabel, + NavMenu, + NavMenuGroup, + NavMenuItem, + type NavMenuProps, + Row, } from '@umami/react-zen'; import Link from 'next/link'; @@ -72,6 +72,7 @@ export function SideMenu({ ); } + return null; })} diff --git a/src/components/common/TypeConfirmationForm.tsx b/src/components/common/TypeConfirmationForm.tsx index a28dd3c1..1121fa7d 100644 --- a/src/components/common/TypeConfirmationForm.tsx +++ b/src/components/common/TypeConfirmationForm.tsx @@ -3,8 +3,8 @@ import { Form, FormButtons, FormField, - TextField, FormSubmitButton, + TextField, } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; diff --git a/src/components/common/TypeIcon.tsx b/src/components/common/TypeIcon.tsx index af2ce5d8..8894b3a9 100644 --- a/src/components/common/TypeIcon.tsx +++ b/src/components/common/TypeIcon.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; import { Row } from '@umami/react-zen'; +import type { ReactNode } from 'react'; export function TypeIcon({ type, diff --git a/src/components/hooks/context/useLink.ts b/src/components/hooks/context/useLink.ts index 765b9f59..8766bbb6 100644 --- a/src/components/hooks/context/useLink.ts +++ b/src/components/hooks/context/useLink.ts @@ -1,5 +1,5 @@ -import { LinkContext } from '@/app/(main)/links/LinkProvider'; import { useContext } from 'react'; +import { LinkContext } from '@/app/(main)/links/LinkProvider'; export function useLink() { return useContext(LinkContext); diff --git a/src/components/hooks/context/usePixel.ts b/src/components/hooks/context/usePixel.ts index bb129c31..69cad6f5 100644 --- a/src/components/hooks/context/usePixel.ts +++ b/src/components/hooks/context/usePixel.ts @@ -1,5 +1,5 @@ -import { PixelContext } from '@/app/(main)/pixels/PixelProvider'; import { useContext } from 'react'; +import { PixelContext } from '@/app/(main)/pixels/PixelProvider'; export function usePixel() { return useContext(PixelContext); diff --git a/src/components/hooks/context/useTeam.ts b/src/components/hooks/context/useTeam.ts index 11b23daf..95ff4bee 100644 --- a/src/components/hooks/context/useTeam.ts +++ b/src/components/hooks/context/useTeam.ts @@ -1,5 +1,5 @@ -import { TeamContext } from '@/app/(main)/teams/TeamProvider'; import { useContext } from 'react'; +import { TeamContext } from '@/app/(main)/teams/TeamProvider'; export function useTeam() { return useContext(TeamContext); diff --git a/src/components/hooks/context/useUser.ts b/src/components/hooks/context/useUser.ts index dfdf67f1..fa97ea9d 100644 --- a/src/components/hooks/context/useUser.ts +++ b/src/components/hooks/context/useUser.ts @@ -1,5 +1,5 @@ -import { UserContext } from '@/app/(main)/admin/users/[userId]/UserProvider'; import { useContext } from 'react'; +import { UserContext } from '@/app/(main)/admin/users/[userId]/UserProvider'; export function useUser() { return useContext(UserContext); diff --git a/src/components/hooks/context/useWebsite.ts b/src/components/hooks/context/useWebsite.ts index eb731875..3d4be27f 100644 --- a/src/components/hooks/context/useWebsite.ts +++ b/src/components/hooks/context/useWebsite.ts @@ -1,5 +1,5 @@ -import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider'; import { useContext } from 'react'; +import { WebsiteContext } from '@/app/(main)/websites/WebsiteProvider'; export function useWebsite() { return useContext(WebsiteContext); diff --git a/src/components/hooks/index.ts b/src/components/hooks/index.ts index 04c3e37d..e8e5c135 100644 --- a/src/components/hooks/index.ts +++ b/src/components/hooks/index.ts @@ -31,13 +31,13 @@ export * from './queries/useSessionDataValuesQuery'; export * from './queries/useShareTokenQuery'; export * from './queries/useTeamMembersQuery'; export * from './queries/useTeamQuery'; -export * from './queries/useTeamWebsitesQuery'; export * from './queries/useTeamsQuery'; +export * from './queries/useTeamWebsitesQuery'; export * from './queries/useUpdateQuery'; export * from './queries/useUserQuery'; +export * from './queries/useUsersQuery'; export * from './queries/useUserTeamsQuery'; export * from './queries/useUserWebsitesQuery'; -export * from './queries/useUsersQuery'; export * from './queries/useWebsiteCohortQuery'; export * from './queries/useWebsiteCohortsQuery'; export * from './queries/useWebsiteEventsQuery'; @@ -51,10 +51,10 @@ export * from './queries/useWebsiteSegmentsQuery'; export * from './queries/useWebsiteSessionQuery'; export * from './queries/useWebsiteSessionStatsQuery'; export * from './queries/useWebsiteSessionsQuery'; -export * from './queries/useWeeklyTrafficQuery'; export * from './queries/useWebsiteStatsQuery'; -export * from './queries/useWebsiteValuesQuery'; export * from './queries/useWebsitesQuery'; +export * from './queries/useWebsiteValuesQuery'; +export * from './queries/useWeeklyTrafficQuery'; // Regular hooks export * from './useApi'; diff --git a/src/components/hooks/queries/useActiveUsersQuery.ts b/src/components/hooks/queries/useActiveUsersQuery.ts index d0538dc7..42867c19 100644 --- a/src/components/hooks/queries/useActiveUsersQuery.ts +++ b/src/components/hooks/queries/useActiveUsersQuery.ts @@ -1,5 +1,5 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { ReactQueryOptions } from '@/lib/types'; export function useActyiveUsersQuery(websiteId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useDateRangeQuery.ts b/src/components/hooks/queries/useDateRangeQuery.ts index 32b5cd46..84b7eec7 100644 --- a/src/components/hooks/queries/useDateRangeQuery.ts +++ b/src/components/hooks/queries/useDateRangeQuery.ts @@ -1,5 +1,5 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { ReactQueryOptions } from '@/lib/types'; type DateRange = { startDate?: string; diff --git a/src/components/hooks/queries/useEventDataEventsQuery.ts b/src/components/hooks/queries/useEventDataEventsQuery.ts index 26a825e3..1401989f 100644 --- a/src/components/hooks/queries/useEventDataEventsQuery.ts +++ b/src/components/hooks/queries/useEventDataEventsQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; -import { ReactQueryOptions } from '@/lib/types'; +import { useFilterParameters } from '../useFilterParameters'; export function useEventDataEventsQuery(websiteId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useEventDataPropertiesQuery.ts b/src/components/hooks/queries/useEventDataPropertiesQuery.ts index 74dd58ef..dfa6e929 100644 --- a/src/components/hooks/queries/useEventDataPropertiesQuery.ts +++ b/src/components/hooks/queries/useEventDataPropertiesQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; -import { ReactQueryOptions } from '@/lib/types'; +import { useFilterParameters } from '../useFilterParameters'; export function useEventDataPropertiesQuery(websiteId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useEventDataQuery.ts b/src/components/hooks/queries/useEventDataQuery.ts index 5e21081a..2ccbd634 100644 --- a/src/components/hooks/queries/useEventDataQuery.ts +++ b/src/components/hooks/queries/useEventDataQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; -import { ReactQueryOptions } from '@/lib/types'; +import { useFilterParameters } from '../useFilterParameters'; export function useEventDataQuery(websiteId: string, eventId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useEventDataValuesQuery.ts b/src/components/hooks/queries/useEventDataValuesQuery.ts index 18bb6b2e..6529e142 100644 --- a/src/components/hooks/queries/useEventDataValuesQuery.ts +++ b/src/components/hooks/queries/useEventDataValuesQuery.ts @@ -1,4 +1,4 @@ -import { ReactQueryOptions } from '@/lib/types'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useDateParameters } from '../useDateParameters'; import { useFilterParameters } from '../useFilterParameters'; diff --git a/src/components/hooks/queries/useLinksQuery.ts b/src/components/hooks/queries/useLinksQuery.ts index 93de47dc..ebf945fb 100644 --- a/src/components/hooks/queries/useLinksQuery.ts +++ b/src/components/hooks/queries/useLinksQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { usePagedQuery } from '../usePagedQuery'; import { useModified } from '../useModified'; -import { ReactQueryOptions } from '@/lib/types'; +import { usePagedQuery } from '../usePagedQuery'; export function useLinksQuery({ teamId }: { teamId?: string }, options?: ReactQueryOptions) { const { modified } = useModified('links'); diff --git a/src/components/hooks/queries/useLoginQuery.ts b/src/components/hooks/queries/useLoginQuery.ts index e800621a..a64b7844 100644 --- a/src/components/hooks/queries/useLoginQuery.ts +++ b/src/components/hooks/queries/useLoginQuery.ts @@ -1,4 +1,4 @@ -import { useApp, setUser } from '@/store/app'; +import { setUser, useApp } from '@/store/app'; import { useApi } from '../useApi'; const selector = (state: { user: any }) => state.user; diff --git a/src/components/hooks/queries/usePixelsQuery.ts b/src/components/hooks/queries/usePixelsQuery.ts index 466b13d0..c431179b 100644 --- a/src/components/hooks/queries/usePixelsQuery.ts +++ b/src/components/hooks/queries/usePixelsQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { usePagedQuery } from '../usePagedQuery'; import { useModified } from '../useModified'; -import { ReactQueryOptions } from '@/lib/types'; +import { usePagedQuery } from '../usePagedQuery'; export function usePixelsQuery({ teamId }: { teamId?: string }, options?: ReactQueryOptions) { const { modified } = useModified('pixels'); diff --git a/src/components/hooks/queries/useRealtimeQuery.ts b/src/components/hooks/queries/useRealtimeQuery.ts index 9e20da04..1a5bd1c5 100644 --- a/src/components/hooks/queries/useRealtimeQuery.ts +++ b/src/components/hooks/queries/useRealtimeQuery.ts @@ -1,6 +1,6 @@ import { REALTIME_INTERVAL } from '@/lib/constants'; +import type { RealtimeData } from '@/lib/types'; import { useApi } from '../useApi'; -import { RealtimeData } from '@/lib/types'; export function useRealtimeQuery(websiteId: string) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useReportsQuery.ts b/src/components/hooks/queries/useReportsQuery.ts index fed15014..ba1bdd4d 100644 --- a/src/components/hooks/queries/useReportsQuery.ts +++ b/src/components/hooks/queries/useReportsQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { usePagedQuery } from '../usePagedQuery'; import { useModified } from '../useModified'; -import { ReactQueryOptions } from '@/lib/types'; +import { usePagedQuery } from '../usePagedQuery'; export function useReportsQuery( { websiteId, type }: { websiteId: string; type?: string }, diff --git a/src/components/hooks/queries/useResultQuery.ts b/src/components/hooks/queries/useResultQuery.ts index 7b7a7bd1..c6fce128 100644 --- a/src/components/hooks/queries/useResultQuery.ts +++ b/src/components/hooks/queries/useResultQuery.ts @@ -1,7 +1,7 @@ +import { useDateParameters } from '@/components/hooks/useDateParameters'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useFilterParameters } from '../useFilterParameters'; -import { ReactQueryOptions } from '@/lib/types'; -import { useDateParameters } from '@/components/hooks/useDateParameters'; export function useResultQuery( type: string, diff --git a/src/components/hooks/queries/useSessionDataPropertiesQuery.ts b/src/components/hooks/queries/useSessionDataPropertiesQuery.ts index 975c728a..ac651bb9 100644 --- a/src/components/hooks/queries/useSessionDataPropertiesQuery.ts +++ b/src/components/hooks/queries/useSessionDataPropertiesQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; -import { ReactQueryOptions } from '@/lib/types'; +import { useFilterParameters } from '../useFilterParameters'; export function useSessionDataPropertiesQuery(websiteId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useSessionDataValuesQuery.ts b/src/components/hooks/queries/useSessionDataValuesQuery.ts index 7df35938..d5e180bb 100644 --- a/src/components/hooks/queries/useSessionDataValuesQuery.ts +++ b/src/components/hooks/queries/useSessionDataValuesQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; -import { ReactQueryOptions } from '@/lib/types'; +import { useFilterParameters } from '../useFilterParameters'; export function useSessionDataValuesQuery( websiteId: string, diff --git a/src/components/hooks/queries/useShareTokenQuery.ts b/src/components/hooks/queries/useShareTokenQuery.ts index 122dc484..dbad3dcd 100644 --- a/src/components/hooks/queries/useShareTokenQuery.ts +++ b/src/components/hooks/queries/useShareTokenQuery.ts @@ -1,4 +1,4 @@ -import { useApp, setShareToken } from '@/store/app'; +import { setShareToken, useApp } from '@/store/app'; import { useApi } from '../useApi'; const selector = (state: { shareToken: string }) => state.shareToken; diff --git a/src/components/hooks/queries/useTeamMembersQuery.ts b/src/components/hooks/queries/useTeamMembersQuery.ts index 87956ed0..6f6f815c 100644 --- a/src/components/hooks/queries/useTeamMembersQuery.ts +++ b/src/components/hooks/queries/useTeamMembersQuery.ts @@ -1,6 +1,6 @@ import { useApi } from '../useApi'; -import { usePagedQuery } from '../usePagedQuery'; import { useModified } from '../useModified'; +import { usePagedQuery } from '../usePagedQuery'; export function useTeamMembersQuery(teamId: string) { const { get } = useApi(); diff --git a/src/components/hooks/queries/useTeamQuery.ts b/src/components/hooks/queries/useTeamQuery.ts index 1ba1a6ea..c076a6aa 100644 --- a/src/components/hooks/queries/useTeamQuery.ts +++ b/src/components/hooks/queries/useTeamQuery.ts @@ -1,7 +1,7 @@ +import { keepPreviousData } from '@tanstack/react-query'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; -import { keepPreviousData } from '@tanstack/react-query'; -import { ReactQueryOptions } from '@/lib/types'; export function useTeamQuery(teamId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useTeamWebsitesQuery.ts b/src/components/hooks/queries/useTeamWebsitesQuery.ts index 892cc848..ffe601bf 100644 --- a/src/components/hooks/queries/useTeamWebsitesQuery.ts +++ b/src/components/hooks/queries/useTeamWebsitesQuery.ts @@ -1,6 +1,6 @@ import { useApi } from '../useApi'; -import { usePagedQuery } from '../usePagedQuery'; import { useModified } from '../useModified'; +import { usePagedQuery } from '../usePagedQuery'; export function useTeamWebsitesQuery(teamId: string) { const { get } = useApi(); diff --git a/src/components/hooks/queries/useTeamsQuery.ts b/src/components/hooks/queries/useTeamsQuery.ts index 6a0ecc34..f1a09f4d 100644 --- a/src/components/hooks/queries/useTeamsQuery.ts +++ b/src/components/hooks/queries/useTeamsQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; import { usePagedQuery } from '../usePagedQuery'; -import { ReactQueryOptions } from '@/lib/types'; export function useTeamsQuery(params?: Record, options?: ReactQueryOptions) { const { get } = useApi(); diff --git a/src/components/hooks/queries/useUserQuery.ts b/src/components/hooks/queries/useUserQuery.ts index 2f3a15ca..07e23f08 100644 --- a/src/components/hooks/queries/useUserQuery.ts +++ b/src/components/hooks/queries/useUserQuery.ts @@ -1,7 +1,7 @@ +import { keepPreviousData } from '@tanstack/react-query'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; -import { keepPreviousData } from '@tanstack/react-query'; -import { ReactQueryOptions } from '@/lib/types'; export function useUserQuery(userId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useUserWebsitesQuery.ts b/src/components/hooks/queries/useUserWebsitesQuery.ts index c6312700..f98eaffb 100644 --- a/src/components/hooks/queries/useUserWebsitesQuery.ts +++ b/src/components/hooks/queries/useUserWebsitesQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { usePagedQuery } from '../usePagedQuery'; import { useModified } from '../useModified'; -import { ReactQueryOptions } from '@/lib/types'; +import { usePagedQuery } from '../usePagedQuery'; export function useUserWebsitesQuery( { userId, teamId }: { userId?: string; teamId?: string }, diff --git a/src/components/hooks/queries/useUsersQuery.ts b/src/components/hooks/queries/useUsersQuery.ts index 03e66ce0..d87900ba 100644 --- a/src/components/hooks/queries/useUsersQuery.ts +++ b/src/components/hooks/queries/useUsersQuery.ts @@ -1,6 +1,6 @@ import { useApi } from '../useApi'; -import { usePagedQuery } from '../usePagedQuery'; import { useModified } from '../useModified'; +import { usePagedQuery } from '../usePagedQuery'; export function useUsersQuery() { const { get } = useApi(); diff --git a/src/components/hooks/queries/useWebsiteCohortQuery.ts b/src/components/hooks/queries/useWebsiteCohortQuery.ts index 50ac76b3..975766e9 100644 --- a/src/components/hooks/queries/useWebsiteCohortQuery.ts +++ b/src/components/hooks/queries/useWebsiteCohortQuery.ts @@ -1,7 +1,7 @@ +import { keepPreviousData } from '@tanstack/react-query'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; -import { keepPreviousData } from '@tanstack/react-query'; -import { ReactQueryOptions } from '@/lib/types'; export function useWebsiteCohortQuery( websiteId: string, diff --git a/src/components/hooks/queries/useWebsiteCohortsQuery.ts b/src/components/hooks/queries/useWebsiteCohortsQuery.ts index d1032fa2..e0cbf4ce 100644 --- a/src/components/hooks/queries/useWebsiteCohortsQuery.ts +++ b/src/components/hooks/queries/useWebsiteCohortsQuery.ts @@ -1,8 +1,8 @@ +import { keepPreviousData } from '@tanstack/react-query'; +import { useFilterParameters } from '@/components/hooks/useFilterParameters'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; -import { keepPreviousData } from '@tanstack/react-query'; -import { ReactQueryOptions } from '@/lib/types'; -import { useFilterParameters } from '@/components/hooks/useFilterParameters'; export function useWebsiteCohortsQuery( websiteId: string, diff --git a/src/components/hooks/queries/useWebsiteEventsQuery.ts b/src/components/hooks/queries/useWebsiteEventsQuery.ts index 9d89be52..fc4dad5b 100644 --- a/src/components/hooks/queries/useWebsiteEventsQuery.ts +++ b/src/components/hooks/queries/useWebsiteEventsQuery.ts @@ -1,8 +1,8 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; +import { useFilterParameters } from '../useFilterParameters'; import { usePagedQuery } from '../usePagedQuery'; -import { ReactQueryOptions } from '@/lib/types'; const EVENT_TYPES = { views: 1, diff --git a/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts b/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts index 5db85278..6c1d112d 100644 --- a/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts +++ b/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; -import { ReactQueryOptions } from '@/lib/types'; +import { useFilterParameters } from '../useFilterParameters'; export function useWebsiteEventsSeriesQuery(websiteId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts b/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts index 89f95ada..b2e90199 100644 --- a/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts +++ b/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts @@ -1,8 +1,8 @@ import { keepPreviousData } from '@tanstack/react-query'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; -import { ReactQueryOptions } from '@/lib/types'; +import { useFilterParameters } from '../useFilterParameters'; export type WebsiteExpandedMetricsData = { name: string; diff --git a/src/components/hooks/queries/useWebsiteMetricsQuery.ts b/src/components/hooks/queries/useWebsiteMetricsQuery.ts index a5ec7ac9..67c5e4d4 100644 --- a/src/components/hooks/queries/useWebsiteMetricsQuery.ts +++ b/src/components/hooks/queries/useWebsiteMetricsQuery.ts @@ -1,5 +1,5 @@ -import { ReactQueryOptions } from '@/lib/types'; import { keepPreviousData } from '@tanstack/react-query'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useDateParameters } from '../useDateParameters'; import { useFilterParameters } from '../useFilterParameters'; diff --git a/src/components/hooks/queries/useWebsitePageviewsQuery.ts b/src/components/hooks/queries/useWebsitePageviewsQuery.ts index 6f471bab..b35c8200 100644 --- a/src/components/hooks/queries/useWebsitePageviewsQuery.ts +++ b/src/components/hooks/queries/useWebsitePageviewsQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; -import { ReactQueryOptions } from '@/lib/types'; +import { useFilterParameters } from '../useFilterParameters'; export interface WebsitePageviewsData { pageviews: { x: string; y: number }[]; diff --git a/src/components/hooks/queries/useWebsiteQuery.ts b/src/components/hooks/queries/useWebsiteQuery.ts index 044b2bac..b9a5533d 100644 --- a/src/components/hooks/queries/useWebsiteQuery.ts +++ b/src/components/hooks/queries/useWebsiteQuery.ts @@ -1,7 +1,7 @@ +import { keepPreviousData } from '@tanstack/react-query'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; -import { keepPreviousData } from '@tanstack/react-query'; -import { ReactQueryOptions } from '@/lib/types'; export function useWebsiteQuery(websiteId: string, options?: ReactQueryOptions) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useWebsiteSegmentQuery.ts b/src/components/hooks/queries/useWebsiteSegmentQuery.ts index 07561622..1923fbd8 100644 --- a/src/components/hooks/queries/useWebsiteSegmentQuery.ts +++ b/src/components/hooks/queries/useWebsiteSegmentQuery.ts @@ -1,7 +1,7 @@ +import { keepPreviousData } from '@tanstack/react-query'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; -import { keepPreviousData } from '@tanstack/react-query'; -import { ReactQueryOptions } from '@/lib/types'; export function useWebsiteSegmentQuery( websiteId: string, diff --git a/src/components/hooks/queries/useWebsiteSegmentsQuery.ts b/src/components/hooks/queries/useWebsiteSegmentsQuery.ts index 1da72fc2..8d3af963 100644 --- a/src/components/hooks/queries/useWebsiteSegmentsQuery.ts +++ b/src/components/hooks/queries/useWebsiteSegmentsQuery.ts @@ -1,8 +1,8 @@ +import { keepPreviousData } from '@tanstack/react-query'; +import { useFilterParameters } from '@/components/hooks/useFilterParameters'; +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; -import { keepPreviousData } from '@tanstack/react-query'; -import { ReactQueryOptions } from '@/lib/types'; -import { useFilterParameters } from '@/components/hooks/useFilterParameters'; export function useWebsiteSegmentsQuery( websiteId: string, diff --git a/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts b/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts index 82a7c05f..bac9fc90 100644 --- a/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts +++ b/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts @@ -1,6 +1,6 @@ import { useApi } from '../useApi'; -import { useFilterParameters } from '../useFilterParameters'; import { useDateParameters } from '../useDateParameters'; +import { useFilterParameters } from '../useFilterParameters'; export function useWebsiteSessionStatsQuery(websiteId: string, options?: Record) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/queries/useWebsiteStatsQuery.ts b/src/components/hooks/queries/useWebsiteStatsQuery.ts index 64304b1b..e9a0c48c 100644 --- a/src/components/hooks/queries/useWebsiteStatsQuery.ts +++ b/src/components/hooks/queries/useWebsiteStatsQuery.ts @@ -1,7 +1,7 @@ -import { UseQueryOptions } from '@tanstack/react-query'; +import type { UseQueryOptions } from '@tanstack/react-query'; +import { useDateParameters } from '@/components/hooks/useDateParameters'; import { useApi } from '../useApi'; import { useFilterParameters } from '../useFilterParameters'; -import { useDateParameters } from '@/components/hooks/useDateParameters'; export interface WebsiteStatsData { pageviews: number; diff --git a/src/components/hooks/queries/useWebsiteValuesQuery.ts b/src/components/hooks/queries/useWebsiteValuesQuery.ts index 7320e08c..1e097369 100644 --- a/src/components/hooks/queries/useWebsiteValuesQuery.ts +++ b/src/components/hooks/queries/useWebsiteValuesQuery.ts @@ -1,6 +1,6 @@ -import { useApi } from '../useApi'; import { useCountryNames } from '@/components/hooks/useCountryNames'; import { useRegionNames } from '@/components/hooks/useRegionNames'; +import { useApi } from '../useApi'; import { useLocale } from '../useLocale'; export function useWebsiteValuesQuery({ diff --git a/src/components/hooks/queries/useWebsitesQuery.ts b/src/components/hooks/queries/useWebsitesQuery.ts index 819b42a9..a7b66186 100644 --- a/src/components/hooks/queries/useWebsitesQuery.ts +++ b/src/components/hooks/queries/useWebsitesQuery.ts @@ -1,7 +1,7 @@ +import type { ReactQueryOptions } from '@/lib/types'; import { useApi } from '../useApi'; -import { usePagedQuery } from '../usePagedQuery'; import { useModified } from '../useModified'; -import { ReactQueryOptions } from '@/lib/types'; +import { usePagedQuery } from '../usePagedQuery'; export function useWebsitesQuery(params?: Record, options?: ReactQueryOptions) { const { get } = useApi(); diff --git a/src/components/hooks/queries/useWeeklyTrafficQuery.ts b/src/components/hooks/queries/useWeeklyTrafficQuery.ts index 27334738..a76ebb3d 100644 --- a/src/components/hooks/queries/useWeeklyTrafficQuery.ts +++ b/src/components/hooks/queries/useWeeklyTrafficQuery.ts @@ -1,7 +1,7 @@ -import { useApi } from '../useApi'; -import { useModified } from '../useModified'; -import { useDateParameters } from '../useDateParameters'; import { useFilterParameters } from '@/components/hooks/useFilterParameters'; +import { useApi } from '../useApi'; +import { useDateParameters } from '../useDateParameters'; +import { useModified } from '../useModified'; export function useWeeklyTrafficQuery(websiteId: string, params?: Record) { const { get, useQuery } = useApi(); diff --git a/src/components/hooks/useApi.ts b/src/components/hooks/useApi.ts index 994163ad..35cabd52 100644 --- a/src/components/hooks/useApi.ts +++ b/src/components/hooks/useApi.ts @@ -1,8 +1,8 @@ +import { useMutation, useQuery } from '@tanstack/react-query'; import { useCallback } from 'react'; -import { useQuery, useMutation } from '@tanstack/react-query'; import { getClientAuthToken } from '@/lib/client'; import { SHARE_TOKEN_HEADER } from '@/lib/constants'; -import { httpGet, httpPost, httpPut, httpDelete, FetchResponse } from '@/lib/fetch'; +import { type FetchResponse, httpDelete, httpGet, httpPost, httpPut } from '@/lib/fetch'; import { useApp } from '@/store/app'; const selector = (state: { shareToken: { token?: string } }) => state.shareToken; diff --git a/src/components/hooks/useConfig.ts b/src/components/hooks/useConfig.ts index 643b9cbc..c1cdcaf6 100644 --- a/src/components/hooks/useConfig.ts +++ b/src/components/hooks/useConfig.ts @@ -1,6 +1,6 @@ import { useEffect } from 'react'; -import { useApp, setConfig } from '@/store/app'; import { useApi } from '@/components/hooks/useApi'; +import { setConfig, useApp } from '@/store/app'; export type Config = { cloudMode: boolean; diff --git a/src/components/hooks/useCountryNames.ts b/src/components/hooks/useCountryNames.ts index 45019ebf..1ec9fc13 100644 --- a/src/components/hooks/useCountryNames.ts +++ b/src/components/hooks/useCountryNames.ts @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { httpGet } from '@/lib/fetch'; import enUS from '../../../public/intl/country/en-US.json'; diff --git a/src/components/hooks/useDateRange.ts b/src/components/hooks/useDateRange.ts index 7d388433..755f36ee 100644 --- a/src/components/hooks/useDateRange.ts +++ b/src/components/hooks/useDateRange.ts @@ -1,8 +1,8 @@ -import { useNavigation } from '@/components/hooks/useNavigation'; import { useMemo } from 'react'; -import { getCompareDate, getOffsetDateRange, parseDateRange } from '@/lib/date'; import { useLocale } from '@/components/hooks/useLocale'; +import { useNavigation } from '@/components/hooks/useNavigation'; import { DATE_RANGE_CONFIG, DEFAULT_DATE_RANGE_VALUE } from '@/lib/constants'; +import { getCompareDate, getOffsetDateRange, parseDateRange } from '@/lib/date'; import { getItem } from '@/lib/storage'; export function useDateRange(options: { ignoreOffset?: boolean; timezone?: string } = {}) { diff --git a/src/components/hooks/useEscapeKey.ts b/src/components/hooks/useEscapeKey.ts index f05ad769..cc1d3089 100644 --- a/src/components/hooks/useEscapeKey.ts +++ b/src/components/hooks/useEscapeKey.ts @@ -1,4 +1,4 @@ -import { useEffect, useCallback, KeyboardEvent } from 'react'; +import { type KeyboardEvent, useCallback, useEffect } from 'react'; export function useEscapeKey(handler: (event: KeyboardEvent) => void) { const escFunction = useCallback((event: KeyboardEvent) => { diff --git a/src/components/hooks/useFilters.ts b/src/components/hooks/useFilters.ts index 6115c1bf..850e2afb 100644 --- a/src/components/hooks/useFilters.ts +++ b/src/components/hooks/useFilters.ts @@ -1,8 +1,8 @@ import { FILTER_COLUMNS, OPERATORS } from '@/lib/constants'; import { safeDecodeURIComponent } from '@/lib/url'; +import { useFields } from './useFields'; import { useMessages } from './useMessages'; import { useNavigation } from './useNavigation'; -import { useFields } from './useFields'; export function useFilters() { const { formatMessage, labels } = useMessages(); diff --git a/src/components/hooks/useFormat.ts b/src/components/hooks/useFormat.ts index 039959cd..896fa076 100644 --- a/src/components/hooks/useFormat.ts +++ b/src/components/hooks/useFormat.ts @@ -1,9 +1,9 @@ -import { useMessages } from './useMessages'; import { BROWSERS, OS_NAMES } from '@/lib/constants'; -import { useLocale } from './useLocale'; +import regions from '../../../public/iso-3166-2.json'; import { useCountryNames } from './useCountryNames'; import { useLanguageNames } from './useLanguageNames'; -import regions from '../../../public/iso-3166-2.json'; +import { useLocale } from './useLocale'; +import { useMessages } from './useMessages'; export function useFormat() { const { formatMessage, labels } = useMessages(); diff --git a/src/components/hooks/useLanguageNames.ts b/src/components/hooks/useLanguageNames.ts index 6b79ac52..0cc03d7c 100644 --- a/src/components/hooks/useLanguageNames.ts +++ b/src/components/hooks/useLanguageNames.ts @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { httpGet } from '@/lib/fetch'; import enUS from '../../../public/intl/language/en-US.json'; diff --git a/src/components/hooks/useLocale.ts b/src/components/hooks/useLocale.ts index 8d96fdde..3eb669e1 100644 --- a/src/components/hooks/useLocale.ts +++ b/src/components/hooks/useLocale.ts @@ -1,11 +1,11 @@ import { useEffect } from 'react'; -import { httpGet } from '@/lib/fetch'; -import { setItem } from '@/lib/storage'; import { LOCALE_CONFIG } from '@/lib/constants'; +import { httpGet } from '@/lib/fetch'; import { getDateLocale, getTextDirection } from '@/lib/lang'; -import { useApp, setLocale } from '@/store/app'; -import { useForceUpdate } from './useForceUpdate'; +import { setItem } from '@/lib/storage'; +import { setLocale, useApp } from '@/store/app'; import enUS from '../../../public/intl/country/en-US.json'; +import { useForceUpdate } from './useForceUpdate'; const messages = { 'en-US': enUS, diff --git a/src/components/hooks/useMessages.ts b/src/components/hooks/useMessages.ts index 42bbeb01..19f12d9a 100644 --- a/src/components/hooks/useMessages.ts +++ b/src/components/hooks/useMessages.ts @@ -1,5 +1,5 @@ -import { useIntl, FormattedMessage, type MessageDescriptor } from 'react-intl'; -import { messages, labels } from '@/components/messages'; +import { FormattedMessage, type MessageDescriptor, useIntl } from 'react-intl'; +import { labels, messages } from '@/components/messages'; type FormatMessage = ( descriptor: MessageDescriptor, @@ -30,9 +30,9 @@ export function useMessages(): UseMessages { return undefined; } - const code = error?.['code']; + const code = error?.code; - return code ? getMessage(code) : error?.['message'] || 'Unknown error'; + return code ? getMessage(code) : error?.message || 'Unknown error'; }; const formatMessage = ( diff --git a/src/components/hooks/useNavigation.ts b/src/components/hooks/useNavigation.ts index 1b725060..0a18ac7b 100644 --- a/src/components/hooks/useNavigation.ts +++ b/src/components/hooks/useNavigation.ts @@ -1,5 +1,5 @@ -import { useState, useEffect } from 'react'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; +import { useEffect, useState } from 'react'; import { buildPath } from '@/lib/url'; export function useNavigation() { diff --git a/src/components/hooks/usePagedQuery.ts b/src/components/hooks/usePagedQuery.ts index 726c7b22..c818de64 100644 --- a/src/components/hooks/usePagedQuery.ts +++ b/src/components/hooks/usePagedQuery.ts @@ -1,7 +1,7 @@ -import { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; +import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; +import type { PageResult } from '@/lib/types'; import { useApi } from './useApi'; import { useNavigation } from './useNavigation'; -import { PageResult } from '@/lib/types'; export function usePagedQuery({ queryKey, diff --git a/src/components/hooks/useRegionNames.ts b/src/components/hooks/useRegionNames.ts index 746bd97e..57dcc416 100644 --- a/src/components/hooks/useRegionNames.ts +++ b/src/components/hooks/useRegionNames.ts @@ -1,5 +1,5 @@ -import { useCountryNames } from './useCountryNames'; import regions from '../../../public/iso-3166-2.json'; +import { useCountryNames } from './useCountryNames'; export function useRegionNames(locale: string) { const { countryNames } = useCountryNames(locale); diff --git a/src/components/hooks/useSticky.ts b/src/components/hooks/useSticky.ts index 8e6722ad..ef9fb36f 100644 --- a/src/components/hooks/useSticky.ts +++ b/src/components/hooks/useSticky.ts @@ -1,4 +1,4 @@ -import { useState, useEffect, useRef } from 'react'; +import { useEffect, useRef, useState } from 'react'; export function useSticky({ enabled = true, threshold = 1 }) { const [isSticky, setIsSticky] = useState(false); diff --git a/src/components/hooks/useTimezone.ts b/src/components/hooks/useTimezone.ts index 22a34194..ef255390 100644 --- a/src/components/hooks/useTimezone.ts +++ b/src/components/hooks/useTimezone.ts @@ -1,9 +1,9 @@ -import { setItem } from '@/lib/storage'; +import { formatInTimeZone, utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz'; import { TIMEZONE_CONFIG, TIMEZONE_LEGACY } from '@/lib/constants'; -import { formatInTimeZone, zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz'; -import { useApp, setTimezone } from '@/store/app'; -import { useLocale } from './useLocale'; import { getTimezone } from '@/lib/date'; +import { setItem } from '@/lib/storage'; +import { setTimezone, useApp } from '@/store/app'; +import { useLocale } from './useLocale'; const selector = (state: { timezone: string }) => state.timezone; @@ -21,7 +21,7 @@ export function useTimezone() { return formatInTimeZone( /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{3})?Z$/.test(date) ? date - : date.split(' ').join('T') + 'Z', + : `${date.split(' ').join('T')}Z`, timezone, pattern, { locale: dateLocale }, diff --git a/src/components/input/ActionSelect.tsx b/src/components/input/ActionSelect.tsx index 3de118d2..616ee347 100644 --- a/src/components/input/ActionSelect.tsx +++ b/src/components/input/ActionSelect.tsx @@ -1,4 +1,4 @@ -import { Select, ListItem } from '@umami/react-zen'; +import { ListItem, Select } from '@umami/react-zen'; import { useMessages } from '@/components/hooks'; export interface ActionSelectProps { diff --git a/src/components/input/CurrencySelect.tsx b/src/components/input/CurrencySelect.tsx index be0cec7d..2b6045b4 100644 --- a/src/components/input/CurrencySelect.tsx +++ b/src/components/input/CurrencySelect.tsx @@ -1,7 +1,7 @@ -import { CURRENCIES } from '@/lib/constants'; import { ListItem, Select } from '@umami/react-zen'; import { useState } from 'react'; import { useMessages } from '@/components/hooks'; +import { CURRENCIES } from '@/lib/constants'; export function CurrencySelect({ value, onChange }) { const { formatMessage, labels } = useMessages(); diff --git a/src/components/input/DateFilter.tsx b/src/components/input/DateFilter.tsx index f72ea281..2e175298 100644 --- a/src/components/input/DateFilter.tsx +++ b/src/components/input/DateFilter.tsx @@ -1,9 +1,9 @@ -import { useState, Key, Fragment } from 'react'; -import { Modal, Select, ListItem, ListSeparator, Dialog, SelectProps } from '@umami/react-zen'; +import { Dialog, ListItem, ListSeparator, Modal, Select, type SelectProps } from '@umami/react-zen'; import { endOfYear } from 'date-fns'; -import { DatePickerForm } from '@/components/metrics/DatePickerForm'; -import { useMessages, useMobile } from '@/components/hooks'; +import { Fragment, type Key, useState } from 'react'; import { DateDisplay } from '@/components/common/DateDisplay'; +import { useMessages, useMobile } from '@/components/hooks'; +import { DatePickerForm } from '@/components/metrics/DatePickerForm'; import { parseDateRange } from '@/lib/date'; export interface DateFilterProps extends SelectProps { diff --git a/src/components/input/DialogButton.tsx b/src/components/input/DialogButton.tsx index a3a49252..7527226d 100644 --- a/src/components/input/DialogButton.tsx +++ b/src/components/input/DialogButton.tsx @@ -1,13 +1,13 @@ -import { CSSProperties, ReactNode } from 'react'; import { Button, - ButtonProps, - Modal, + type ButtonProps, Dialog, + type DialogProps, DialogTrigger, - DialogProps, IconLabel, + Modal, } from '@umami/react-zen'; +import type { CSSProperties, ReactNode } from 'react'; import { useMobile } from '@/components/hooks'; export interface DialogButtonProps extends Omit { diff --git a/src/components/input/DownloadButton.tsx b/src/components/input/DownloadButton.tsx index 9fd46c0b..5df3305d 100644 --- a/src/components/input/DownloadButton.tsx +++ b/src/components/input/DownloadButton.tsx @@ -1,7 +1,7 @@ +import { Button, Icon, Tooltip, TooltipTrigger } from '@umami/react-zen'; import Papa from 'papaparse'; -import { Button, Icon, TooltipTrigger, Tooltip } from '@umami/react-zen'; -import { Download } from '@/components/icons'; import { useMessages } from '@/components/hooks'; +import { Download } from '@/components/icons'; export function DownloadButton({ filename = 'data', diff --git a/src/components/input/ExportButton.tsx b/src/components/input/ExportButton.tsx index 15fb2124..7b65a57b 100644 --- a/src/components/input/ExportButton.tsx +++ b/src/components/input/ExportButton.tsx @@ -1,10 +1,10 @@ -import { useState } from 'react'; -import { Icon, Tooltip, TooltipTrigger, LoadingButton } from '@umami/react-zen'; -import { Download } from '@/components/icons'; -import { useMessages, useApi } from '@/components/hooks'; +import { Icon, LoadingButton, Tooltip, TooltipTrigger } from '@umami/react-zen'; import { useSearchParams } from 'next/navigation'; +import { useState } from 'react'; +import { useApi, useMessages } from '@/components/hooks'; import { useDateParameters } from '@/components/hooks/useDateParameters'; import { useFilterParameters } from '@/components/hooks/useFilterParameters'; +import { Download } from '@/components/icons'; export function ExportButton({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/components/input/FieldFilters.tsx b/src/components/input/FieldFilters.tsx index e61b9cc7..2174068f 100644 --- a/src/components/input/FieldFilters.tsx +++ b/src/components/input/FieldFilters.tsx @@ -1,22 +1,22 @@ -import { Key } from 'react'; -import { subMonths, endOfDay } from 'date-fns'; import { - Grid, + Button, Column, + Grid, + Icon, List, ListItem, - Row, - Button, - Popover, - MenuTrigger, Menu, MenuItem, - Icon, + MenuTrigger, + Popover, + Row, } from '@umami/react-zen'; +import { endOfDay, subMonths } from 'date-fns'; +import type { Key } from 'react'; +import { Empty } from '@/components/common/Empty'; +import { FilterRecord } from '@/components/common/FilterRecord'; import { useFields, useMessages, useMobile } from '@/components/hooks'; import { Plus } from '@/components/icons'; -import { FilterRecord } from '@/components/common/FilterRecord'; -import { Empty } from '@/components/common/Empty'; export interface FieldFiltersProps { websiteId: string; diff --git a/src/components/input/FilterBar.tsx b/src/components/input/FilterBar.tsx index b81f77e3..5a52e566 100644 --- a/src/components/input/FilterBar.tsx +++ b/src/components/input/FilterBar.tsx @@ -1,24 +1,24 @@ import { Button, - Icon, - Text, - Row, - TooltipTrigger, - Tooltip, - Modal, Dialog, DialogTrigger, + Icon, + Modal, + Row, + Text, + Tooltip, + TooltipTrigger, } from '@umami/react-zen'; +import { SegmentEditForm } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditForm'; import { - useNavigation, - useMessages, - useFormat, useFilters, + useFormat, + useMessages, + useNavigation, useWebsiteSegmentQuery, } from '@/components/hooks'; -import { X, Bookmark } from '@/components/icons'; +import { Bookmark, X } from '@/components/icons'; import { isSearchOperator } from '@/lib/params'; -import { SegmentEditForm } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditForm'; export function FilterBar({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/components/input/FilterButtons.tsx b/src/components/input/FilterButtons.tsx index 4340ad97..ff37fb19 100644 --- a/src/components/input/FilterButtons.tsx +++ b/src/components/input/FilterButtons.tsx @@ -1,5 +1,5 @@ +import { Box, ToggleGroup, ToggleGroupItem } from '@umami/react-zen'; import { useState } from 'react'; -import { ToggleGroup, ToggleGroupItem, Box } from '@umami/react-zen'; export interface FilterButtonsProps { items: { id: string; label: string }[]; diff --git a/src/components/input/FilterEditForm.tsx b/src/components/input/FilterEditForm.tsx index c69c69e5..44f43844 100644 --- a/src/components/input/FilterEditForm.tsx +++ b/src/components/input/FilterEditForm.tsx @@ -1,8 +1,8 @@ +import { Button, Column, Row, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; +import { useState } from 'react'; import { useFilters, useMessages, useMobile, useNavigation } from '@/components/hooks'; import { FieldFilters } from '@/components/input/FieldFilters'; import { SegmentFilters } from '@/components/input/SegmentFilters'; -import { Button, Column, Row, Tab, TabList, TabPanel, Tabs } from '@umami/react-zen'; -import { useState } from 'react'; export interface FilterEditFormProps { websiteId?: string; diff --git a/src/components/input/LanguageButton.tsx b/src/components/input/LanguageButton.tsx index 6d43f11a..ac43dcb6 100644 --- a/src/components/input/LanguageButton.tsx +++ b/src/components/input/LanguageButton.tsx @@ -1,7 +1,7 @@ -import { Icon, Button, MenuTrigger, Popover, Grid, Text, Dialog } from '@umami/react-zen'; -import { languages } from '@/lib/lang'; -import { useLocale } from '@/components/hooks'; +import { Button, Dialog, Grid, Icon, MenuTrigger, Popover, Text } from '@umami/react-zen'; import { Globe } from 'lucide-react'; +import { useLocale } from '@/components/hooks'; +import { languages } from '@/lib/lang'; export function LanguageButton() { const { locale, saveLocale } = useLocale(); diff --git a/src/components/input/LookupField.tsx b/src/components/input/LookupField.tsx index 06b5006a..c1d419f7 100644 --- a/src/components/input/LookupField.tsx +++ b/src/components/input/LookupField.tsx @@ -1,6 +1,6 @@ -import { SetStateAction, useMemo, useState } from 'react'; +import { ComboBox, type ComboBoxProps, ListItem, Loading, useDebounce } from '@umami/react-zen'; import { endOfDay, subMonths } from 'date-fns'; -import { ComboBox, ListItem, Loading, useDebounce, ComboBoxProps } from '@umami/react-zen'; +import { type SetStateAction, useMemo, useState } from 'react'; import { Empty } from '@/components/common/Empty'; import { useMessages, useWebsiteValuesQuery } from '@/components/hooks'; diff --git a/src/components/input/MenuButton.tsx b/src/components/input/MenuButton.tsx index b861577c..bac307fe 100644 --- a/src/components/input/MenuButton.tsx +++ b/src/components/input/MenuButton.tsx @@ -1,5 +1,5 @@ -import { ReactNode, Key } from 'react'; -import { DialogTrigger, Button, Menu, Popover, Icon } from '@umami/react-zen'; +import { Button, DialogTrigger, Icon, Menu, Popover } from '@umami/react-zen'; +import type { Key, ReactNode } from 'react'; import { Ellipsis } from '@/components/icons'; export function MenuButton({ diff --git a/src/components/input/MobileMenuButton.tsx b/src/components/input/MobileMenuButton.tsx index bd32272d..5e59cbbb 100644 --- a/src/components/input/MobileMenuButton.tsx +++ b/src/components/input/MobileMenuButton.tsx @@ -1,4 +1,4 @@ -import { Dialog, DialogTrigger, Button, Icon, Modal, DialogProps } from '@umami/react-zen'; +import { Button, Dialog, type DialogProps, DialogTrigger, Icon, Modal } from '@umami/react-zen'; import { Menu } from '@/components/icons'; export function MobileMenuButton(props: DialogProps) { diff --git a/src/components/input/MonthSelect.tsx b/src/components/input/MonthSelect.tsx index efaf6a5e..241634ed 100644 --- a/src/components/input/MonthSelect.tsx +++ b/src/components/input/MonthSelect.tsx @@ -1,4 +1,4 @@ -import { Row, Select, ListItem } from '@umami/react-zen'; +import { ListItem, Row, Select } from '@umami/react-zen'; import { useLocale } from '@/components/hooks'; import { formatDate } from '@/lib/date'; diff --git a/src/components/input/NavButton.tsx b/src/components/input/NavButton.tsx index b57c2ecd..7ea966cc 100644 --- a/src/components/input/NavButton.tsx +++ b/src/components/input/NavButton.tsx @@ -1,18 +1,19 @@ import { - Text, + Column, Icon, + IconLabel, Menu, MenuItem, - MenuTrigger, MenuSection, MenuSeparator, - SubmenuTrigger, + MenuTrigger, Popover, - Row, - Column, Pressable, - IconLabel, + Row, + SubmenuTrigger, + Text, } from '@umami/react-zen'; +import { ArrowRight } from 'lucide-react'; import { useConfig, useLoginQuery, @@ -33,7 +34,6 @@ import { } from '@/components/icons'; import { Switch } from '@/components/svg'; import { DOCS_URL } from '@/lib/constants'; -import { ArrowRight } from 'lucide-react'; export interface TeamsButtonProps { showText?: boolean; diff --git a/src/components/input/PanelButton.tsx b/src/components/input/PanelButton.tsx index 2f768741..500c40c4 100644 --- a/src/components/input/PanelButton.tsx +++ b/src/components/input/PanelButton.tsx @@ -1,6 +1,6 @@ -import { Button, Icon, ButtonProps } from '@umami/react-zen'; -import { PanelLeft } from '@/components/icons'; +import { Button, type ButtonProps, Icon } from '@umami/react-zen'; import { useGlobalState } from '@/components/hooks'; +import { PanelLeft } from '@/components/icons'; export function PanelButton(props: ButtonProps) { const [isCollapsed, setIsCollapsed] = useGlobalState('sidenav-collapsed'); diff --git a/src/components/input/PreferencesButton.tsx b/src/components/input/PreferencesButton.tsx index 03092fe5..710a7fae 100644 --- a/src/components/input/PreferencesButton.tsx +++ b/src/components/input/PreferencesButton.tsx @@ -1,9 +1,9 @@ -import { Button, Icon, DialogTrigger, Popover, Column, Label } from '@umami/react-zen'; -import { TimezoneSetting } from '@/app/(main)/settings/preferences/TimezoneSetting'; +import { Button, Column, DialogTrigger, Icon, Label, Popover } from '@umami/react-zen'; import { DateRangeSetting } from '@/app/(main)/settings/preferences/DateRangeSetting'; -import { Settings } from '@/components/icons'; -import { useMessages } from '@/components/hooks'; +import { TimezoneSetting } from '@/app/(main)/settings/preferences/TimezoneSetting'; import { Panel } from '@/components/common/Panel'; +import { useMessages } from '@/components/hooks'; +import { Settings } from '@/components/icons'; export function PreferencesButton() { const { formatMessage, labels } = useMessages(); diff --git a/src/components/input/ProfileButton.tsx b/src/components/input/ProfileButton.tsx index 03f14d07..505cd888 100644 --- a/src/components/input/ProfileButton.tsx +++ b/src/components/input/ProfileButton.tsx @@ -1,18 +1,18 @@ -import { Fragment } from 'react'; import { - Icon, Button, - MenuTrigger, - Popover, + Icon, Menu, MenuItem, - MenuSeparator, MenuSection, - Text, + MenuSeparator, + MenuTrigger, + Popover, Row, + Text, } from '@umami/react-zen'; -import { useMessages, useLoginQuery, useNavigation } from '@/components/hooks'; -import { LogOut, UserCircle, LockKeyhole } from '@/components/icons'; +import { Fragment } from 'react'; +import { useLoginQuery, useMessages, useNavigation } from '@/components/hooks'; +import { LockKeyhole, LogOut, UserCircle } from '@/components/icons'; export function ProfileButton() { const { formatMessage, labels } = useMessages(); diff --git a/src/components/input/RefreshButton.tsx b/src/components/input/RefreshButton.tsx index 29b71986..b52f830e 100644 --- a/src/components/input/RefreshButton.tsx +++ b/src/components/input/RefreshButton.tsx @@ -1,8 +1,7 @@ -import { LoadingButton, Icon, Tooltip, TooltipTrigger } from '@umami/react-zen'; -import { setWebsiteDateRange } from '@/store/websites'; -import { useDateRange } from '@/components/hooks'; +import { Icon, LoadingButton, Tooltip, TooltipTrigger } from '@umami/react-zen'; +import { useDateRange, useMessages } from '@/components/hooks'; import { RefreshCw } from '@/components/icons'; -import { useMessages } from '@/components/hooks'; +import { setWebsiteDateRange } from '@/store/websites'; export function RefreshButton({ websiteId, diff --git a/src/components/input/ReportEditButton.tsx b/src/components/input/ReportEditButton.tsx index 8f0c7a3c..b333077a 100644 --- a/src/components/input/ReportEditButton.tsx +++ b/src/components/input/ReportEditButton.tsx @@ -1,6 +1,3 @@ -import { ReactNode, useState } from 'react'; -import { useMessages } from '@/components/hooks'; -import { useDeleteQuery } from '@/components/hooks/queries/useDeleteQuery'; import { AlertDialog, Button, @@ -10,9 +7,12 @@ import { MenuTrigger, Modal, Popover, - Text, Row, + Text, } from '@umami/react-zen'; +import { type ReactNode, useState } from 'react'; +import { useMessages } from '@/components/hooks'; +import { useDeleteQuery } from '@/components/hooks/queries/useDeleteQuery'; import { Edit, MoreHorizontal, Trash } from '@/components/icons'; export function ReportEditButton({ diff --git a/src/components/input/SegmentFilters.tsx b/src/components/input/SegmentFilters.tsx index d0906d67..f03a1dea 100644 --- a/src/components/input/SegmentFilters.tsx +++ b/src/components/input/SegmentFilters.tsx @@ -1,7 +1,7 @@ import { IconLabel, List, ListItem } from '@umami/react-zen'; -import { useWebsiteSegmentsQuery } from '@/components/hooks'; -import { LoadingPanel } from '@/components/common/LoadingPanel'; import { Empty } from '@/components/common/Empty'; +import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { useWebsiteSegmentsQuery } from '@/components/hooks'; import { ChartPie, UserPlus } from '@/components/icons'; export interface SegmentFiltersProps { diff --git a/src/components/input/SegmentSaveButton.tsx b/src/components/input/SegmentSaveButton.tsx index f6cee0e1..5f6cac10 100644 --- a/src/components/input/SegmentSaveButton.tsx +++ b/src/components/input/SegmentSaveButton.tsx @@ -1,7 +1,7 @@ -import { Button, DialogTrigger, Modal, Text, Icon, Dialog } from '@umami/react-zen'; +import { Button, Dialog, DialogTrigger, Icon, Modal, Text } from '@umami/react-zen'; +import { SegmentEditForm } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditForm'; import { useMessages } from '@/components/hooks'; import { Plus } from '@/components/icons'; -import { SegmentEditForm } from '@/app/(main)/websites/[websiteId]/segments/SegmentEditForm'; export function SegmentSaveButton({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); diff --git a/src/components/input/SettingsButton.tsx b/src/components/input/SettingsButton.tsx index 23ad91d3..bd51fb53 100644 --- a/src/components/input/SettingsButton.tsx +++ b/src/components/input/SettingsButton.tsx @@ -1,23 +1,23 @@ -import { Key } from 'react'; import { - Icon, Button, - MenuTrigger, - Popover, + Icon, Menu, MenuItem, - MenuSeparator, MenuSection, + MenuSeparator, + MenuTrigger, + Popover, } from '@umami/react-zen'; -import { useMessages, useLoginQuery, useNavigation, useConfig } from '@/components/hooks'; +import type { Key } from 'react'; +import { useConfig, useLoginQuery, useMessages, useNavigation } from '@/components/hooks'; import { - LogOut, - LockKeyhole, - Settings, - UserCircle, - LifeBuoy, BookText, ExternalLink, + LifeBuoy, + LockKeyhole, + LogOut, + Settings, + UserCircle, } from '@/components/icons'; import { DOCS_URL } from '@/lib/constants'; diff --git a/src/components/input/WebsiteDateFilter.tsx b/src/components/input/WebsiteDateFilter.tsx index dbe41f32..beb6f371 100644 --- a/src/components/input/WebsiteDateFilter.tsx +++ b/src/components/input/WebsiteDateFilter.tsx @@ -1,8 +1,8 @@ -import { useCallback, useMemo } from 'react'; -import { Button, Icon, Row, Text, Select, ListItem } from '@umami/react-zen'; +import { Button, Icon, ListItem, Row, Select, Text } from '@umami/react-zen'; import { isAfter } from 'date-fns'; -import { ChevronRight } from '@/components/icons'; +import { useCallback, useMemo } from 'react'; import { useDateRange, useDateRangeQuery, useMessages, useNavigation } from '@/components/hooks'; +import { ChevronRight } from '@/components/icons'; import { getDateRangeValue } from '@/lib/date'; import { DateFilter } from './DateFilter'; diff --git a/src/components/input/WebsiteFilterButton.tsx b/src/components/input/WebsiteFilterButton.tsx index 25f81af4..7db850a1 100644 --- a/src/components/input/WebsiteFilterButton.tsx +++ b/src/components/input/WebsiteFilterButton.tsx @@ -1,7 +1,7 @@ -import { ListFilter } from '@/components/icons'; -import { FilterEditForm } from '@/components/input/FilterEditForm'; -import { DialogButton } from '@/components/input/DialogButton'; import { useMessages, useNavigation } from '@/components/hooks'; +import { ListFilter } from '@/components/icons'; +import { DialogButton } from '@/components/input/DialogButton'; +import { FilterEditForm } from '@/components/input/FilterEditForm'; import { filtersArrayToObject } from '@/lib/params'; export function WebsiteFilterButton({ diff --git a/src/components/input/WebsiteSelect.tsx b/src/components/input/WebsiteSelect.tsx index 29ae040b..8d81eb9a 100644 --- a/src/components/input/WebsiteSelect.tsx +++ b/src/components/input/WebsiteSelect.tsx @@ -1,12 +1,12 @@ +import { ListItem, Row, Select, type SelectProps, Text } from '@umami/react-zen'; import { useState } from 'react'; -import { Select, SelectProps, ListItem, Text, Row } from '@umami/react-zen'; +import { Empty } from '@/components/common/Empty'; import { - useUserWebsitesQuery, - useMessages, useLoginQuery, + useMessages, + useUserWebsitesQuery, useWebsiteQuery, } from '@/components/hooks'; -import { Empty } from '@/components/common/Empty'; export function WebsiteSelect({ websiteId, @@ -28,7 +28,7 @@ export function WebsiteSelect({ { userId: user?.id, teamId }, { search, pageSize: 10, includeTeams }, ); - const listItems: { id: string; name: string }[] = data?.['data'] || []; + const listItems: { id: string; name: string }[] = data?.data || []; const handleSearch = (value: string) => { setSearch(value); diff --git a/src/components/metrics/ActiveUsers.tsx b/src/components/metrics/ActiveUsers.tsx index 0627020e..a7f6e604 100644 --- a/src/components/metrics/ActiveUsers.tsx +++ b/src/components/metrics/ActiveUsers.tsx @@ -1,6 +1,6 @@ +import { StatusLight, Text } from '@umami/react-zen'; import { useMemo } from 'react'; -import { Text, StatusLight } from '@umami/react-zen'; -import { useMessages, useActyiveUsersQuery } from '@/components/hooks'; +import { useActyiveUsersQuery, useMessages } from '@/components/hooks'; export function ActiveUsers({ websiteId, diff --git a/src/components/metrics/ChangeLabel.tsx b/src/components/metrics/ChangeLabel.tsx index 8ac41355..192f0ff2 100644 --- a/src/components/metrics/ChangeLabel.tsx +++ b/src/components/metrics/ChangeLabel.tsx @@ -1,5 +1,5 @@ -import { Icon, Text, Row, RowProps } from '@umami/react-zen'; -import { ReactNode } from 'react'; +import { Icon, Row, type RowProps, Text } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { ArrowRight } from '@/components/icons'; const STYLES = { @@ -33,7 +33,7 @@ export function ChangeLabel({ } & RowProps) { const positive = value >= 0; const negative = value < 0; - const neutral = value === 0 || isNaN(value); + const neutral = value === 0 || Number.isNaN(value); const good = reverseColors ? negative : positive; const style = diff --git a/src/components/metrics/DatePickerForm.tsx b/src/components/metrics/DatePickerForm.tsx index 8094e30a..59d17093 100644 --- a/src/components/metrics/DatePickerForm.tsx +++ b/src/components/metrics/DatePickerForm.tsx @@ -1,6 +1,6 @@ +import { Button, Calendar, Column, Row, ToggleGroup, ToggleGroupItem } from '@umami/react-zen'; +import { endOfDay, isAfter, isBefore, isSameDay, startOfDay } from 'date-fns'; import { useState } from 'react'; -import { Button, Row, Column, Calendar, ToggleGroup, ToggleGroupItem } from '@umami/react-zen'; -import { isAfter, isBefore, isSameDay, startOfDay, endOfDay } from 'date-fns'; import { useMessages } from '@/components/hooks'; const FILTER_DAY = 'filter-day'; diff --git a/src/components/metrics/EventData.tsx b/src/components/metrics/EventData.tsx index cc11dea2..48d21c57 100644 --- a/src/components/metrics/EventData.tsx +++ b/src/components/metrics/EventData.tsx @@ -1,6 +1,6 @@ -import { Grid, Column, Text, Label } from '@umami/react-zen'; -import { useEventDataQuery } from '@/components/hooks'; +import { Column, Grid, Label, Text } from '@umami/react-zen'; import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { useEventDataQuery } from '@/components/hooks'; export function EventData({ websiteId, eventId }: { websiteId: string; eventId: string }) { const { data, isLoading, error } = useEventDataQuery(websiteId, eventId); diff --git a/src/components/metrics/EventsChart.tsx b/src/components/metrics/EventsChart.tsx index 03ed6e29..3a53ba9a 100644 --- a/src/components/metrics/EventsChart.tsx +++ b/src/components/metrics/EventsChart.tsx @@ -1,4 +1,6 @@ -import { BarChart, BarChartProps } from '@/components/charts/BarChart'; +import { colord } from 'colord'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { BarChart, type BarChartProps } from '@/components/charts/BarChart'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useDateRange, @@ -9,8 +11,6 @@ import { import { renderDateLabels } from '@/lib/charts'; import { CHART_COLORS } from '@/lib/constants'; import { generateTimeSeries } from '@/lib/date'; -import { colord } from 'colord'; -import { useCallback, useEffect, useMemo, useState } from 'react'; export interface EventsChartProps extends BarChartProps { websiteId: string; diff --git a/src/components/metrics/Legend.tsx b/src/components/metrics/Legend.tsx index 341ed647..63231919 100644 --- a/src/components/metrics/Legend.tsx +++ b/src/components/metrics/Legend.tsx @@ -1,6 +1,6 @@ import { Row, StatusLight, Text } from '@umami/react-zen'; +import type { LegendItem } from 'chart.js/auto'; import { colord } from 'colord'; -import { LegendItem } from 'chart.js/auto'; export function Legend({ items = [], diff --git a/src/components/metrics/ListTable.tsx b/src/components/metrics/ListTable.tsx index e76e0174..f233bfe7 100644 --- a/src/components/metrics/ListTable.tsx +++ b/src/components/metrics/ListTable.tsx @@ -1,7 +1,7 @@ -import { ReactNode } from 'react'; +import { config, useSpring } from '@react-spring/web'; +import { Column, Grid, Row, Text } from '@umami/react-zen'; +import type { ReactNode } from 'react'; import { FixedSizeList } from 'react-window'; -import { useSpring, config } from '@react-spring/web'; -import { Grid, Row, Column, Text } from '@umami/react-zen'; import { AnimatedDiv } from '@/components/common/AnimatedDiv'; import { Empty } from '@/components/common/Empty'; import { useMessages, useMobile } from '@/components/hooks'; @@ -105,7 +105,7 @@ const AnimatedRow = ({ }) => { const props = useSpring({ width: percent, - y: !isNaN(value) ? value : 0, + y: !Number.isNaN(value) ? value : 0, from: { width: 0, y: 0 }, config: animate ? config.default : { duration: 0 }, }); diff --git a/src/components/metrics/MetricCard.tsx b/src/components/metrics/MetricCard.tsx index 4b3577e8..d15bcf13 100644 --- a/src/components/metrics/MetricCard.tsx +++ b/src/components/metrics/MetricCard.tsx @@ -1,8 +1,8 @@ -import { Text, Column } from '@umami/react-zen'; import { useSpring } from '@react-spring/web'; -import { formatNumber } from '@/lib/format'; +import { Column, Text } from '@umami/react-zen'; import { AnimatedDiv } from '@/components/common/AnimatedDiv'; import { ChangeLabel } from '@/components/metrics/ChangeLabel'; +import { formatNumber } from '@/lib/format'; export interface MetricCardProps { value: number; diff --git a/src/components/metrics/MetricLabel.tsx b/src/components/metrics/MetricLabel.tsx index c755516c..31c331f5 100644 --- a/src/components/metrics/MetricLabel.tsx +++ b/src/components/metrics/MetricLabel.tsx @@ -1,14 +1,14 @@ import { Row } from '@umami/react-zen'; +import { Favicon } from '@/components/common/Favicon'; +import { FilterLink } from '@/components/common/FilterLink'; +import { TypeIcon } from '@/components/common/TypeIcon'; import { useCountryNames, + useFormat, useLocale, useMessages, useRegionNames, - useFormat, } from '@/components/hooks'; -import { FilterLink } from '@/components/common/FilterLink'; -import { TypeIcon } from '@/components/common/TypeIcon'; -import { Favicon } from '@/components/common/Favicon'; import { GROUPED_DOMAINS } from '@/lib/constants'; export interface MetricLabelProps { diff --git a/src/components/metrics/MetricsBar.tsx b/src/components/metrics/MetricsBar.tsx index 403cd2c2..850c6bc9 100644 --- a/src/components/metrics/MetricsBar.tsx +++ b/src/components/metrics/MetricsBar.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { Grid, GridProps } from '@umami/react-zen'; +import { Grid, type GridProps } from '@umami/react-zen'; +import type { ReactNode } from 'react'; export interface MetricsBarProps extends GridProps { children?: ReactNode; diff --git a/src/components/metrics/MetricsExpandedTable.tsx b/src/components/metrics/MetricsExpandedTable.tsx index d35e61d0..f24c952d 100644 --- a/src/components/metrics/MetricsExpandedTable.tsx +++ b/src/components/metrics/MetricsExpandedTable.tsx @@ -1,12 +1,12 @@ -import { ReactNode, useState } from 'react'; import { Button, Column, DataColumn, DataTable, Icon, Row, SearchField } from '@umami/react-zen'; +import { type ReactNode, useState } from 'react'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useMessages, useWebsiteExpandedMetricsQuery } from '@/components/hooks'; import { X } from '@/components/icons'; import { DownloadButton } from '@/components/input/DownloadButton'; -import { formatShortTime } from '@/lib/format'; import { MetricLabel } from '@/components/metrics/MetricLabel'; import { SESSION_COLUMNS } from '@/lib/constants'; +import { formatShortTime } from '@/lib/format'; export interface MetricsExpandedTableProps { websiteId: string; @@ -85,7 +85,7 @@ export function MetricsExpandedTable({ align="end" width="120px" > - {row => row?.['visitors']?.toLocaleString()} + {row => row?.visitors?.toLocaleString()} - {row => row?.['visits']?.toLocaleString()} + {row => row?.visits?.toLocaleString()} - {row => row?.['pageviews']?.toLocaleString()} + {row => row?.pageviews?.toLocaleString()} {showBounceDuration && [ {row => { - const n = (Math.min(row?.['visits'], row?.['bounces']) / row?.['visits']) * 100; - return Math.round(+n) + '%'; + const n = (Math.min(row?.visits, row?.bounces) / row?.visits) * 100; + return `${Math.round(+n)}%`; }} , @@ -125,7 +125,7 @@ export function MetricsExpandedTable({ width="120px" > {row => { - const n = row?.['totaltime'] / row?.['visits']; + const n = row?.totaltime / row?.visits; return `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`; }} , diff --git a/src/components/metrics/MetricsTable.tsx b/src/components/metrics/MetricsTable.tsx index 48b06f0b..e99bd216 100644 --- a/src/components/metrics/MetricsTable.tsx +++ b/src/components/metrics/MetricsTable.tsx @@ -1,12 +1,12 @@ +import { Grid, Icon, Row, Text } from '@umami/react-zen'; import { useEffect, useMemo } from 'react'; -import { Icon, Text, Row, Grid } from '@umami/react-zen'; import { LinkButton } from '@/components/common/LinkButton'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { useMessages, useNavigation, useWebsiteMetricsQuery } from '@/components/hooks'; import { Maximize } from '@/components/icons'; import { MetricLabel } from '@/components/metrics/MetricLabel'; import { percentFilter } from '@/lib/filters'; -import { ListTable, ListTableProps } from './ListTable'; +import { ListTable, type ListTableProps } from './ListTable'; export interface MetricsTableProps extends ListTableProps { websiteId: string; diff --git a/src/components/metrics/PageviewsChart.tsx b/src/components/metrics/PageviewsChart.tsx index 8e713bb0..b83f8dc3 100644 --- a/src/components/metrics/PageviewsChart.tsx +++ b/src/components/metrics/PageviewsChart.tsx @@ -1,6 +1,6 @@ -import { useCallback, useMemo } from 'react'; import { useTheme } from '@umami/react-zen'; -import { BarChart, BarChartProps } from '@/components/charts/BarChart'; +import { useCallback, useMemo } from 'react'; +import { BarChart, type BarChartProps } from '@/components/charts/BarChart'; import { useLocale, useMessages } from '@/components/hooks'; import { renderDateLabels } from '@/lib/charts'; import { getThemeColors } from '@/lib/colors'; @@ -28,7 +28,7 @@ export function PageviewsChart({ data, unit, minDate, maxDate, ...props }: Pagev if (!data) return; return { - __id: new Date().getTime(), + __id: Date.now(), datasets: [ { type: 'bar', diff --git a/src/components/metrics/RealtimeChart.tsx b/src/components/metrics/RealtimeChart.tsx index a71c03c3..a43dcb42 100644 --- a/src/components/metrics/RealtimeChart.tsx +++ b/src/components/metrics/RealtimeChart.tsx @@ -1,9 +1,9 @@ +import { isBefore, startOfMinute, subMinutes } from 'date-fns'; import { useMemo, useRef } from 'react'; -import { startOfMinute, subMinutes, isBefore } from 'date-fns'; -import { PageviewsChart } from './PageviewsChart'; -import { DEFAULT_ANIMATION_DURATION, REALTIME_RANGE } from '@/lib/constants'; -import { RealtimeData } from '@/lib/types'; import { useTimezone } from '@/components/hooks'; +import { DEFAULT_ANIMATION_DURATION, REALTIME_RANGE } from '@/lib/constants'; +import type { RealtimeData } from '@/lib/types'; +import { PageviewsChart } from './PageviewsChart'; export interface RealtimeChartProps { data: RealtimeData; diff --git a/src/components/metrics/WeeklyTraffic.tsx b/src/components/metrics/WeeklyTraffic.tsx index 82d1c1c1..90e47c63 100644 --- a/src/components/metrics/WeeklyTraffic.tsx +++ b/src/components/metrics/WeeklyTraffic.tsx @@ -1,9 +1,8 @@ -import { Row, Grid, Text } from '@umami/react-zen'; -import { format, startOfDay, addHours } from 'date-fns'; -import { useLocale, useMessages, useWeeklyTrafficQuery } from '@/components/hooks'; +import { Focusable, Grid, Row, Text, Tooltip, TooltipTrigger } from '@umami/react-zen'; +import { addHours, format, startOfDay } from 'date-fns'; import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { useLocale, useMessages, useWeeklyTrafficQuery } from '@/components/hooks'; import { getDayOfWeekAsDate } from '@/lib/date'; -import { Focusable, Tooltip, TooltipTrigger } from '@umami/react-zen'; export function WeeklyTraffic({ websiteId }: { websiteId: string }) { const { data, isLoading, error } = useWeeklyTrafficQuery(websiteId); diff --git a/src/components/metrics/WorldMap.tsx b/src/components/metrics/WorldMap.tsx index b0936c0d..3c8fadb8 100644 --- a/src/components/metrics/WorldMap.tsx +++ b/src/components/metrics/WorldMap.tsx @@ -1,17 +1,17 @@ -import { FloatingTooltip, Column, useTheme, ColumnProps } from '@umami/react-zen'; -import { useState, useMemo } from 'react'; -import { ComposableMap, Geographies, Geography, ZoomableGroup } from 'react-simple-maps'; +import { Column, type ColumnProps, FloatingTooltip, useTheme } from '@umami/react-zen'; import { colord } from 'colord'; -import { ISO_COUNTRIES, MAP_FILE } from '@/lib/constants'; +import { useMemo, useState } from 'react'; +import { ComposableMap, Geographies, Geography, ZoomableGroup } from 'react-simple-maps'; import { - useWebsiteMetricsQuery, useCountryNames, useLocale, useMessages, + useWebsiteMetricsQuery, } from '@/components/hooks'; -import { formatLongNumber } from '@/lib/format'; -import { percentFilter } from '@/lib/filters'; import { getThemeColors } from '@/lib/colors'; +import { ISO_COUNTRIES, MAP_FILE } from '@/lib/constants'; +import { percentFilter } from '@/lib/filters'; +import { formatLongNumber } from '@/lib/format'; export interface WorldMapProps extends ColumnProps { websiteId?: string; diff --git a/src/components/svg/AddUser.tsx b/src/components/svg/AddUser.tsx index 1e8b298b..d1eb5095 100644 --- a/src/components/svg/AddUser.tsx +++ b/src/components/svg/AddUser.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgAddUser = (props: SVGProps) => ( ) => ( diff --git a/src/components/svg/Bars.tsx b/src/components/svg/Bars.tsx index c9464f0f..1ce88f72 100644 --- a/src/components/svg/Bars.tsx +++ b/src/components/svg/Bars.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgBars = (props: SVGProps) => ( diff --git a/src/components/svg/Bolt.tsx b/src/components/svg/Bolt.tsx index 4a42189a..23b1e76b 100644 --- a/src/components/svg/Bolt.tsx +++ b/src/components/svg/Bolt.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgBolt = (props: SVGProps) => ( diff --git a/src/components/svg/Bookmark.tsx b/src/components/svg/Bookmark.tsx index a1606b0d..089f61fe 100644 --- a/src/components/svg/Bookmark.tsx +++ b/src/components/svg/Bookmark.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgBookmark = (props: SVGProps) => ( diff --git a/src/components/svg/Calendar.tsx b/src/components/svg/Calendar.tsx index df978310..dfb848a9 100644 --- a/src/components/svg/Calendar.tsx +++ b/src/components/svg/Calendar.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgCalendar = (props: SVGProps) => ( diff --git a/src/components/svg/Change.tsx b/src/components/svg/Change.tsx index 239b30b7..935a2f7a 100644 --- a/src/components/svg/Change.tsx +++ b/src/components/svg/Change.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgChange = (props: SVGProps) => ( ) => ( diff --git a/src/components/svg/Compare.tsx b/src/components/svg/Compare.tsx index fef3f55f..3434461a 100644 --- a/src/components/svg/Compare.tsx +++ b/src/components/svg/Compare.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgCompare = (props: SVGProps) => ( diff --git a/src/components/svg/Dashboard.tsx b/src/components/svg/Dashboard.tsx index ca278040..5696244f 100644 --- a/src/components/svg/Dashboard.tsx +++ b/src/components/svg/Dashboard.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgDashboard = (props: SVGProps) => ( ) => ( diff --git a/src/components/svg/Expand.tsx b/src/components/svg/Expand.tsx index 8cdb792b..a0f472e5 100644 --- a/src/components/svg/Expand.tsx +++ b/src/components/svg/Expand.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgExpand = (props: SVGProps) => ( ) => ( diff --git a/src/components/svg/Flag.tsx b/src/components/svg/Flag.tsx index 8deaa958..34af943a 100644 --- a/src/components/svg/Flag.tsx +++ b/src/components/svg/Flag.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgFlag = (props: SVGProps) => ( diff --git a/src/components/svg/Funnel.tsx b/src/components/svg/Funnel.tsx index 05a24378..63cf47d7 100644 --- a/src/components/svg/Funnel.tsx +++ b/src/components/svg/Funnel.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgFunnel = (props: SVGProps) => ( ) => ( diff --git a/src/components/svg/Globe.tsx b/src/components/svg/Globe.tsx index 5586c124..385017d4 100644 --- a/src/components/svg/Globe.tsx +++ b/src/components/svg/Globe.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgGlobe = (props: SVGProps) => ( diff --git a/src/components/svg/Lightbulb.tsx b/src/components/svg/Lightbulb.tsx index 9a16b5c4..8d86170e 100644 --- a/src/components/svg/Lightbulb.tsx +++ b/src/components/svg/Lightbulb.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgLightbulb = (props: SVGProps) => ( ) => ( ) => ( diff --git a/src/components/svg/Location.tsx b/src/components/svg/Location.tsx index b1b658dc..0fd7d165 100644 --- a/src/components/svg/Location.tsx +++ b/src/components/svg/Location.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgLocation = (props: SVGProps) => ( diff --git a/src/components/svg/Lock.tsx b/src/components/svg/Lock.tsx index 8f588cf0..2b62eb9e 100644 --- a/src/components/svg/Lock.tsx +++ b/src/components/svg/Lock.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgLock = (props: SVGProps) => ( diff --git a/src/components/svg/Logo.tsx b/src/components/svg/Logo.tsx index 79fa813c..eb9fdf5b 100644 --- a/src/components/svg/Logo.tsx +++ b/src/components/svg/Logo.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgLogo = (props: SVGProps) => ( ) => ( ) => ( ) => ( ) => ( diff --git a/src/components/svg/Network.tsx b/src/components/svg/Network.tsx index 32860aa7..15941a99 100644 --- a/src/components/svg/Network.tsx +++ b/src/components/svg/Network.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgNetwork = (props: SVGProps) => ( ) => ( ) => ( diff --git a/src/components/svg/Path.tsx b/src/components/svg/Path.tsx index c49b1b3f..7538ba44 100644 --- a/src/components/svg/Path.tsx +++ b/src/components/svg/Path.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgPath = (props: SVGProps) => ( ) => ( diff --git a/src/components/svg/Pushpin.tsx b/src/components/svg/Pushpin.tsx index e82c60ef..d19e98ea 100644 --- a/src/components/svg/Pushpin.tsx +++ b/src/components/svg/Pushpin.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgPushpin = (props: SVGProps) => ( diff --git a/src/components/svg/Redo.tsx b/src/components/svg/Redo.tsx index af032d42..04c389f6 100644 --- a/src/components/svg/Redo.tsx +++ b/src/components/svg/Redo.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgRedo = (props: SVGProps) => ( diff --git a/src/components/svg/Reports.tsx b/src/components/svg/Reports.tsx index 27c73fe3..b5489668 100644 --- a/src/components/svg/Reports.tsx +++ b/src/components/svg/Reports.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgReports = (props: SVGProps) => ( diff --git a/src/components/svg/Security.tsx b/src/components/svg/Security.tsx index 97a4afca..d075a938 100644 --- a/src/components/svg/Security.tsx +++ b/src/components/svg/Security.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgSecurity = (props: SVGProps) => ( ) => ( diff --git a/src/components/svg/Sun.tsx b/src/components/svg/Sun.tsx index 26370988..61880f5c 100644 --- a/src/components/svg/Sun.tsx +++ b/src/components/svg/Sun.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgSun = (props: SVGProps) => ( diff --git a/src/components/svg/Switch.tsx b/src/components/svg/Switch.tsx index 2a12f393..0196d850 100644 --- a/src/components/svg/Switch.tsx +++ b/src/components/svg/Switch.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgSwitch = (props: SVGProps) => ( ) => ( ) => ( ) => ( diff --git a/src/components/svg/Website.tsx b/src/components/svg/Website.tsx index 8e11c7cb..20a18a49 100644 --- a/src/components/svg/Website.tsx +++ b/src/components/svg/Website.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import type { SVGProps } from 'react'; + const SvgWebsite = (props: SVGProps) => ( , diff --git a/src/lib/date.ts b/src/lib/date.ts index f0f54de4..3c1fd1b7 100644 --- a/src/lib/date.ts +++ b/src/lib/date.ts @@ -1,5 +1,3 @@ -import { getDateLocale } from '@/lib/lang'; -import { DateRange } from '@/lib/types'; import { addDays, addHours, @@ -40,6 +38,8 @@ import { subYears, } from 'date-fns'; import { utcToZonedTime } from 'date-fns-tz'; +import { getDateLocale } from '@/lib/lang'; +import type { DateRange } from '@/lib/types'; export const TIME_UNIT = { minute: 'minute', @@ -371,5 +371,5 @@ export function getMonthDateRangeValue(date: Date) { } export function isInvalidDate(date: any) { - return date instanceof Date && isNaN(date.getTime()); + return date instanceof Date && Number.isNaN(date.getTime()); } diff --git a/src/lib/db.ts b/src/lib/db.ts index 72a18c06..7b6e8368 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -5,12 +5,12 @@ export const KAFKA = 'kafka'; export const KAFKA_PRODUCER = 'kafka-producer'; // Fixes issue with converting bigint values -BigInt.prototype['toJSON'] = function () { +BigInt.prototype.toJSON = function () { return Number(this); }; export function getDatabaseType(url = process.env.DATABASE_URL) { - const type = url && url.split(':')[0]; + const type = url?.split(':')[0]; if (type === 'postgres') { return POSTGRESQL; diff --git a/src/lib/detect.ts b/src/lib/detect.ts index c5528465..f3301295 100644 --- a/src/lib/detect.ts +++ b/src/lib/detect.ts @@ -1,11 +1,11 @@ import path from 'node:path'; -import { UAParser } from 'ua-parser-js'; import { browserName, detectOS } from 'detect-browser'; -import isLocalhost from 'is-localhost-ip'; import ipaddr from 'ipaddr.js'; +import isLocalhost from 'is-localhost-ip'; import maxmind from 'maxmind'; +import { UAParser } from 'ua-parser-js'; +import { getIpAddress, stripPort } from '@/lib/ip'; import { safeDecodeURIComponent } from '@/lib/url'; -import { stripPort, getIpAddress } from '@/lib/ip'; const MAXMIND = 'maxmind'; @@ -145,6 +145,8 @@ export function hasBlockedIp(clientIp: string) { return true; } } + + return false; }); } diff --git a/src/lib/format.ts b/src/lib/format.ts index e5319b2a..52fd3048 100644 --- a/src/lib/format.ts +++ b/src/lib/format.ts @@ -77,7 +77,7 @@ export function stringToColor(str: string) { let color = '#'; for (let i = 0; i < 3; i++) { const value = (hash >> (i * 8)) & 0xff; - color += ('00' + value.toString(16)).slice(-2); + color += `00${value.toString(16)}`.slice(-2); } return color; } diff --git a/src/lib/kafka.ts b/src/lib/kafka.ts index a81f3d4b..1d60e1f2 100644 --- a/src/lib/kafka.ts +++ b/src/lib/kafka.ts @@ -1,8 +1,8 @@ -import { serializeError } from 'serialize-error'; +import type * as tls from 'node:tls'; import debug from 'debug'; -import { Kafka, Producer, RecordMetadata, SASLOptions, logLevel } from 'kafkajs'; +import { Kafka, logLevel, type Producer, type RecordMetadata, type SASLOptions } from 'kafkajs'; +import { serializeError } from 'serialize-error'; import { KAFKA, KAFKA_PRODUCER } from '@/lib/db'; -import * as tls from 'tls'; const log = debug('umami:kafka'); const CONNECT_TIMEOUT = 5000; diff --git a/src/lib/lang.ts b/src/lib/lang.ts index 96acc369..f874640c 100644 --- a/src/lib/lang.ts +++ b/src/lib/lang.ts @@ -1,23 +1,24 @@ import { arSA, be, - bn, bg, + bn, bs, + ca, cs, - sk, da, de, el, - enUS, enGB, + enUS, es, + faIR, fi, fr, - faIR, he, hi, hr, + hu, id, it, ja, @@ -33,18 +34,17 @@ import { ptBR, ro, ru, + sk, sl, sv, ta, th, tr, uk, + uz, + vi, zhCN, zhTW, - ca, - hu, - vi, - uz, } from 'date-fns/locale'; export const languages = { diff --git a/src/lib/load.ts b/src/lib/load.ts index a831bc16..d4d6c3c7 100644 --- a/src/lib/load.ts +++ b/src/lib/load.ts @@ -1,4 +1,4 @@ -import { Website, Session } from '@/generated/prisma/client'; +import type { Session, Website } from '@/generated/prisma/client'; import redis from '@/lib/redis'; import { getWebsite } from '@/queries/prisma'; import { getWebsiteSession } from '@/queries/sql'; diff --git a/src/lib/params.ts b/src/lib/params.ts index 7f383a2e..ab2d5866 100644 --- a/src/lib/params.ts +++ b/src/lib/params.ts @@ -1,5 +1,5 @@ import { FILTER_COLUMNS, OPERATORS } from '@/lib/constants'; -import { Filter, QueryFilters, QueryOptions } from '@/lib/types'; +import type { Filter, QueryFilters, QueryOptions } from '@/lib/types'; export function parseFilterValue(param: any) { if (typeof param === 'string') { diff --git a/src/lib/react.ts b/src/lib/react.ts index decc1d6f..668cdf1f 100644 --- a/src/lib/react.ts +++ b/src/lib/react.ts @@ -1,16 +1,16 @@ import { Children, cloneElement, - FC, + type FC, Fragment, isValidElement, - ReactElement, - ReactNode, + type ReactElement, + type ReactNode, } from 'react'; export function getFragmentChildren(children: ReactNode) { return (children as ReactElement)?.type === Fragment - ? (children as ReactElement).props['children'] + ? (children as ReactElement).props.children : children; } diff --git a/src/lib/request.ts b/src/lib/request.ts index 32db8e95..42c44904 100644 --- a/src/lib/request.ts +++ b/src/lib/request.ts @@ -16,7 +16,7 @@ export async function parseRequest( const url = new URL(request.url); let query = Object.fromEntries(url.searchParams); let body = await getJsonBody(request); - let error: () => void | undefined; + let error: () => undefined | undefined; let auth = null; if (schema) { diff --git a/src/lib/schema.ts b/src/lib/schema.ts index 24ef99c3..38f7339a 100644 --- a/src/lib/schema.ts +++ b/src/lib/schema.ts @@ -116,8 +116,8 @@ export const goalReportSchema = z.object({ property: z.string().optional(), }) .refine(data => { - if (data['type'] === 'event' && data['property']) { - return data['operator'] && data['property']; + if (data.type === 'event' && data.property) { + return data.operator && data.property; } return true; }), diff --git a/src/lib/types.ts b/src/lib/types.ts index e5d4ecc5..e727c87a 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,6 +1,6 @@ -import { UseQueryOptions } from '@tanstack/react-query'; -import { DATA_TYPE, ROLES, OPERATORS } from './constants'; -import { TIME_UNIT } from './date'; +import type { UseQueryOptions } from '@tanstack/react-query'; +import type { DATA_TYPE, OPERATORS, ROLES } from './constants'; +import type { TIME_UNIT } from './date'; export type ObjectValues = T[keyof T]; diff --git a/src/permissions/index.ts b/src/permissions/index.ts index d0f6b53d..a70808e6 100644 --- a/src/permissions/index.ts +++ b/src/permissions/index.ts @@ -2,5 +2,5 @@ export * from './link'; export * from './pixel'; export * from './report'; export * from './team'; -export * from './website'; export * from './user'; +export * from './website'; diff --git a/src/permissions/link.ts b/src/permissions/link.ts index 8a10d512..c027a0b6 100644 --- a/src/permissions/link.ts +++ b/src/permissions/link.ts @@ -1,7 +1,7 @@ -import { Auth } from '@/lib/types'; -import { getLink, getTeamUser } from '@/queries/prisma'; import { hasPermission } from '@/lib/auth'; import { PERMISSIONS } from '@/lib/constants'; +import type { Auth } from '@/lib/types'; +import { getLink, getTeamUser } from '@/queries/prisma'; export async function canViewLink({ user }: Auth, linkId: string) { if (user?.isAdmin) { diff --git a/src/permissions/pixel.ts b/src/permissions/pixel.ts index 95bf0228..2131874f 100644 --- a/src/permissions/pixel.ts +++ b/src/permissions/pixel.ts @@ -1,7 +1,7 @@ -import { Auth } from '@/lib/types'; -import { getPixel, getTeamUser } from '@/queries/prisma'; import { hasPermission } from '@/lib/auth'; import { PERMISSIONS } from '@/lib/constants'; +import type { Auth } from '@/lib/types'; +import { getPixel, getTeamUser } from '@/queries/prisma'; export async function canViewPixel({ user }: Auth, pixelId: string) { if (user?.isAdmin) { diff --git a/src/permissions/report.ts b/src/permissions/report.ts index d7270ed3..01b54769 100644 --- a/src/permissions/report.ts +++ b/src/permissions/report.ts @@ -1,5 +1,5 @@ -import { Auth } from '@/lib/types'; -import { Report } from '@/generated/prisma/client'; +import type { Report } from '@/generated/prisma/client'; +import type { Auth } from '@/lib/types'; import { canViewWebsite } from './website'; export async function canViewReport(auth: Auth, report: Report) { @@ -7,7 +7,7 @@ export async function canViewReport(auth: Auth, report: Report) { return true; } - if (auth.user.id == report.userId) { + if (auth.user.id === report.userId) { return true; } @@ -19,7 +19,7 @@ export async function canUpdateReport({ user }: Auth, report: Report) { return true; } - return user.id == report.userId; + return user.id === report.userId; } export async function canDeleteReport(auth: Auth, report: Report) { diff --git a/src/permissions/team.ts b/src/permissions/team.ts index a62eff2e..0f07c1a4 100644 --- a/src/permissions/team.ts +++ b/src/permissions/team.ts @@ -1,7 +1,7 @@ -import { Auth } from '@/lib/types'; -import { PERMISSIONS } from '@/lib/constants'; -import { getTeamUser } from '@/queries/prisma'; import { hasPermission } from '@/lib/auth'; +import { PERMISSIONS } from '@/lib/constants'; +import type { Auth } from '@/lib/types'; +import { getTeamUser } from '@/queries/prisma'; export async function canViewTeam({ user }: Auth, teamId: string) { if (user.isAdmin) { diff --git a/src/permissions/user.ts b/src/permissions/user.ts index c9a9a5f5..2ed8f276 100644 --- a/src/permissions/user.ts +++ b/src/permissions/user.ts @@ -1,4 +1,4 @@ -import { Auth } from '@/lib/types'; +import type { Auth } from '@/lib/types'; export async function canCreateUser({ user }: Auth) { return user.isAdmin; diff --git a/src/permissions/website.ts b/src/permissions/website.ts index 8bd81517..97952eed 100644 --- a/src/permissions/website.ts +++ b/src/permissions/website.ts @@ -1,6 +1,6 @@ -import { Auth } from '@/lib/types'; -import { PERMISSIONS } from '@/lib/constants'; import { hasPermission } from '@/lib/auth'; +import { PERMISSIONS } from '@/lib/constants'; +import type { Auth } from '@/lib/types'; import { getLink, getPixel, getTeamUser, getWebsite } from '@/queries/prisma'; export async function canViewWebsite({ user, shareToken }: Auth, websiteId: string) { diff --git a/src/queries/prisma/link.ts b/src/queries/prisma/link.ts index 95e202b0..9b971dec 100644 --- a/src/queries/prisma/link.ts +++ b/src/queries/prisma/link.ts @@ -1,6 +1,6 @@ -import { Prisma } from '@/generated/prisma/client'; +import type { Prisma } from '@/generated/prisma/client'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export async function findLink(criteria: Prisma.LinkFindUniqueArgs) { return prisma.client.link.findUnique(criteria); diff --git a/src/queries/prisma/report.ts b/src/queries/prisma/report.ts index c612864d..4a5b755c 100644 --- a/src/queries/prisma/report.ts +++ b/src/queries/prisma/report.ts @@ -1,6 +1,7 @@ import { Prisma } from '@/generated/prisma/client'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; + import ReportFindManyArgs = Prisma.ReportFindManyArgs; async function findReport(criteria: Prisma.ReportFindUniqueArgs) { diff --git a/src/queries/prisma/segment.ts b/src/queries/prisma/segment.ts index f5507a4b..3a17d273 100644 --- a/src/queries/prisma/segment.ts +++ b/src/queries/prisma/segment.ts @@ -1,6 +1,6 @@ +import type { Prisma } from '@/generated/prisma/client'; import prisma from '@/lib/prisma'; -import { Prisma } from '@/generated/prisma/client'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; async function findSegment(criteria: Prisma.SegmentFindUniqueArgs) { return prisma.client.segment.findUnique(criteria); diff --git a/src/queries/prisma/team.ts b/src/queries/prisma/team.ts index 64ae0ec8..5987c1d7 100644 --- a/src/queries/prisma/team.ts +++ b/src/queries/prisma/team.ts @@ -1,8 +1,9 @@ -import { uuid } from '@/lib/crypto'; -import { Prisma, Team } from '@/generated/prisma/client'; +import { Prisma, type Team } from '@/generated/prisma/client'; import { ROLES } from '@/lib/constants'; +import { uuid } from '@/lib/crypto'; import prisma from '@/lib/prisma'; -import { PageResult, QueryFilters } from '@/lib/types'; +import type { PageResult, QueryFilters } from '@/lib/types'; + import TeamFindManyArgs = Prisma.TeamFindManyArgs; export async function findTeam(criteria: Prisma.TeamFindUniqueArgs): Promise { diff --git a/src/queries/prisma/teamUser.ts b/src/queries/prisma/teamUser.ts index d7c3807c..2210deeb 100644 --- a/src/queries/prisma/teamUser.ts +++ b/src/queries/prisma/teamUser.ts @@ -1,7 +1,8 @@ -import { uuid } from '@/lib/crypto'; import { Prisma } from '@/generated/prisma/client'; +import { uuid } from '@/lib/crypto'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; + import TeamUserFindManyArgs = Prisma.TeamUserFindManyArgs; export async function findTeamUser(criteria: Prisma.TeamUserFindUniqueArgs) { diff --git a/src/queries/prisma/user.ts b/src/queries/prisma/user.ts index c599e386..14376fc2 100644 --- a/src/queries/prisma/user.ts +++ b/src/queries/prisma/user.ts @@ -1,8 +1,9 @@ import { Prisma } from '@/generated/prisma/client'; import { ROLES } from '@/lib/constants'; -import prisma from '@/lib/prisma'; -import { Role, QueryFilters } from '@/lib/types'; import { getRandomChars } from '@/lib/generate'; +import prisma from '@/lib/prisma'; +import type { QueryFilters, Role } from '@/lib/types'; + import UserFindManyArgs = Prisma.UserFindManyArgs; export interface GetUserOptions { diff --git a/src/queries/prisma/website.ts b/src/queries/prisma/website.ts index cc5f2e6f..d6ba6d38 100644 --- a/src/queries/prisma/website.ts +++ b/src/queries/prisma/website.ts @@ -1,8 +1,8 @@ -import { Prisma } from '@/generated/prisma/client'; -import redis from '@/lib/redis'; -import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { Prisma } from '@/generated/prisma/client'; import { ROLES } from '@/lib/constants'; +import prisma from '@/lib/prisma'; +import redis from '@/lib/redis'; +import type { QueryFilters } from '@/lib/types'; export async function findWebsite(criteria: Prisma.WebsiteFindUniqueArgs) { return prisma.client.website.findUnique(criteria); diff --git a/src/queries/sql/events/getEventData.ts b/src/queries/sql/events/getEventData.ts index 269258a8..f12c95ca 100644 --- a/src/queries/sql/events/getEventData.ts +++ b/src/queries/sql/events/getEventData.ts @@ -1,7 +1,7 @@ -import { EventData } from '@/generated/prisma/client'; -import prisma from '@/lib/prisma'; +import type { EventData } from '@/generated/prisma/client'; import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; const FUNCTION_NAME = 'getEventData'; diff --git a/src/queries/sql/events/getEventDataEvents.ts b/src/queries/sql/events/getEventDataEvents.ts index 0d856371..6c8f12c1 100644 --- a/src/queries/sql/events/getEventDataEvents.ts +++ b/src/queries/sql/events/getEventDataEvents.ts @@ -1,7 +1,7 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventDataEvents'; diff --git a/src/queries/sql/events/getEventDataFields.ts b/src/queries/sql/events/getEventDataFields.ts index 42c46cd1..93377690 100644 --- a/src/queries/sql/events/getEventDataFields.ts +++ b/src/queries/sql/events/getEventDataFields.ts @@ -1,7 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventDataFields'; diff --git a/src/queries/sql/events/getEventDataProperties.ts b/src/queries/sql/events/getEventDataProperties.ts index 7a618fd2..82c078f8 100644 --- a/src/queries/sql/events/getEventDataProperties.ts +++ b/src/queries/sql/events/getEventDataProperties.ts @@ -1,7 +1,7 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventDataProperties'; diff --git a/src/queries/sql/events/getEventDataStats.ts b/src/queries/sql/events/getEventDataStats.ts index 28e2f4d0..89e13582 100644 --- a/src/queries/sql/events/getEventDataStats.ts +++ b/src/queries/sql/events/getEventDataStats.ts @@ -1,7 +1,7 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventDataStats'; diff --git a/src/queries/sql/events/getEventDataUsage.ts b/src/queries/sql/events/getEventDataUsage.ts index c72f5b3e..50613a7a 100644 --- a/src/queries/sql/events/getEventDataUsage.ts +++ b/src/queries/sql/events/getEventDataUsage.ts @@ -1,6 +1,6 @@ import clickhouse from '@/lib/clickhouse'; -import { CLICKHOUSE, PRISMA, runQuery, notImplemented } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import { CLICKHOUSE, notImplemented, PRISMA, runQuery } from '@/lib/db'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventDataUsage'; diff --git a/src/queries/sql/events/getEventDataValues.ts b/src/queries/sql/events/getEventDataValues.ts index e1975e2e..0426e646 100644 --- a/src/queries/sql/events/getEventDataValues.ts +++ b/src/queries/sql/events/getEventDataValues.ts @@ -1,7 +1,7 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventDataValues'; diff --git a/src/queries/sql/events/getEventExpandedMetrics.ts b/src/queries/sql/events/getEventExpandedMetrics.ts index fb200c4a..f03a347d 100644 --- a/src/queries/sql/events/getEventExpandedMetrics.ts +++ b/src/queries/sql/events/getEventExpandedMetrics.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_TYPE, FILTER_COLUMNS, SESSION_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventExpandedMetrics'; diff --git a/src/queries/sql/events/getEventMetrics.ts b/src/queries/sql/events/getEventMetrics.ts index 75e7574c..500c67e9 100644 --- a/src/queries/sql/events/getEventMetrics.ts +++ b/src/queries/sql/events/getEventMetrics.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_TYPE, FILTER_COLUMNS, SESSION_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventMetrics'; diff --git a/src/queries/sql/events/getEventStats.ts b/src/queries/sql/events/getEventStats.ts index baa6f700..81d12a0f 100644 --- a/src/queries/sql/events/getEventStats.ts +++ b/src/queries/sql/events/getEventStats.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_TYPE } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventStats'; diff --git a/src/queries/sql/events/getEventUsage.ts b/src/queries/sql/events/getEventUsage.ts index 0bd0a5f3..40f5a968 100644 --- a/src/queries/sql/events/getEventUsage.ts +++ b/src/queries/sql/events/getEventUsage.ts @@ -1,6 +1,6 @@ import clickhouse from '@/lib/clickhouse'; -import { CLICKHOUSE, PRISMA, runQuery, notImplemented } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import { CLICKHOUSE, notImplemented, PRISMA, runQuery } from '@/lib/db'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getEventUsage'; diff --git a/src/queries/sql/events/getWebsiteEvents.ts b/src/queries/sql/events/getWebsiteEvents.ts index fec9be36..f11d3ff1 100644 --- a/src/queries/sql/events/getWebsiteEvents.ts +++ b/src/queries/sql/events/getWebsiteEvents.ts @@ -1,7 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getWebsiteEvents'; diff --git a/src/queries/sql/events/saveEvent.ts b/src/queries/sql/events/saveEvent.ts index c8a9cbe9..7313fe47 100644 --- a/src/queries/sql/events/saveEvent.ts +++ b/src/queries/sql/events/saveEvent.ts @@ -1,7 +1,7 @@ -import { uuid } from '@/lib/crypto'; -import { EVENT_NAME_LENGTH, URL_LENGTH, PAGE_TITLE_LENGTH } from '@/lib/constants'; -import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import clickhouse from '@/lib/clickhouse'; +import { EVENT_NAME_LENGTH, PAGE_TITLE_LENGTH, URL_LENGTH } from '@/lib/constants'; +import { uuid } from '@/lib/crypto'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import kafka from '@/lib/kafka'; import prisma from '@/lib/prisma'; import { saveEventData } from './saveEventData'; diff --git a/src/queries/sql/events/saveEventData.ts b/src/queries/sql/events/saveEventData.ts index 0fb86937..b8b0e02f 100644 --- a/src/queries/sql/events/saveEventData.ts +++ b/src/queries/sql/events/saveEventData.ts @@ -1,11 +1,11 @@ +import clickhouse from '@/lib/clickhouse'; 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 { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import kafka from '@/lib/kafka'; import prisma from '@/lib/prisma'; -import { DynamicData } from '@/lib/types'; +import type { DynamicData } from '@/lib/types'; export interface SaveEventDataArgs { websiteId: string; diff --git a/src/queries/sql/getActiveVisitors.ts b/src/queries/sql/getActiveVisitors.ts index 20327424..d763c12e 100644 --- a/src/queries/sql/getActiveVisitors.ts +++ b/src/queries/sql/getActiveVisitors.ts @@ -1,7 +1,7 @@ import { subMinutes } from 'date-fns'; -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; -import { runQuery, CLICKHOUSE, PRISMA } from '@/lib/db'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; const FUNCTION_NAME = 'getActiveVisitors'; diff --git a/src/queries/sql/getChannelExpandedMetrics.ts b/src/queries/sql/getChannelExpandedMetrics.ts index 5ce884ad..33640d59 100644 --- a/src/queries/sql/getChannelExpandedMetrics.ts +++ b/src/queries/sql/getChannelExpandedMetrics.ts @@ -9,7 +9,7 @@ import { } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getChannelExpandedMetrics'; diff --git a/src/queries/sql/getChannelMetrics.ts b/src/queries/sql/getChannelMetrics.ts index a608ec5e..78e4142e 100644 --- a/src/queries/sql/getChannelMetrics.ts +++ b/src/queries/sql/getChannelMetrics.ts @@ -9,7 +9,7 @@ import { } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getChannelMetrics'; diff --git a/src/queries/sql/getRealtimeActivity.ts b/src/queries/sql/getRealtimeActivity.ts index d7aa06e9..075b65e2 100644 --- a/src/queries/sql/getRealtimeActivity.ts +++ b/src/queries/sql/getRealtimeActivity.ts @@ -1,7 +1,7 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; -import { runQuery, CLICKHOUSE, PRISMA } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getRealtimeActivity'; diff --git a/src/queries/sql/getRealtimeData.ts b/src/queries/sql/getRealtimeData.ts index 58384a54..4b97cb05 100644 --- a/src/queries/sql/getRealtimeData.ts +++ b/src/queries/sql/getRealtimeData.ts @@ -1,4 +1,4 @@ -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; import { getRealtimeActivity } from '@/queries/sql/getRealtimeActivity'; import { getPageviewStats } from '@/queries/sql/pageviews/getPageviewStats'; import { getSessionStats } from '@/queries/sql/sessions/getSessionStats'; diff --git a/src/queries/sql/getValues.ts b/src/queries/sql/getValues.ts index 6251fe3b..cc6bb7d2 100644 --- a/src/queries/sql/getValues.ts +++ b/src/queries/sql/getValues.ts @@ -1,7 +1,7 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; -import { runQuery, CLICKHOUSE, PRISMA } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getValues'; diff --git a/src/queries/sql/getWebsiteDateRange.ts b/src/queries/sql/getWebsiteDateRange.ts index 58d8ab25..d6333ad5 100644 --- a/src/queries/sql/getWebsiteDateRange.ts +++ b/src/queries/sql/getWebsiteDateRange.ts @@ -1,7 +1,7 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; -import { runQuery, CLICKHOUSE, PRISMA } from '@/lib/db'; import { DEFAULT_RESET_DATE } from '@/lib/constants'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; export async function getWebsiteDateRange(...args: [websiteId: string]) { return runQuery({ diff --git a/src/queries/sql/getWebsiteStats.ts b/src/queries/sql/getWebsiteStats.ts index 4a4bef78..69068394 100644 --- a/src/queries/sql/getWebsiteStats.ts +++ b/src/queries/sql/getWebsiteStats.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getWebsiteStats'; diff --git a/src/queries/sql/getWeeklyTraffic.ts b/src/queries/sql/getWeeklyTraffic.ts index ea202993..7bbe78a7 100644 --- a/src/queries/sql/getWeeklyTraffic.ts +++ b/src/queries/sql/getWeeklyTraffic.ts @@ -1,8 +1,8 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; -import { runQuery, PRISMA, CLICKHOUSE } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; import { EVENT_COLUMNS } from '@/lib/constants'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getWeeklyTraffic'; diff --git a/src/queries/sql/index.ts b/src/queries/sql/index.ts index 682ac6d2..1573bdef 100644 --- a/src/queries/sql/index.ts +++ b/src/queries/sql/index.ts @@ -1,41 +1,41 @@ export * from './events/getEventDataEvents'; export * from './events/getEventDataFields'; export * from './events/getEventDataProperties'; -export * from './events/getEventDataValues'; export * from './events/getEventDataStats'; export * from './events/getEventDataUsage'; -export * from './events/getEventMetrics'; +export * from './events/getEventDataValues'; export * from './events/getEventExpandedMetrics'; +export * from './events/getEventMetrics'; export * from './events/getEventStats'; -export * from './events/getWebsiteEvents'; export * from './events/getEventUsage'; +export * from './events/getWebsiteEvents'; export * from './events/saveEvent'; -export * from './reports/getFunnel'; -export * from './reports/getJourney'; -export * from './reports/getRetention'; -export * from './reports/getBreakdown'; -export * from './reports/getUTM'; -export * from './pageviews/getPageviewMetrics'; -export * from './pageviews/getPageviewExpandedMetrics'; -export * from './pageviews/getPageviewStats'; -export * from './sessions/createSession'; -export * from './sessions/getWebsiteSession'; -export * from './sessions/getSessionData'; -export * from './sessions/getSessionDataProperties'; -export * from './sessions/getSessionDataValues'; -export * from './sessions/getSessionMetrics'; -export * from './sessions/getSessionExpandedMetrics'; -export * from './sessions/getWebsiteSessions'; -export * from './sessions/getWebsiteSessionStats'; -export * from './sessions/getSessionActivity'; -export * from './sessions/getSessionStats'; -export * from './sessions/saveSessionData'; export * from './getActiveVisitors'; -export * from './getChannelMetrics'; export * from './getChannelExpandedMetrics'; +export * from './getChannelMetrics'; export * from './getRealtimeActivity'; export * from './getRealtimeData'; export * from './getValues'; export * from './getWebsiteDateRange'; export * from './getWebsiteStats'; export * from './getWeeklyTraffic'; +export * from './pageviews/getPageviewExpandedMetrics'; +export * from './pageviews/getPageviewMetrics'; +export * from './pageviews/getPageviewStats'; +export * from './reports/getBreakdown'; +export * from './reports/getFunnel'; +export * from './reports/getJourney'; +export * from './reports/getRetention'; +export * from './reports/getUTM'; +export * from './sessions/createSession'; +export * from './sessions/getSessionActivity'; +export * from './sessions/getSessionData'; +export * from './sessions/getSessionDataProperties'; +export * from './sessions/getSessionDataValues'; +export * from './sessions/getSessionExpandedMetrics'; +export * from './sessions/getSessionMetrics'; +export * from './sessions/getSessionStats'; +export * from './sessions/getWebsiteSession'; +export * from './sessions/getWebsiteSessionStats'; +export * from './sessions/getWebsiteSessions'; +export * from './sessions/saveSessionData'; diff --git a/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts b/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts index 2e234ab1..938b28ac 100644 --- a/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts +++ b/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { FILTER_COLUMNS, GROUPED_DOMAINS, SESSION_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getPageviewExpandedMetrics'; diff --git a/src/queries/sql/pageviews/getPageviewMetrics.ts b/src/queries/sql/pageviews/getPageviewMetrics.ts index 0a92e6af..9d4f6278 100644 --- a/src/queries/sql/pageviews/getPageviewMetrics.ts +++ b/src/queries/sql/pageviews/getPageviewMetrics.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_COLUMNS, FILTER_COLUMNS, SESSION_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getPageviewMetrics'; diff --git a/src/queries/sql/pageviews/getPageviewStats.ts b/src/queries/sql/pageviews/getPageviewStats.ts index a6619e87..251d5b14 100644 --- a/src/queries/sql/pageviews/getPageviewStats.ts +++ b/src/queries/sql/pageviews/getPageviewStats.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getPageviewStats'; diff --git a/src/queries/sql/reports/getAttribution.ts b/src/queries/sql/reports/getAttribution.ts index 9277bbf7..1d040781 100644 --- a/src/queries/sql/reports/getAttribution.ts +++ b/src/queries/sql/reports/getAttribution.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_TYPE } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export interface AttributionParameters { startDate: Date; diff --git a/src/queries/sql/reports/getBreakdown.ts b/src/queries/sql/reports/getBreakdown.ts index 6cea68f3..51773d86 100644 --- a/src/queries/sql/reports/getBreakdown.ts +++ b/src/queries/sql/reports/getBreakdown.ts @@ -1,8 +1,8 @@ -import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; import { EVENT_TYPE, FILTER_COLUMNS, SESSION_COLUMNS } from '@/lib/constants'; -import { QueryFilters } from '@/lib/types'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; export interface BreakdownParameters { startDate: Date; diff --git a/src/queries/sql/reports/getFunnel.ts b/src/queries/sql/reports/getFunnel.ts index ada5eeb2..4840123f 100644 --- a/src/queries/sql/reports/getFunnel.ts +++ b/src/queries/sql/reports/getFunnel.ts @@ -1,7 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export interface FunnelParameters { startDate: Date; diff --git a/src/queries/sql/reports/getGoal.ts b/src/queries/sql/reports/getGoal.ts index 702c160a..7e790ff4 100644 --- a/src/queries/sql/reports/getGoal.ts +++ b/src/queries/sql/reports/getGoal.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_TYPE } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export interface GoalParameters { startDate: Date; diff --git a/src/queries/sql/reports/getJourney.ts b/src/queries/sql/reports/getJourney.ts index 51e0d16f..283e0fad 100644 --- a/src/queries/sql/reports/getJourney.ts +++ b/src/queries/sql/reports/getJourney.ts @@ -1,7 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export interface JourneyParameters { startDate: Date; @@ -91,7 +91,7 @@ async function relationalQuery( // create start Step params query if (startStep) { startStepQuery = `and e1 = {{startStep}}`; - params['startStep'] = startStep; + params.startStep = startStep; } // create end Step params query @@ -102,7 +102,7 @@ async function relationalQuery( } endStepQuery += `\nor (e${steps} = {{endStep}}))`; - params['endStep'] = endStep; + params.endStep = endStep; } return { @@ -203,7 +203,7 @@ async function clickhouseQuery( // create start Step params query if (startStep) { startStepQuery = `and e1 = {startStep:String}`; - params['startStep'] = startStep; + params.startStep = startStep; } // create end Step params query @@ -214,7 +214,7 @@ async function clickhouseQuery( } endStepQuery += `\nor (e${steps} = {endStep:String}))`; - params['endStep'] = endStep; + params.endStep = endStep; } return { diff --git a/src/queries/sql/reports/getRetention.ts b/src/queries/sql/reports/getRetention.ts index d99098c0..87b55e03 100644 --- a/src/queries/sql/reports/getRetention.ts +++ b/src/queries/sql/reports/getRetention.ts @@ -1,7 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export interface RetentionParameters { startDate: Date; diff --git a/src/queries/sql/reports/getRevenue.ts b/src/queries/sql/reports/getRevenue.ts index 5771bdef..f5e3ec82 100644 --- a/src/queries/sql/reports/getRevenue.ts +++ b/src/queries/sql/reports/getRevenue.ts @@ -1,7 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export interface RevenuParameters { startDate: Date; diff --git a/src/queries/sql/reports/getUTM.ts b/src/queries/sql/reports/getUTM.ts index 5dee7a7b..4d43eb45 100644 --- a/src/queries/sql/reports/getUTM.ts +++ b/src/queries/sql/reports/getUTM.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_TYPE } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; export interface UTMParameters { column: string; diff --git a/src/queries/sql/sessions/createSession.ts b/src/queries/sql/sessions/createSession.ts index b5106a54..8d07a554 100644 --- a/src/queries/sql/sessions/createSession.ts +++ b/src/queries/sql/sessions/createSession.ts @@ -1,4 +1,4 @@ -import { Prisma } from '@/generated/prisma/client'; +import type { Prisma } from '@/generated/prisma/client'; import prisma from '@/lib/prisma'; const FUNCTION_NAME = 'createSession'; diff --git a/src/queries/sql/sessions/getSessionActivity.ts b/src/queries/sql/sessions/getSessionActivity.ts index 3dd4fa9d..af31fca6 100644 --- a/src/queries/sql/sessions/getSessionActivity.ts +++ b/src/queries/sql/sessions/getSessionActivity.ts @@ -1,7 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getSessionActivity'; diff --git a/src/queries/sql/sessions/getSessionData.ts b/src/queries/sql/sessions/getSessionData.ts index 09679fc8..8f1e4933 100644 --- a/src/queries/sql/sessions/getSessionData.ts +++ b/src/queries/sql/sessions/getSessionData.ts @@ -1,6 +1,6 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; -import { runQuery, PRISMA, CLICKHOUSE } from '@/lib/db'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; const FUNCTION_NAME = 'getSessionData'; diff --git a/src/queries/sql/sessions/getSessionDataProperties.ts b/src/queries/sql/sessions/getSessionDataProperties.ts index 96cc17bf..9b429f9b 100644 --- a/src/queries/sql/sessions/getSessionDataProperties.ts +++ b/src/queries/sql/sessions/getSessionDataProperties.ts @@ -1,7 +1,7 @@ import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getSessionDataProperties'; diff --git a/src/queries/sql/sessions/getSessionDataValues.ts b/src/queries/sql/sessions/getSessionDataValues.ts index 0093575d..5790141c 100644 --- a/src/queries/sql/sessions/getSessionDataValues.ts +++ b/src/queries/sql/sessions/getSessionDataValues.ts @@ -1,7 +1,7 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; -import { QueryFilters } from '@/lib/types'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getSessionDataValues'; diff --git a/src/queries/sql/sessions/getSessionExpandedMetrics.ts b/src/queries/sql/sessions/getSessionExpandedMetrics.ts index 1d211137..85c12939 100644 --- a/src/queries/sql/sessions/getSessionExpandedMetrics.ts +++ b/src/queries/sql/sessions/getSessionExpandedMetrics.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { FILTER_COLUMNS, SESSION_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getSessionExpandedMetrics'; diff --git a/src/queries/sql/sessions/getSessionMetrics.ts b/src/queries/sql/sessions/getSessionMetrics.ts index 7133332b..c519bdd0 100644 --- a/src/queries/sql/sessions/getSessionMetrics.ts +++ b/src/queries/sql/sessions/getSessionMetrics.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_COLUMNS, FILTER_COLUMNS, SESSION_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getSessionMetrics'; diff --git a/src/queries/sql/sessions/getSessionStats.ts b/src/queries/sql/sessions/getSessionStats.ts index ea93b226..fd457720 100644 --- a/src/queries/sql/sessions/getSessionStats.ts +++ b/src/queries/sql/sessions/getSessionStats.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getSessionStats'; diff --git a/src/queries/sql/sessions/getWebsiteSession.ts b/src/queries/sql/sessions/getWebsiteSession.ts index 36c48c20..3c160871 100644 --- a/src/queries/sql/sessions/getWebsiteSession.ts +++ b/src/queries/sql/sessions/getWebsiteSession.ts @@ -1,6 +1,6 @@ -import prisma from '@/lib/prisma'; import clickhouse from '@/lib/clickhouse'; -import { runQuery, PRISMA, CLICKHOUSE } from '@/lib/db'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; const FUNCTION_NAME = 'getWebsiteSession'; diff --git a/src/queries/sql/sessions/getWebsiteSessionStats.ts b/src/queries/sql/sessions/getWebsiteSessionStats.ts index 2e824f0d..a12e6c61 100644 --- a/src/queries/sql/sessions/getWebsiteSessionStats.ts +++ b/src/queries/sql/sessions/getWebsiteSessionStats.ts @@ -2,7 +2,7 @@ import clickhouse from '@/lib/clickhouse'; import { EVENT_COLUMNS } from '@/lib/constants'; import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getWebsiteSessionStats'; diff --git a/src/queries/sql/sessions/getWebsiteSessions.ts b/src/queries/sql/sessions/getWebsiteSessions.ts index 5ebd1740..df640d6d 100644 --- a/src/queries/sql/sessions/getWebsiteSessions.ts +++ b/src/queries/sql/sessions/getWebsiteSessions.ts @@ -1,8 +1,8 @@ import clickhouse from '@/lib/clickhouse'; -import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import { EVENT_COLUMNS } from '@/lib/constants'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; import prisma from '@/lib/prisma'; -import { QueryFilters } from '@/lib/types'; +import type { QueryFilters } from '@/lib/types'; const FUNCTION_NAME = 'getWebsiteSessions'; diff --git a/src/queries/sql/sessions/saveSessionData.ts b/src/queries/sql/sessions/saveSessionData.ts index cffe8e6e..74093177 100644 --- a/src/queries/sql/sessions/saveSessionData.ts +++ b/src/queries/sql/sessions/saveSessionData.ts @@ -1,11 +1,11 @@ +import clickhouse from '@/lib/clickhouse'; import { DATA_TYPE } from '@/lib/constants'; import { uuid } from '@/lib/crypto'; import { flattenJSON, getStringValue } from '@/lib/data'; -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'; +import prisma from '@/lib/prisma'; +import type { DynamicData } from '@/lib/types'; export interface SaveSessionDataArgs { websiteId: string; diff --git a/src/store/app.ts b/src/store/app.ts index 9ed3641c..bb54e565 100644 --- a/src/store/app.ts +++ b/src/store/app.ts @@ -8,8 +8,8 @@ import { THEME_CONFIG, TIMEZONE_CONFIG, } from '@/lib/constants'; -import { getItem } from '@/lib/storage'; import { getTimezone } from '@/lib/date'; +import { getItem } from '@/lib/storage'; const initialState = { locale: getItem(LOCALE_CONFIG) || process.env.defaultLocale || DEFAULT_LOCALE, diff --git a/src/store/version.ts b/src/store/version.ts index c6292419..95367afd 100644 --- a/src/store/version.ts +++ b/src/store/version.ts @@ -1,7 +1,7 @@ -import { create } from 'zustand'; import { produce } from 'immer'; import semver from 'semver'; -import { CURRENT_VERSION, VERSION_CHECK, UPDATES_URL } from '@/lib/constants'; +import { create } from 'zustand'; +import { CURRENT_VERSION, UPDATES_URL, VERSION_CHECK } from '@/lib/constants'; import { getItem } from '@/lib/storage'; const initialState = { diff --git a/src/store/websites.ts b/src/store/websites.ts index fe5c1f92..4ddcab05 100644 --- a/src/store/websites.ts +++ b/src/store/websites.ts @@ -1,6 +1,6 @@ -import { create } from 'zustand'; import { produce } from 'immer'; -import { DateRange } from '@/lib/types'; +import { create } from 'zustand'; +import type { DateRange } from '@/lib/types'; const store = create(() => ({})); diff --git a/src/tracker/index.d.ts b/src/tracker/index.d.ts index 05497da2..32fbee97 100644 --- a/src/tracker/index.d.ts +++ b/src/tracker/index.d.ts @@ -148,6 +148,6 @@ export type UmamiTracker = { }; }; -interface Window { +export interface Window { umami: UmamiTracker; } diff --git a/src/tracker/index.js b/src/tracker/index.js index a9966198..ad3648ac 100644 --- a/src/tracker/index.js +++ b/src/tracker/index.js @@ -19,16 +19,16 @@ const _true = 'true'; const attr = currentScript.getAttribute.bind(currentScript); - const website = attr(_data + 'website-id'); - const hostUrl = attr(_data + 'host-url'); - const beforeSend = attr(_data + 'before-send'); - const tag = attr(_data + 'tag') || undefined; - const autoTrack = attr(_data + 'auto-track') !== _false; - const dnt = attr(_data + 'do-not-track') === _true; - const excludeSearch = attr(_data + 'exclude-search') === _true; - const excludeHash = attr(_data + 'exclude-hash') === _true; - const domain = attr(_data + 'domains') || ''; - const credentials = attr(_data + 'fetch-credentials') || 'omit'; + const website = attr(`${_data}website-id`); + const hostUrl = attr(`${_data}host-url`); + const beforeSend = attr(`${_data}before-send`); + const tag = attr(`${_data}tag`) || undefined; + const autoTrack = attr(`${_data}auto-track`) !== _false; + const dnt = attr(`${_data}do-not-track`) === _true; + const excludeSearch = attr(`${_data}exclude-search`) === _true; + const excludeHash = attr(`${_data}exclude-hash`) === _true; + const domain = attr(`${_data}domains`) || ''; + const credentials = attr(`${_data}fetch-credentials`) || 'omit'; const domains = domain.split(',').map(n => n.trim()); const host = @@ -36,7 +36,7 @@ const endpoint = `${host.replace(/\/$/, '')}__COLLECT_API_ENDPOINT__`; const screen = `${width}x${height}`; const eventRegex = /data-umami-event-([\w-_]+)/; - const eventNameAttribute = _data + 'umami-event'; + const eventNameAttribute = `${_data}umami-event`; const delayDuration = 300; /* Helper functions */ @@ -144,7 +144,7 @@ const trackingDisabled = () => disabled || !website || - (localStorage && localStorage.getItem('umami.disabled')) || + localStorage?.getItem('umami.disabled') || (domain && !domains.includes(hostname)) || (dnt && hasDoNotTrack()); @@ -177,7 +177,7 @@ cache = data.cache; } // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (e) { + } catch (_e) { /* no-op */ } }; From 2b34cbeb37f5bfa51c7b7b372369425baabec739 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Mon, 24 Nov 2025 08:07:31 +0800 Subject: [PATCH 12/45] Fixed `/api/batch` request recreation failure --- src/app/api/batch/route.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/app/api/batch/route.ts b/src/app/api/batch/route.ts index 6feab06b..aae14c96 100644 --- a/src/app/api/batch/route.ts +++ b/src/app/api/batch/route.ts @@ -18,7 +18,20 @@ export async function POST(request: Request) { let index = 0; for (const data of body) { - const newRequest = new Request(request, { body: JSON.stringify(data) }); + // Recreate a fresh Request since `new Request(request)` will have the following error: + // > Cannot read private member #state from an object whose class did not declare it + + // Copy headers we received, ensure JSON content type, and avoid conflicting content-length + const headers = new Headers(request.headers); + headers.set('content-type', 'application/json'); + headers.delete('content-length'); + + const newRequest = new Request(request.url, { + method: 'POST', + headers, + body: JSON.stringify(data), + }); + const response = await send.POST(newRequest); if (!response.ok) { From 67e1af7e55c3a7649a487e56f1d29d2cdc488539 Mon Sep 17 00:00:00 2001 From: Travis Zhang Date: Tue, 25 Nov 2025 21:13:35 +0800 Subject: [PATCH 13/45] fix: fix SQL syntax error in getPageviewExpandedMetrics query --- src/queries/sql/pageviews/getPageviewExpandedMetrics.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts b/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts index 2e234ab1..038cb05e 100644 --- a/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts +++ b/src/queries/sql/pageviews/getPageviewExpandedMetrics.ts @@ -86,7 +86,7 @@ async function relationalQuery( sum(${getTimestampDiffSQL('t.min_time', 't.max_time')}) as "totaltime" from ( select - ${column} name, + ${column} as name, website_event.session_id, website_event.visit_id, count(*) as "c", @@ -101,7 +101,7 @@ async function relationalQuery( and website_event.event_type != 2 ${excludeDomain} ${filterQuery} - group by name, website_event.session_id, website_event.visit_id + group by ${column}, website_event.session_id, website_event.visit_id ) as t where name != '' group by name From ac6ed9d76233b755ee58e9816f008b4b1d4f68fa Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 26 Nov 2025 11:01:58 -0800 Subject: [PATCH 14/45] add case-insensitivity to currency comparison --- src/queries/sql/reports/getRevenue.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/queries/sql/reports/getRevenue.ts b/src/queries/sql/reports/getRevenue.ts index 5771bdef..b9e49dc8 100644 --- a/src/queries/sql/reports/getRevenue.ts +++ b/src/queries/sql/reports/getRevenue.ts @@ -62,7 +62,7 @@ async function relationalQuery( ${joinSessionQuery} where revenue.website_id = {{websiteId::uuid}} and revenue.created_at between {{startDate}} and {{endDate}} - and revenue.currency ilike {{currency}} + and revenue.currency = upper({{currency}}) ${filterQuery} group by x, t order by t @@ -83,7 +83,7 @@ async function relationalQuery( ${cohortQuery} where revenue.website_id = {{websiteId::uuid}} and revenue.created_at between {{startDate}} and {{endDate}} - and revenue.currency ilike {{currency}} + and revenue.currency = upper({{currency}}) ${filterQuery} group by session.country `, @@ -102,7 +102,7 @@ async function relationalQuery( ${joinSessionQuery} where revenue.website_id = {{websiteId::uuid}} and revenue.created_at between {{startDate}} and {{endDate}} - and revenue.currency ilike {{currency}} + and revenue.currency = upper({{currency}}) ${filterQuery} `, queryParams, @@ -154,7 +154,7 @@ async function clickhouseQuery( ${cohortQuery} where website_revenue.website_id = {websiteId:UUID} and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64} - and website_revenue.currency = {currency:String} + and website_revenue.currency = upper({currency:String}) ${filterQuery} group by x, t order by t @@ -182,7 +182,7 @@ async function clickhouseQuery( ${cohortQuery} where website_revenue.website_id = {websiteId:UUID} and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64} - and website_revenue.currency = {currency:String} + and website_revenue.currency = upper({currency:String}) ${filterQuery} group by website_event.country order by value desc @@ -205,7 +205,7 @@ async function clickhouseQuery( ${cohortQuery} where website_revenue.website_id = {websiteId:UUID} and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64} - and website_revenue.currency = {currency:String} + and website_revenue.currency = upper({currency:String}) ${filterQuery} `, queryParams, From 3cc2c5b7a8a2d9444552a8f65439bcde255486cd Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 26 Nov 2025 11:09:21 -0800 Subject: [PATCH 15/45] downgrade prisma until 3.1 release --- package.json | 6 +- pnpm-lock.yaml | 432 ++++++------------------------------------- prisma/schema.prisma | 1 + 3 files changed, 61 insertions(+), 378 deletions(-) diff --git a/package.json b/package.json index 306e10f3..077b74d3 100644 --- a/package.json +++ b/package.json @@ -66,8 +66,8 @@ "@dicebear/core": "^9.2.3", "@fontsource/inter": "^5.2.8", "@hello-pangea/dnd": "^17.0.0", - "@prisma/adapter-pg": "^7.0.0", - "@prisma/client": "^7.0.0", + "@prisma/adapter-pg": "^6.18.0", + "@prisma/client": "^6.18.0", "@prisma/extension-read-replicas": "^0.4.1", "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", @@ -106,7 +106,7 @@ "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", "pg": "^8.16.3", - "prisma": "^7.0.0", + "prisma": "^6.18.0", "pure-rand": "^7.0.1", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5db0535d..0a4577c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,14 +27,14 @@ importers: specifier: ^17.0.0 version: 17.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@prisma/adapter-pg': - specifier: ^7.0.0 - version: 7.0.0 + specifier: ^6.18.0 + version: 6.19.0 '@prisma/client': - specifier: ^7.0.0 - version: 7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + specifier: ^6.18.0 + version: 6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3) '@prisma/extension-read-replicas': specifier: ^0.4.1 - version: 0.4.1(@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)) + version: 0.4.1(@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3)) '@react-spring/web': specifier: ^10.0.3 version: 10.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -147,8 +147,8 @@ importers: specifier: ^8.16.3 version: 8.16.3 prisma: - specifier: ^7.0.0 - version: 7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: ^6.18.0 + version: 6.19.0(typescript@5.9.3) pure-rand: specifier: ^7.0.1 version: 7.0.1 @@ -328,8 +328,6 @@ importers: specifier: ^5.9.3 version: 5.9.3 - dist: {} - packages: '@ampproject/remapping@2.3.0': @@ -558,18 +556,6 @@ packages: cpu: [x64] os: [win32] - '@chevrotain/cst-dts-gen@10.5.0': - resolution: {integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==} - - '@chevrotain/gast@10.5.0': - resolution: {integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==} - - '@chevrotain/types@10.5.0': - resolution: {integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==} - - '@chevrotain/utils@10.5.0': - resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==} - '@clickhouse/client-common@1.14.0': resolution: {integrity: sha512-CyUcv2iCkZ1A++vmOSufYRpHR3aAWVfbrWed7ATzf0yyx/BW/2SEqlL07vBpSRa3BIkQe/DSOHVv8JkWZpUOwQ==} @@ -898,20 +884,6 @@ packages: peerDependencies: '@dicebear/core': ^9.0.0 - '@electric-sql/pglite-socket@0.0.6': - resolution: {integrity: sha512-6RjmgzphIHIBA4NrMGJsjNWK4pu+bCWJlEWlwcxFTVY3WT86dFpKwbZaGWZV6C5Rd7sCk1Z0CI76QEfukLAUXw==} - hasBin: true - peerDependencies: - '@electric-sql/pglite': 0.3.2 - - '@electric-sql/pglite-tools@0.2.7': - resolution: {integrity: sha512-9dAccClqxx4cZB+Ar9B+FZ5WgxDc/Xvl9DPrTWv+dYTf0YNubLzi4wHHRGRGhrJv15XwnyKcGOZAP1VXSneSUg==} - peerDependencies: - '@electric-sql/pglite': 0.3.2 - - '@electric-sql/pglite@0.3.2': - resolution: {integrity: sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==} - '@emnapi/runtime@1.5.0': resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} @@ -1309,12 +1281,6 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@hono/node-server@1.14.2': - resolution: {integrity: sha512-GHjpOeHYbr9d1vkID2sNUYkl5IxumyhDrUJB7wBp7jvqYwPFt+oNKsAPBRcdSbV7kIrXhouLE199ks1QcK4r7A==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} @@ -1718,10 +1684,6 @@ packages: '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} - '@mrleebo/prisma-ast@0.12.1': - resolution: {integrity: sha512-JwqeCQ1U3fvccttHZq7Tk0m/TMC6WcFAQZdukypW3AzlJYKYTGNVd1ANU2GuhKnv4UQuOFj3oAl0LLG/gxFN1w==} - engines: {node: '>=16'} - '@netlify/plugin-nextjs@5.14.7': resolution: {integrity: sha512-RJRPGIlaY3M4KA6GxpOlynCPUKCVbtkHwg4ccHhoSVrHgysW3nqw1pX+FBvlBexrUl1JO2zuDFh4enRal9BpAw==} engines: {node: '>=18.0.0'} @@ -1844,68 +1806,46 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@prisma/adapter-pg@7.0.0': - resolution: {integrity: sha512-cis1Ib+TVbtSi2VU5Zm1fSmAcA8jg7KwUTbJ6LcWIm1eww380utXM8G23F3UCEPOJO4HiKt6adP/Q1hukjAkgw==} + '@prisma/adapter-pg@6.19.0': + resolution: {integrity: sha512-F8f2kvU+igmxERA9oM+D2maMaxrST1P6vO7ayvdlAdcJI47nKNPdkLBGZKic9otghfA9CQnjNOGB56q2VXqnHw==} - '@prisma/client-runtime-utils@7.0.0': - resolution: {integrity: sha512-PAiFgMBPrLSaakBwUpML5NevipuKSL3rtNr8pZ8CZ3OBXo0BFcdeGcBIKw/CxJP6H4GNa4+l5bzJPrk8Iq6tDw==} - - '@prisma/client@7.0.0': - resolution: {integrity: sha512-FM1NtJezl0zH3CybLxcbJwShJt7xFGSRg+1tGhy3sCB8goUDnxnBR+RC/P35EAW8gjkzx7kgz7bvb0MerY2VSw==} - engines: {node: ^20.19 || ^22.12 || ^24.0} + '@prisma/client@6.19.0': + resolution: {integrity: sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==} + engines: {node: '>=18.18'} peerDependencies: prisma: '*' - typescript: '>=5.4.0' + typescript: '>=5.1.0' peerDependenciesMeta: prisma: optional: true typescript: optional: true - '@prisma/config@7.0.0': - resolution: {integrity: sha512-TDASB57hyGUwHB0IPCSkoJcXFrJOKA1+R/1o4np4PbS+E0F5MiY5aAyUttO0mSuNQaX7t8VH/GkDemffF1mQzg==} + '@prisma/config@6.19.0': + resolution: {integrity: sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==} - '@prisma/debug@6.8.2': - resolution: {integrity: sha512-4muBSSUwJJ9BYth5N8tqts8JtiLT8QI/RSAzEogwEfpbYGFo9mYsInsVo8dqXdPO2+Rm5OG5q0qWDDE3nyUbVg==} + '@prisma/debug@6.19.0': + resolution: {integrity: sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==} - '@prisma/debug@7.0.0': - resolution: {integrity: sha512-SdS3qzfMASHtWimywtkiRcJtrHzacbmMVhElko3DYUZSB0TTLqRYWpddRBJdeGgSLmy1FD55p7uGzIJ+MtfhMg==} + '@prisma/driver-adapter-utils@6.19.0': + resolution: {integrity: sha512-VAC/wFebV569Jk7iEqzLxekM2A5toKYAr6cPM2KWVHiRHgyjsh/IHf++Xo67q8uor/JxY8mwOuyQyuxkstSf5w==} - '@prisma/dev@0.13.0': - resolution: {integrity: sha512-QMmF6zFeUF78yv1HYbHvod83AQnl7u6NtKyDhTRZOJup3h1icWs8R7RUVxBJZvM2tBXNAMpLQYYM/8kPlOPegA==} + '@prisma/engines-version@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': + resolution: {integrity: sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==} - '@prisma/driver-adapter-utils@7.0.0': - resolution: {integrity: sha512-ZEvzFaIapnfNKFPgZu/Zy4g6jfO5C0ZmMp+IjO9hNKNDwVKrDlBKw7F3Y9oRK0U0kfb9lKWP4Dz7DgtKs4TTbA==} - - '@prisma/engines-version@6.20.0-16.next-0c19ccc313cf9911a90d99d2ac2eb0280c76c513': - resolution: {integrity: sha512-7bzyN8Gp9GbDFbTDzVUH9nFcgRWvsWmjrGgBJvIC/zEoAuv/lx62gZXgAKfjn/HoPkxz/dS+TtsnduFx8WA+cw==} - - '@prisma/engines@7.0.0': - resolution: {integrity: sha512-ojCL3OFLMCz33UbU9XwH32jwaeM+dWb8cysTuY8eK6ZlMKXJdy6ogrdG3MGB3meKLGdQBmOpUUGJ7eLIaxbrcg==} + '@prisma/engines@6.19.0': + resolution: {integrity: sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==} '@prisma/extension-read-replicas@0.4.1': resolution: {integrity: sha512-mCMDloqUKUwx2o5uedTs1FHX3Nxdt1GdRMoeyp1JggjiwOALmIYWhxfIN08M2BZ0w8SKwvJqicJZMjkQYkkijw==} peerDependencies: '@prisma/client': ^6.5.0 - '@prisma/fetch-engine@7.0.0': - resolution: {integrity: sha512-qcyWTeWDjVDaDQSrVIymZU1xCYlvmwCzjA395lIuFjUESOH3YQCb8i/hpd4vopfq3fUR4v6+MjjtIGvnmErQgw==} + '@prisma/fetch-engine@6.19.0': + resolution: {integrity: sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==} - '@prisma/get-platform@6.8.2': - resolution: {integrity: sha512-vXSxyUgX3vm1Q70QwzwkjeYfRryIvKno1SXbIqwSptKwqKzskINnDUcx85oX+ys6ooN2ATGSD0xN2UTfg6Zcow==} - - '@prisma/get-platform@7.0.0': - resolution: {integrity: sha512-zyhzrAa+y/GfyCzTnuk0D9lfkvDzo7IbsNyuhTqhPu/AN0txm0x26HAR4tJLismla/fHf5fBzYwSivYSzkpakg==} - - '@prisma/query-plan-executor@6.18.0': - resolution: {integrity: sha512-jZ8cfzFgL0jReE1R10gT8JLHtQxjWYLiQ//wHmVYZ2rVkFHoh0DT8IXsxcKcFlfKN7ak7k6j0XMNn2xVNyr5cA==} - - '@prisma/studio-core-licensed@0.8.0': - resolution: {integrity: sha512-SXCcgFvo/SC6/11kEOaQghJgCWNEWZUvPYKn/gpvMB9HLSG/5M8If7dWZtEQHhchvl8bh9A89Hw6mEKpsXFimA==} - peerDependencies: - '@types/react': ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 + '@prisma/get-platform@6.19.0': + resolution: {integrity: sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==} '@react-aria/autocomplete@3.0.0-rc.3': resolution: {integrity: sha512-vemf7h3hvIDk3MxiiPryysfYgJDg8R72X46dRIeg0+cXKYxjPYou64/DTucSV2z5J6RC5JalINu0jIDaLhEILw==} @@ -3178,10 +3118,6 @@ packages: aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - aws-ssl-profiles@1.1.2: - resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} - engines: {node: '>= 6.0.0'} - aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} @@ -3375,9 +3311,6 @@ packages: resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} engines: {node: '>= 0.8.0'} - chevrotain@10.5.0: - resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -3823,10 +3756,6 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} @@ -4202,9 +4131,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - generic-names@4.0.0: resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} @@ -4232,9 +4158,6 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-port-please@3.1.2: - resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -4316,9 +4239,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grammex@3.1.11: - resolution: {integrity: sha512-HNwLkgRg9SqTAd1N3Uh/MnKwTBTzwBxTOPbXQ8pb0tpwydjk90k4zRE8JUn9fMUiRwKtXFZ1TWFmms3dZHN+Fg==} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -4366,10 +4286,6 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - hono@4.7.10: - resolution: {integrity: sha512-QkACju9MiN59CKSY5JsGZCYmPZkA6sIW6OFCUp7qDjZu6S6KHtJHhAc9Uy9mV9F8PJ1/HQ3ybZF2yjCa/73fvQ==} - engines: {node: '>=16.9.0'} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -4388,9 +4304,6 @@ packages: resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} engines: {node: '>=0.10'} - http-status-codes@2.3.0: - resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} - human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -4404,10 +4317,6 @@ packages: engines: {node: '>=18'} hasBin: true - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} - engines: {node: '>=0.10.0'} - icss-replace-symbols@1.1.0: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} @@ -4637,9 +4546,6 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -5115,9 +5021,6 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -5139,14 +5042,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - lru.min@1.1.3: - resolution: {integrity: sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==} - engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} - lucide-react@0.511.0: resolution: {integrity: sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==} peerDependencies: @@ -5313,17 +5208,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mysql2@3.15.3: - resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} - engines: {node: '>= 8.0'} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} - nano-spawn@2.0.0: resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} @@ -6123,10 +6010,6 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - postgres@3.4.7: - resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} - engines: {node: '>=12'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -6144,16 +6027,13 @@ packages: resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - prisma@7.0.0: - resolution: {integrity: sha512-VZObZ1pQV/OScarYg68RYUx61GpFLH2mJGf9fUX4XxQxTst/6ZK7nkY86CSZ3zBW6U9lKRTsBrZWVz20X5G/KQ==} - engines: {node: ^20.19 || ^22.12 || ^24.0} + prisma@6.19.0: + resolution: {integrity: sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==} + engines: {node: '>=18.18'} hasBin: true peerDependencies: - better-sqlite3: '>=9.0.0' - typescript: '>=5.4.0' + typescript: '>=5.1.0' peerDependenciesMeta: - better-sqlite3: - optional: true typescript: optional: true @@ -6175,9 +6055,6 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - proxy-from-env@1.0.0: resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} @@ -6362,16 +6239,10 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regexp-to-ast@0.5.0: - resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - remeda@2.21.3: - resolution: {integrity: sha512-XXrZdLA10oEOQhLLzEJEiFFSKi21REGAkHdImIb4rt/XXy8ORGXh5HCcpUOsElfPNDb+X6TA/+wkh+p2KffYmg==} - request-ip@3.3.0: resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==} @@ -6415,10 +6286,6 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6523,9 +6390,6 @@ packages: engines: {node: '>=10'} hasBin: true - seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - serialize-error@12.0.0: resolution: {integrity: sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==} engines: {node: '>=18'} @@ -6672,10 +6536,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} - sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} @@ -6689,9 +6549,6 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -7167,14 +7024,6 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - valibot@1.1.0: - resolution: {integrity: sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -7313,9 +7162,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zeptomatch@2.0.2: - resolution: {integrity: sha512-H33jtSKf8Ijtb5BW6wua3G5DhnFjbFML36eFu+VdOoVY4HD9e7ggjqdM6639B+L87rjnR6Y+XeRzBXZdy52B/g==} - zod@4.1.12: resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} @@ -7570,21 +7416,6 @@ snapshots: '@biomejs/cli-win32-x64@2.3.7': optional: true - '@chevrotain/cst-dts-gen@10.5.0': - dependencies: - '@chevrotain/gast': 10.5.0 - '@chevrotain/types': 10.5.0 - lodash: 4.17.21 - - '@chevrotain/gast@10.5.0': - dependencies: - '@chevrotain/types': 10.5.0 - lodash: 4.17.21 - - '@chevrotain/types@10.5.0': {} - - '@chevrotain/utils@10.5.0': {} - '@clickhouse/client-common@1.14.0': {} '@clickhouse/client@1.14.0': @@ -7879,16 +7710,6 @@ snapshots: dependencies: '@dicebear/core': 9.2.4 - '@electric-sql/pglite-socket@0.0.6(@electric-sql/pglite@0.3.2)': - dependencies: - '@electric-sql/pglite': 0.3.2 - - '@electric-sql/pglite-tools@0.2.7(@electric-sql/pglite@0.3.2)': - dependencies: - '@electric-sql/pglite': 0.3.2 - - '@electric-sql/pglite@0.3.2': {} - '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 @@ -8183,10 +8004,6 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@hono/node-server@1.14.2(hono@4.7.10)': - dependencies: - hono: 4.7.10 - '@img/colour@1.0.0': optional: true @@ -8627,11 +8444,6 @@ snapshots: '@kurkle/color@0.3.4': {} - '@mrleebo/prisma-ast@0.12.1': - dependencies: - chevrotain: 10.5.0 - lilconfig: 2.1.0 - '@netlify/plugin-nextjs@5.14.7': {} '@next/env@15.5.3': {} @@ -8701,24 +8513,20 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@prisma/adapter-pg@7.0.0': + '@prisma/adapter-pg@6.19.0': dependencies: - '@prisma/driver-adapter-utils': 7.0.0 + '@prisma/driver-adapter-utils': 6.19.0 pg: 8.16.3 postgres-array: 3.0.4 transitivePeerDependencies: - pg-native - '@prisma/client-runtime-utils@7.0.0': {} - - '@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3)': - dependencies: - '@prisma/client-runtime-utils': 7.0.0 + '@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3)': optionalDependencies: - prisma: 7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + prisma: 6.19.0(typescript@5.9.3) typescript: 5.9.3 - '@prisma/config@7.0.0': + '@prisma/config@6.19.0': dependencies: c12: 3.1.0 deepmerge-ts: 7.1.5 @@ -8727,70 +8535,34 @@ snapshots: transitivePeerDependencies: - magicast - '@prisma/debug@6.8.2': {} + '@prisma/debug@6.19.0': {} - '@prisma/debug@7.0.0': {} - - '@prisma/dev@0.13.0(typescript@5.9.3)': + '@prisma/driver-adapter-utils@6.19.0': dependencies: - '@electric-sql/pglite': 0.3.2 - '@electric-sql/pglite-socket': 0.0.6(@electric-sql/pglite@0.3.2) - '@electric-sql/pglite-tools': 0.2.7(@electric-sql/pglite@0.3.2) - '@hono/node-server': 1.14.2(hono@4.7.10) - '@mrleebo/prisma-ast': 0.12.1 - '@prisma/get-platform': 6.8.2 - '@prisma/query-plan-executor': 6.18.0 - foreground-child: 3.3.1 - get-port-please: 3.1.2 - hono: 4.7.10 - http-status-codes: 2.3.0 - pathe: 2.0.3 - proper-lockfile: 4.1.2 - remeda: 2.21.3 - std-env: 3.9.0 - valibot: 1.1.0(typescript@5.9.3) - zeptomatch: 2.0.2 - transitivePeerDependencies: - - typescript + '@prisma/debug': 6.19.0 - '@prisma/driver-adapter-utils@7.0.0': + '@prisma/engines-version@6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773': {} + + '@prisma/engines@6.19.0': dependencies: - '@prisma/debug': 7.0.0 + '@prisma/debug': 6.19.0 + '@prisma/engines-version': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 + '@prisma/fetch-engine': 6.19.0 + '@prisma/get-platform': 6.19.0 - '@prisma/engines-version@6.20.0-16.next-0c19ccc313cf9911a90d99d2ac2eb0280c76c513': {} - - '@prisma/engines@7.0.0': + '@prisma/extension-read-replicas@0.4.1(@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3))': dependencies: - '@prisma/debug': 7.0.0 - '@prisma/engines-version': 6.20.0-16.next-0c19ccc313cf9911a90d99d2ac2eb0280c76c513 - '@prisma/fetch-engine': 7.0.0 - '@prisma/get-platform': 7.0.0 + '@prisma/client': 6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3) - '@prisma/extension-read-replicas@0.4.1(@prisma/client@7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3))': + '@prisma/fetch-engine@6.19.0': dependencies: - '@prisma/client': 7.0.0(prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(typescript@5.9.3) + '@prisma/debug': 6.19.0 + '@prisma/engines-version': 6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773 + '@prisma/get-platform': 6.19.0 - '@prisma/fetch-engine@7.0.0': + '@prisma/get-platform@6.19.0': dependencies: - '@prisma/debug': 7.0.0 - '@prisma/engines-version': 6.20.0-16.next-0c19ccc313cf9911a90d99d2ac2eb0280c76c513 - '@prisma/get-platform': 7.0.0 - - '@prisma/get-platform@6.8.2': - dependencies: - '@prisma/debug': 6.8.2 - - '@prisma/get-platform@7.0.0': - dependencies: - '@prisma/debug': 7.0.0 - - '@prisma/query-plan-executor@6.18.0': {} - - '@prisma/studio-core-licensed@0.8.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': - dependencies: - '@types/react': 19.2.6 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@prisma/debug': 6.19.0 '@react-aria/autocomplete@3.0.0-rc.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: @@ -10528,8 +10300,6 @@ snapshots: aws-sign2@0.7.0: {} - aws-ssl-profiles@1.1.2: {} - aws4@1.13.2: {} babel-jest@29.7.0(@babel/core@7.28.3): @@ -10765,15 +10535,6 @@ snapshots: check-more-types@2.24.0: {} - chevrotain@10.5.0: - dependencies: - '@chevrotain/cst-dts-gen': 10.5.0 - '@chevrotain/gast': 10.5.0 - '@chevrotain/types': 10.5.0 - '@chevrotain/utils': 10.5.0 - lodash: 4.17.21 - regexp-to-ast: 0.5.0 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -11270,8 +11031,6 @@ snapshots: delayed-stream@1.0.0: {} - denque@2.1.0: {} - destr@2.0.5: {} detect-browser@5.3.0: {} @@ -11781,10 +11540,6 @@ snapshots: functions-have-names@1.2.3: {} - generate-function@2.3.1: - dependencies: - is-property: 1.0.2 - generic-names@4.0.0: dependencies: loader-utils: 3.3.1 @@ -11812,8 +11567,6 @@ snapshots: get-package-type@0.1.0: {} - get-port-please@3.1.2: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -11932,8 +11685,6 @@ snapshots: graceful-fs@4.2.11: {} - grammex@3.1.11: {} - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -11975,8 +11726,6 @@ snapshots: dependencies: react-is: 16.13.1 - hono@4.7.10: {} - hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -11993,18 +11742,12 @@ snapshots: jsprim: 2.0.2 sshpk: 1.18.0 - http-status-codes@2.3.0: {} - human-signals@1.1.1: {} human-signals@2.1.0: {} husky@9.1.7: {} - iconv-lite@0.7.0: - dependencies: - safer-buffer: 2.1.2 - icss-replace-symbols@1.1.0: {} icss-utils@5.1.0(postcss@8.5.6): @@ -12196,8 +11939,6 @@ snapshots: is-plain-object@5.0.0: {} - is-property@1.0.2: {} - is-reference@1.2.1: dependencies: '@types/estree': 1.0.8 @@ -12888,8 +12629,6 @@ snapshots: strip-ansi: 7.1.2 wrap-ansi: 9.0.2 - long@5.3.2: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -12913,10 +12652,6 @@ snapshots: dependencies: yallist: 4.0.0 - lru-cache@7.18.3: {} - - lru.min@1.1.3: {} - lucide-react@0.511.0(react@19.2.0): dependencies: react: 19.2.0 @@ -13078,28 +12813,12 @@ snapshots: ms@2.1.3: {} - mysql2@3.15.3: - dependencies: - aws-ssl-profiles: 1.1.2 - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.7.0 - long: 5.3.2 - lru.min: 1.1.3 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - named-placeholders@1.1.3: - dependencies: - lru-cache: 7.18.3 - nano-spawn@2.0.0: {} nanoid@3.3.11: {} @@ -13862,8 +13581,6 @@ snapshots: dependencies: xtend: 4.0.2 - postgres@3.4.7: {} - prettier@2.8.8: {} pretty-bytes@5.6.0: {} @@ -13880,21 +13597,14 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@7.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + prisma@6.19.0(typescript@5.9.3): dependencies: - '@prisma/config': 7.0.0 - '@prisma/dev': 0.13.0(typescript@5.9.3) - '@prisma/engines': 7.0.0 - '@prisma/studio-core-licensed': 0.8.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - mysql2: 3.15.3 - postgres: 3.4.7 + '@prisma/config': 6.19.0 + '@prisma/engines': 6.19.0 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - - '@types/react' - magicast - - react - - react-dom process-nextick-args@2.0.1: {} @@ -13913,12 +13623,6 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - proper-lockfile@4.1.2: - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - proxy-from-env@1.0.0: {} pump@3.0.3: @@ -14219,8 +13923,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regexp-to-ast@0.5.0: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -14230,10 +13932,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - remeda@2.21.3: - dependencies: - type-fest: 4.41.0 - request-ip@3.3.0: {} request-progress@3.0.0: @@ -14270,8 +13968,6 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry@0.12.0: {} - reusify@1.1.0: {} rfdc@1.4.1: {} @@ -14409,8 +14105,6 @@ snapshots: semver@7.7.3: {} - seq-queue@0.0.5: {} - serialize-error@12.0.0: dependencies: type-fest: 4.41.0 @@ -14624,8 +14318,6 @@ snapshots: sprintf-js@1.0.3: {} - sqlstring@2.3.3: {} - sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -14644,8 +14336,6 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 - std-env@3.9.0: {} - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -15167,10 +14857,6 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - valibot@1.1.0(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -15343,10 +15029,6 @@ snapshots: yocto-queue@0.1.0: {} - zeptomatch@2.0.2: - dependencies: - grammex: 3.1.11 - zod@4.1.12: {} zustand@5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 66932e33..aeb11648 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -6,6 +6,7 @@ generator client { datasource db { provider = "postgresql" + url = env("DATABASE_URL") relationMode = "prisma" } From f5b5f159ecd24a440125212444e96d05e7860719 Mon Sep 17 00:00:00 2001 From: Arthur Sepiol Date: Fri, 28 Nov 2025 02:17:16 +0300 Subject: [PATCH 16/45] fix: skip realtime chart animation when data unchanged --- src/components/metrics/RealtimeChart.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/metrics/RealtimeChart.tsx b/src/components/metrics/RealtimeChart.tsx index a71c03c3..ea4046d4 100644 --- a/src/components/metrics/RealtimeChart.tsx +++ b/src/components/metrics/RealtimeChart.tsx @@ -16,6 +16,7 @@ export function RealtimeChart({ data, unit, ...props }: RealtimeChartProps) { const endDate = startOfMinute(new Date()); const startDate = subMinutes(endDate, REALTIME_RANGE); const prevEndDate = useRef(endDate); + const prevData = useRef(null); const chartData = useMemo(() => { if (!data) { @@ -28,14 +29,22 @@ export function RealtimeChart({ data, unit, ...props }: RealtimeChartProps) { }; }, [data, startDate, endDate, unit]); - // Don't animate the bars shifting over because it looks weird const animationDuration = useMemo(() => { + // Don't animate the bars shifting over because it looks weird if (isBefore(prevEndDate.current, endDate)) { prevEndDate.current = endDate; return 0; } + + // Don't animate when data hasn't changed + const serialized = JSON.stringify(chartData); + if (prevData.current === serialized) { + return 0; + } + prevData.current = serialized; + return DEFAULT_ANIMATION_DURATION; - }, [endDate]); + }, [endDate, chartData]); return ( Date: Fri, 28 Nov 2025 06:10:19 +0000 Subject: [PATCH 17/45] Issue#3802 - Team to user switch fixed --- src/app/page.tsx | 8 +++----- src/components/input/NavButton.tsx | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 8bf748f9..06998956 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,7 +1,7 @@ 'use client'; import { useEffect } from 'react'; import { redirect } from 'next/navigation'; -import { getItem, removeItem } from '@/lib/storage'; +import { getItem } from '@/lib/storage'; import { LAST_TEAM_CONFIG } from '@/lib/constants'; export default function RootPage() { @@ -10,11 +10,9 @@ export default function RootPage() { if (lastTeam) { redirect(`/teams/${lastTeam}/websites`); - } else { - removeItem(LAST_TEAM_CONFIG); - - redirect(`/websites`); } + + redirect(`/websites`); }, []); return null; diff --git a/src/components/input/NavButton.tsx b/src/components/input/NavButton.tsx index b57c2ecd..44496e22 100644 --- a/src/components/input/NavButton.tsx +++ b/src/components/input/NavButton.tsx @@ -93,7 +93,7 @@ export function NavButton({ showText = true }: TeamsButtonProps) { - + } label={user.username} /> From 50bfee33284e716a888298078a03ca3f656c2bbd Mon Sep 17 00:00:00 2001 From: Syed Abdullah <2syedabdullah@gmail.com> Date: Fri, 28 Nov 2025 06:30:22 +0000 Subject: [PATCH 18/45] Moved the redirect to else statement --- src/app/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 06998956..22f6bc84 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -10,9 +10,9 @@ export default function RootPage() { if (lastTeam) { redirect(`/teams/${lastTeam}/websites`); + } else { + redirect(`/websites`); } - - redirect(`/websites`); }, []); return null; From d7fd22645c333c827cd01cd9d968ee2a18ed8d2c Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 28 Nov 2025 00:33:53 -0800 Subject: [PATCH 19/45] Fixed nav menus. --- pnpm-lock.yaml | 48 ++++++++++++++++++- src/app/(main)/admin/AdminLayout.tsx | 1 + .../admin/users/[userId]/UserEditForm.tsx | 2 +- src/app/(main)/settings/SettingsLayout.tsx | 1 + src/app/(main)/settings/layout.tsx | 2 +- src/components/common/SideMenu.tsx | 2 +- .../hooks/queries/useUpdateQuery.ts | 3 +- src/components/hooks/useMessages.ts | 5 +- src/lib/types.ts | 5 ++ 9 files changed, 62 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5db0535d..baa6fa61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -328,7 +328,44 @@ importers: specifier: ^5.9.3 version: 5.9.3 - dist: {} + dist: + dependencies: + chart.js: + specifier: ^4.5.0 + version: 4.5.1 + chartjs-adapter-date-fns: + specifier: ^3.0.0 + version: 3.0.0(chart.js@4.5.1)(date-fns@2.30.0) + colord: + specifier: ^2.9.2 + version: 2.9.3 + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + lucide-react: + specifier: ^0.542.0 + version: 0.542.0(react@19.2.0) + pure-rand: + specifier: ^7.0.1 + version: 7.0.1 + react-simple-maps: + specifier: ^2.3.0 + version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react-use-measure: + specifier: ^2.0.4 + version: 2.1.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react-window: + specifier: ^1.8.6 + version: 1.8.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + serialize-error: + specifier: ^12.0.0 + version: 12.0.0 + thenby: + specifier: ^1.3.4 + version: 1.3.4 + uuid: + specifier: ^11.1.0 + version: 11.1.0 packages: @@ -5152,6 +5189,11 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lucide-react@0.542.0: + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lucide-react@0.543.0: resolution: {integrity: sha512-fpVfuOQO0V3HBaOA1stIiP/A2fPCXHIleRZL16Mx3HmjTYwNSbimhnFBygs2CAfU1geexMX5ItUcWBGUaqw5CA==} peerDependencies: @@ -12921,6 +12963,10 @@ snapshots: dependencies: react: 19.2.0 + lucide-react@0.542.0(react@19.2.0): + dependencies: + react: 19.2.0 + lucide-react@0.543.0(react@19.2.0): dependencies: react: 19.2.0 diff --git a/src/app/(main)/admin/AdminLayout.tsx b/src/app/(main)/admin/AdminLayout.tsx index 56561a8e..3c8fa20a 100644 --- a/src/app/(main)/admin/AdminLayout.tsx +++ b/src/app/(main)/admin/AdminLayout.tsx @@ -21,6 +21,7 @@ export function AdminLayout({ children }: { children: ReactNode }) { border="right" backgroundColor marginRight="2" + padding="3" > diff --git a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx index 30c86862..28bf030f 100644 --- a/src/app/(main)/admin/users/[userId]/UserEditForm.tsx +++ b/src/app/(main)/admin/users/[userId]/UserEditForm.tsx @@ -50,7 +50,7 @@ export function UserEditForm({ userId, onSave }: { userId: string; onSave?: () = label={formatMessage(labels.role)} rules={{ required: formatMessage(labels.required) }} > - {formatMessage(labels.viewOnly)} diff --git a/src/app/(main)/settings/SettingsLayout.tsx b/src/app/(main)/settings/SettingsLayout.tsx index adfaaa4f..f6588721 100644 --- a/src/app/(main)/settings/SettingsLayout.tsx +++ b/src/app/(main)/settings/SettingsLayout.tsx @@ -14,6 +14,7 @@ export function SettingsLayout({ children }: { children: ReactNode }) { border="right" backgroundColor marginRight="2" + padding="3" > diff --git a/src/app/(main)/settings/layout.tsx b/src/app/(main)/settings/layout.tsx index e8dfb30d..4e773a37 100644 --- a/src/app/(main)/settings/layout.tsx +++ b/src/app/(main)/settings/layout.tsx @@ -3,7 +3,7 @@ import { SettingsLayout } from './SettingsLayout'; export default function ({ children }) { if (process.env.cloudMode) { - //return null; + return null; } return {children}; diff --git a/src/components/common/SideMenu.tsx b/src/components/common/SideMenu.tsx index bdd24952..92ff798a 100644 --- a/src/components/common/SideMenu.tsx +++ b/src/components/common/SideMenu.tsx @@ -51,7 +51,7 @@ export function SideMenu({ }; return ( - + {title && ( {title} diff --git a/src/components/hooks/queries/useUpdateQuery.ts b/src/components/hooks/queries/useUpdateQuery.ts index 9535c436..85a94425 100644 --- a/src/components/hooks/queries/useUpdateQuery.ts +++ b/src/components/hooks/queries/useUpdateQuery.ts @@ -1,10 +1,11 @@ import { useToast } from '@umami/react-zen'; +import type { ApiError } from '@/lib/types'; import { useApi } from '../useApi'; import { useModified } from '../useModified'; export function useUpdateQuery(path: string, params?: Record) { const { post, useMutation } = useApi(); - const query = useMutation({ + const query = useMutation>({ mutationFn: (data: Record) => post(path, { ...data, ...params }), }); const { touch } = useModified(); diff --git a/src/components/hooks/useMessages.ts b/src/components/hooks/useMessages.ts index 19f12d9a..d5bc2423 100644 --- a/src/components/hooks/useMessages.ts +++ b/src/components/hooks/useMessages.ts @@ -1,5 +1,6 @@ import { FormattedMessage, type MessageDescriptor, useIntl } from 'react-intl'; import { labels, messages } from '@/components/messages'; +import type { ApiError } from '@/lib/types'; type FormatMessage = ( descriptor: MessageDescriptor, @@ -12,7 +13,7 @@ interface UseMessages { messages: typeof messages; labels: typeof labels; getMessage: (id: string) => string; - getErrorMessage: (error: unknown) => string | undefined; + getErrorMessage: (error: ApiError) => string | undefined; FormattedMessage: typeof FormattedMessage; } @@ -25,7 +26,7 @@ export function useMessages(): UseMessages { return message ? formatMessage(message) : id; }; - const getErrorMessage = (error: unknown) => { + const getErrorMessage = (error: ApiError) => { if (!error) { return undefined; } diff --git a/src/lib/types.ts b/src/lib/types.ts index e727c87a..9c061979 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -136,3 +136,8 @@ export interface RealtimeData { urls: Record; visitors: any[]; } + +export interface ApiError extends Error { + code?: string; + message: string; +} From 046cb6ef62a883ba1a4e12730e8e38c0f568bcf0 Mon Sep 17 00:00:00 2001 From: Prince EKPINSE Date: Sat, 29 Nov 2025 16:43:21 +0100 Subject: [PATCH 20/45] feat(#3748): restore favicon icons in websites list --- src/app/(main)/websites/WebsitesDataTable.tsx | 9 ++++++++- src/app/login/LoginForm.tsx | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app/(main)/websites/WebsitesDataTable.tsx b/src/app/(main)/websites/WebsitesDataTable.tsx index 93b1a7c7..c39420f0 100644 --- a/src/app/(main)/websites/WebsitesDataTable.tsx +++ b/src/app/(main)/websites/WebsitesDataTable.tsx @@ -2,6 +2,8 @@ import Link from 'next/link'; import { WebsitesTable } from './WebsitesTable'; import { DataGrid } from '@/components/common/DataGrid'; import { useLoginQuery, useNavigation, useUserWebsitesQuery } from '@/components/hooks'; +import { Favicon } from '@/index'; +import { Icon, Row } from '@umami/react-zen'; export function WebsitesDataTable({ userId, @@ -21,7 +23,12 @@ export function WebsitesDataTable({ const { renderUrl } = useNavigation(); const renderLink = (row: any) => ( - {row.name} + + + + + {row.name} + ); return ( diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx index b151b94e..02138985 100644 --- a/src/app/login/LoginForm.tsx +++ b/src/app/login/LoginForm.tsx @@ -26,7 +26,7 @@ export function LoginForm() { setClientAuthToken(token); setUser(user); - router.push('/websites'); + router.push('/'); }, }); }; From e5a5aeecb5ac30156399c3c342d23df7e45ca069 Mon Sep 17 00:00:00 2001 From: Prince EKPINSE Date: Sat, 29 Nov 2025 16:54:45 +0100 Subject: [PATCH 21/45] feat(#3748): redirect user to last selected team on login --- src/app/login/LoginForm.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx index 02138985..481d7ccd 100644 --- a/src/app/login/LoginForm.tsx +++ b/src/app/login/LoginForm.tsx @@ -25,7 +25,6 @@ export function LoginForm() { onSuccess: async ({ token, user }) => { setClientAuthToken(token); setUser(user); - router.push('/'); }, }); From 92a7355ce346c039aad22d6a533dfcd25096c39c Mon Sep 17 00:00:00 2001 From: RaenonX Date: Mon, 24 Nov 2025 08:07:31 +0800 Subject: [PATCH 22/45] Fixed `/api/batch` request recreation failure --- src/app/api/batch/route.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/app/api/batch/route.ts b/src/app/api/batch/route.ts index 6feab06b..aae14c96 100644 --- a/src/app/api/batch/route.ts +++ b/src/app/api/batch/route.ts @@ -18,7 +18,20 @@ export async function POST(request: Request) { let index = 0; for (const data of body) { - const newRequest = new Request(request, { body: JSON.stringify(data) }); + // Recreate a fresh Request since `new Request(request)` will have the following error: + // > Cannot read private member #state from an object whose class did not declare it + + // Copy headers we received, ensure JSON content type, and avoid conflicting content-length + const headers = new Headers(request.headers); + headers.set('content-type', 'application/json'); + headers.delete('content-length'); + + const newRequest = new Request(request.url, { + method: 'POST', + headers, + body: JSON.stringify(data), + }); + const response = await send.POST(newRequest); if (!response.ok) { From 805bc57bbb7fedf87edbc4ede9ff04f6c8bef374 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Mon, 24 Nov 2025 15:21:20 +0800 Subject: [PATCH 23/45] Added `browser` / `os` / `device` override in `payload` --- src/app/api/send/route.ts | 3 +++ src/lib/detect.ts | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts index 2c2085bf..6ef66f30 100644 --- a/src/app/api/send/route.ts +++ b/src/app/api/send/route.ts @@ -41,6 +41,9 @@ const schema = z.object({ userAgent: z.string().optional(), timestamp: z.coerce.number().int().optional(), id: z.string().optional(), + browser: z.string().optional(), + os: z.string().optional(), + device: z.string().optional(), }) .refine( data => { diff --git a/src/lib/detect.ts b/src/lib/detect.ts index c5528465..083203ed 100644 --- a/src/lib/detect.ts +++ b/src/lib/detect.ts @@ -114,9 +114,9 @@ export async function getClientInfo(request: Request, payload: Record Date: Mon, 24 Nov 2025 15:26:54 +0800 Subject: [PATCH 24/45] Updated `/api/batch` to return `cache` --- src/app/api/batch/route.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/api/batch/route.ts b/src/app/api/batch/route.ts index aae14c96..46e8b3c3 100644 --- a/src/app/api/batch/route.ts +++ b/src/app/api/batch/route.ts @@ -17,6 +17,7 @@ export async function POST(request: Request) { const errors = []; let index = 0; + let cache = null; for (const data of body) { // Recreate a fresh Request since `new Request(request)` will have the following error: // > Cannot read private member #state from an object whose class did not declare it @@ -33,9 +34,12 @@ export async function POST(request: Request) { }); const response = await send.POST(newRequest); + const responseJson = await response.json(); if (!response.ok) { - errors.push({ index, response: await response.json() }); + errors.push({ index, response: responseJson }); + } else { + cache ??= responseJson.cache; } index++; @@ -46,6 +50,7 @@ export async function POST(request: Request) { processed: body.length - errors.length, errors: errors.length, details: errors, + cache, }); } catch (e) { return serverError(e); From 4d70c3baf1e4bd366e60ccee8c97da56ce3fae54 Mon Sep 17 00:00:00 2001 From: Indra Gunawan Date: Mon, 1 Dec 2025 16:48:58 +0800 Subject: [PATCH 25/45] add support for UUID v7 --- src/lib/crypto.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lib/crypto.ts b/src/lib/crypto.ts index f9387460..f6b0248e 100644 --- a/src/lib/crypto.ts +++ b/src/lib/crypto.ts @@ -1,5 +1,5 @@ import crypto from 'crypto'; -import { v4, v5 } from 'uuid'; +import { v4, v5, v7 } from 'uuid'; const ALGORITHM = 'aes-256-gcm'; const IV_LENGTH = 16; @@ -57,7 +57,9 @@ export function secret() { } export function uuid(...args: any) { - if (!args.length) return v4(); + if (args.length) { + return v5(hash(...args, secret()), v5.DNS); + } - return v5(hash(...args, secret()), v5.DNS); + return process.env.USE_UUIDV7 ? v7() : v4(); } From cb034a13710a97a9f04d8ab71726e2ad2a90cc44 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Mon, 1 Dec 2025 11:34:43 -0800 Subject: [PATCH 26/45] prisma schema boards + varchar length increase --- prisma/migrations/15_boards/migration.sql | 33 ++++++++++++ .../migration.sql | 16 ++++++ prisma/schema.prisma | 54 +++++++++++++------ 3 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 prisma/migrations/15_boards/migration.sql create mode 100644 prisma/migrations/16_update_website_event_length/migration.sql diff --git a/prisma/migrations/15_boards/migration.sql b/prisma/migrations/15_boards/migration.sql new file mode 100644 index 00000000..09608c5f --- /dev/null +++ b/prisma/migrations/15_boards/migration.sql @@ -0,0 +1,33 @@ +-- CreateTable +CREATE TABLE "board" ( + "board_id" UUID NOT NULL, + "type" VARCHAR(50) NOT NULL, + "name" VARCHAR(200) NOT NULL, + "description" VARCHAR(500) NOT NULL, + "parameters" JSONB NOT NULL, + "slug" VARCHAR(100) NOT NULL, + "user_id" UUID, + "team_id" UUID, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMPTZ(6), + + CONSTRAINT "board_pkey" PRIMARY KEY ("board_id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "board_board_id_key" ON "board"("board_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "board_slug_key" ON "board"("slug"); + +-- CreateIndex +CREATE INDEX "board_slug_idx" ON "board"("slug"); + +-- CreateIndex +CREATE INDEX "board_user_id_idx" ON "board"("user_id"); + +-- CreateIndex +CREATE INDEX "board_team_id_idx" ON "board"("team_id"); + +-- CreateIndex +CREATE INDEX "board_created_at_idx" ON "board"("created_at"); diff --git a/prisma/migrations/16_update_website_event_length/migration.sql b/prisma/migrations/16_update_website_event_length/migration.sql new file mode 100644 index 00000000..06dd57a6 --- /dev/null +++ b/prisma/migrations/16_update_website_event_length/migration.sql @@ -0,0 +1,16 @@ +-- AlterTable +ALTER TABLE "website_event" ALTER COLUMN "url_path" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "url_query" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "referrer_path" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "referrer_query" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "fbclid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "gclid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "li_fat_id" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "msclkid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "ttclid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "twclid" SET DATA TYPE VARCHAR(1024), +ALTER COLUMN "utm_campaign" SET DATA TYPE VARCHAR(512), +ALTER COLUMN "utm_content" SET DATA TYPE VARCHAR(512), +ALTER COLUMN "utm_medium" SET DATA TYPE VARCHAR(512), +ALTER COLUMN "utm_source" SET DATA TYPE VARCHAR(512), +ALTER COLUMN "utm_term" SET DATA TYPE VARCHAR(512); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index aeb11648..c0e87e7a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -27,6 +27,7 @@ model User { pixels Pixel[] @relation("user") teams TeamUser[] reports Report[] + boards Board[] @relation("user") @@map("user") } @@ -99,23 +100,23 @@ model WebsiteEvent { sessionId String @map("session_id") @db.Uuid visitId String @map("visit_id") @db.Uuid createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - urlPath String @map("url_path") @db.VarChar(500) - urlQuery String? @map("url_query") @db.VarChar(500) - utmSource String? @map("utm_source") @db.VarChar(255) - utmMedium String? @map("utm_medium") @db.VarChar(255) - utmCampaign String? @map("utm_campaign") @db.VarChar(255) - utmContent String? @map("utm_content") @db.VarChar(255) - utmTerm String? @map("utm_term") @db.VarChar(255) - referrerPath String? @map("referrer_path") @db.VarChar(500) - referrerQuery String? @map("referrer_query") @db.VarChar(500) + urlPath String @map("url_path") @db.VarChar(1024) + urlQuery String? @map("url_query") @db.VarChar(1024) + utmSource String? @map("utm_source") @db.VarChar(512) + utmMedium String? @map("utm_medium") @db.VarChar(512) + utmCampaign String? @map("utm_campaign") @db.VarChar(512) + utmContent String? @map("utm_content") @db.VarChar(512) + utmTerm String? @map("utm_term") @db.VarChar(512) + referrerPath String? @map("referrer_path") @db.VarChar(1024) + referrerQuery String? @map("referrer_query") @db.VarChar(1024) referrerDomain String? @map("referrer_domain") @db.VarChar(500) pageTitle String? @map("page_title") @db.VarChar(500) - gclid String? @db.VarChar(255) - fbclid String? @db.VarChar(255) - msclkid String? @db.VarChar(255) - ttclid String? @db.VarChar(255) - lifatid String? @map("li_fat_id") @db.VarChar(255) - twclid String? @db.VarChar(255) + gclid String? @db.VarChar(1024) + fbclid String? @db.VarChar(1024) + msclkid String? @db.VarChar(1024) + ttclid String? @db.VarChar(1024) + lifatid String? @map("li_fat_id") @db.VarChar(1024) + twclid String? @db.VarChar(1024) eventType Int @default(1) @map("event_type") @db.Integer eventName String? @map("event_name") @db.VarChar(50) tag String? @db.VarChar(50) @@ -199,6 +200,7 @@ model Team { members TeamUser[] links Link[] pixels Pixel[] + boards Board[] @@index([accessCode]) @@map("team") @@ -316,3 +318,25 @@ model Pixel { @@index([createdAt]) @@map("pixel") } + +model Board { + id String @id() @unique() @map("board_id") @db.Uuid + type String @db.VarChar(50) + name String @db.VarChar(200) + description String @db.VarChar(500) + parameters Json + slug String @unique() @db.VarChar(100) + userId String? @map("user_id") @db.Uuid + teamId String? @map("team_id") @db.Uuid + createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) + updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) + + user User? @relation("user", fields: [userId], references: [id]) + team Team? @relation(fields: [teamId], references: [id]) + + @@index([slug]) + @@index([userId]) + @@index([teamId]) + @@index([createdAt]) + @@map("board") +} \ No newline at end of file From f5896f071bf3e69c245fa5de8dac9f470e3bdc85 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Mon, 1 Dec 2025 23:33:57 -0800 Subject: [PATCH 27/45] Handle user account redirect. --- pnpm-lock.yaml | 2 ++ src/app/page.tsx | 1 - src/components/input/NavButton.tsx | 23 +++++++++++++++++------ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a4577c1..e19b4029 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -328,6 +328,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 + dist: {} + packages: '@ampproject/remapping@2.3.0': diff --git a/src/app/page.tsx b/src/app/page.tsx index 24a27116..6f0033df 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,5 @@ 'use client'; import { redirect } from 'next/navigation'; -import { getItem } from '@/lib/storage'; import { useEffect } from 'react'; import { LAST_TEAM_CONFIG } from '@/lib/constants'; import { getItem } from '@/lib/storage'; diff --git a/src/components/input/NavButton.tsx b/src/components/input/NavButton.tsx index 9552ac73..ab77ef06 100644 --- a/src/components/input/NavButton.tsx +++ b/src/components/input/NavButton.tsx @@ -14,6 +14,7 @@ import { Text, } from '@umami/react-zen'; import { ArrowRight } from 'lucide-react'; +import type { Key } from 'react'; import { useConfig, useLoginQuery, @@ -33,7 +34,8 @@ import { Users, } from '@/components/icons'; import { Switch } from '@/components/svg'; -import { DOCS_URL } from '@/lib/constants'; +import { DOCS_URL, LAST_TEAM_CONFIG } from '@/lib/constants'; +import { removeItem } from '@/lib/storage'; export interface TeamsButtonProps { showText?: boolean; @@ -44,7 +46,7 @@ export function NavButton({ showText = true }: TeamsButtonProps) { const { user } = useLoginQuery(); const { cloudMode } = useConfig(); const { formatMessage, labels } = useMessages(); - const { teamId } = useNavigation(); + const { teamId, router } = useNavigation(); const { isMobile } = useMobile(); const team = user?.teams?.find(({ id }) => id === teamId); const selectedKeys = new Set([teamId || 'user']); @@ -54,7 +56,16 @@ export function NavButton({ showText = true }: TeamsButtonProps) { return cloudMode ? `${process.env.cloudUrl}${url}` : url; }; - const handleAction = async () => {}; + const handleAction = async (key: Key) => { + if (key === 'user') { + removeItem(LAST_TEAM_CONFIG); + if (cloudMode) { + window.location.href = '/'; + } else { + router.push('/'); + } + } + }; return ( @@ -84,16 +95,16 @@ export function NavButton({ showText = true }: TeamsButtonProps) { - + } label={formatMessage(labels.switchAccount)} /> - + - + } label={user.username} /> From b7807ed4662f416e637eb2d15e1d6c4a3f696277 Mon Sep 17 00:00:00 2001 From: Arthur Sepiol Date: Tue, 2 Dec 2025 13:43:59 +0300 Subject: [PATCH 28/45] feat(dev): add sample data generator script Adds a CLI tool to generate realistic analytics data for local development and testing. Creates two demo websites with varying traffic patterns and realistic user behavior distributions. --- package.json | 6 +- scripts/seed-data.ts | 121 ++++++++ scripts/seed/distributions/devices.ts | 80 +++++ scripts/seed/distributions/geographic.ts | 144 +++++++++ scripts/seed/distributions/referrers.ts | 163 ++++++++++ scripts/seed/distributions/temporal.ts | 69 +++++ scripts/seed/generators/events.ts | 191 ++++++++++++ scripts/seed/generators/revenue.ts | 65 ++++ scripts/seed/generators/sessions.ts | 52 ++++ scripts/seed/index.ts | 378 +++++++++++++++++++++++ scripts/seed/sites/blog.ts | 108 +++++++ scripts/seed/sites/saas.ts | 185 +++++++++++ scripts/seed/utils.ts | 85 +++++ 13 files changed, 1645 insertions(+), 2 deletions(-) create mode 100644 scripts/seed-data.ts create mode 100644 scripts/seed/distributions/devices.ts create mode 100644 scripts/seed/distributions/geographic.ts create mode 100644 scripts/seed/distributions/referrers.ts create mode 100644 scripts/seed/distributions/temporal.ts create mode 100644 scripts/seed/generators/events.ts create mode 100644 scripts/seed/generators/revenue.ts create mode 100644 scripts/seed/generators/sessions.ts create mode 100644 scripts/seed/index.ts create mode 100644 scripts/seed/sites/blog.ts create mode 100644 scripts/seed/sites/saas.ts create mode 100644 scripts/seed/utils.ts diff --git a/package.json b/package.json index fd31320e..23e19f8e 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,8 @@ "postbuild": "node scripts/postbuild.js", "test": "jest", "cypress-open": "cypress open cypress run", - "cypress-run": "cypress run cypress run" + "cypress-run": "cypress run cypress run", + "seed-data": "tsx scripts/seed-data.ts" }, "lint-staged": { "**/*.{js,jsx,ts,tsx}": [ @@ -159,7 +160,7 @@ "eslint-plugin-cypress": "^2.15.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-prettier": "^5.5.3", + "eslint-plugin-prettier": "^5.5.4", "extract-react-intl-messages": "^4.1.1", "husky": "^9.1.7", "jest": "^29.7.0", @@ -185,6 +186,7 @@ "ts-jest": "^29.4.5", "ts-node": "^10.9.1", "tsup": "^8.5.0", + "tsx": "^4.19.0", "typescript": "^5.9.3" } } diff --git a/scripts/seed-data.ts b/scripts/seed-data.ts new file mode 100644 index 00000000..82a0564c --- /dev/null +++ b/scripts/seed-data.ts @@ -0,0 +1,121 @@ +#!/usr/bin/env node +/* eslint-disable no-console */ + +/** + * Umami Sample Data Generator + * + * Generates realistic analytics data for local development and testing. + * Creates two demo websites: + * - Demo Blog: Low traffic (~100 sessions/month) + * - Demo SaaS: Average traffic (~500 sessions/day) + * + * Usage: + * npm run seed-data # Generate 30 days of data + * npm run seed-data -- --days 90 # Generate 90 days of data + * npm run seed-data -- --clear # Clear existing demo data first + * npm run seed-data -- --verbose # Show detailed progress + */ + +import { seed, type SeedConfig } from './seed/index.js'; + +function parseArgs(): SeedConfig { + const args = process.argv.slice(2); + + const config: SeedConfig = { + days: 30, + clear: false, + verbose: false, + }; + + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + + if (arg === '--days' && args[i + 1]) { + config.days = parseInt(args[i + 1], 10); + if (isNaN(config.days) || config.days < 1) { + console.error('Error: --days must be a positive integer'); + process.exit(1); + } + i++; + } else if (arg === '--clear') { + config.clear = true; + } else if (arg === '--verbose' || arg === '-v') { + config.verbose = true; + } else if (arg === '--help' || arg === '-h') { + printHelp(); + process.exit(0); + } else if (arg.startsWith('--days=')) { + config.days = parseInt(arg.split('=')[1], 10); + if (isNaN(config.days) || config.days < 1) { + console.error('Error: --days must be a positive integer'); + process.exit(1); + } + } + } + + return config; +} + +function printHelp(): void { + console.log(` +Umami Sample Data Generator + +Generates realistic analytics data for local development and testing. + +Usage: + npm run seed-data [options] + +Options: + --days Number of days of data to generate (default: 30) + --clear Clear existing demo data before generating + --verbose, -v Show detailed progress + --help, -h Show this help message + +Examples: + npm run seed-data # Generate 30 days of data + npm run seed-data -- --days 90 # Generate 90 days of data + npm run seed-data -- --clear # Clear existing demo data first + npm run seed-data -- --days 7 -v # Generate 7 days with verbose output + +Generated Sites: + - Demo Blog: Low traffic (~90 sessions/month) + - Demo SaaS: Average traffic (~500 sessions/day) with revenue tracking + +Note: + This script is blocked from running in production environments + (NODE_ENV=production or cloud platforms like Vercel/Netlify/Railway). +`); +} + +function checkEnvironment(): void { + const nodeEnv = process.env.NODE_ENV; + + if (nodeEnv === 'production') { + console.error('\nError: seed-data cannot run in production environment.'); + console.error('This script is only for local development and testing.\n'); + process.exit(1); + } + + if (process.env.VERCEL || process.env.NETLIFY || process.env.RAILWAY_ENVIRONMENT) { + console.error('\nError: seed-data cannot run in cloud environments.'); + console.error('This script is only for local development and testing.\n'); + process.exit(1); + } +} + +async function main(): Promise { + console.log('\nUmami Sample Data Generator\n'); + + checkEnvironment(); + + const config = parseArgs(); + + try { + await seed(config); + } catch (error) { + console.error('\nError generating seed data:', error); + process.exit(1); + } +} + +main(); diff --git a/scripts/seed/distributions/devices.ts b/scripts/seed/distributions/devices.ts new file mode 100644 index 00000000..9d8b8c00 --- /dev/null +++ b/scripts/seed/distributions/devices.ts @@ -0,0 +1,80 @@ +import { weightedRandom, pickRandom, type WeightedOption } from '../utils.js'; + +export type DeviceType = 'desktop' | 'mobile' | 'tablet'; + +const deviceWeights: WeightedOption[] = [ + { value: 'desktop', weight: 0.55 }, + { value: 'mobile', weight: 0.4 }, + { value: 'tablet', weight: 0.05 }, +]; + +const browsersByDevice: Record[]> = { + desktop: [ + { value: 'Chrome', weight: 0.65 }, + { value: 'Safari', weight: 0.12 }, + { value: 'Firefox', weight: 0.1 }, + { value: 'Edge', weight: 0.1 }, + { value: 'Opera', weight: 0.03 }, + ], + mobile: [ + { value: 'Chrome', weight: 0.55 }, + { value: 'Safari', weight: 0.35 }, + { value: 'Samsung', weight: 0.05 }, + { value: 'Firefox', weight: 0.03 }, + { value: 'Opera', weight: 0.02 }, + ], + tablet: [ + { value: 'Safari', weight: 0.6 }, + { value: 'Chrome', weight: 0.35 }, + { value: 'Firefox', weight: 0.05 }, + ], +}; + +const osByDevice: Record[]> = { + desktop: [ + { value: 'Windows 10', weight: 0.5 }, + { value: 'Mac OS', weight: 0.3 }, + { value: 'Linux', weight: 0.12 }, + { value: 'Chrome OS', weight: 0.05 }, + { value: 'Windows 11', weight: 0.03 }, + ], + mobile: [ + { value: 'iOS', weight: 0.45 }, + { value: 'Android', weight: 0.55 }, + ], + tablet: [ + { value: 'iOS', weight: 0.75 }, + { value: 'Android', weight: 0.25 }, + ], +}; + +const screensByDevice: Record = { + desktop: [ + '1920x1080', + '2560x1440', + '1366x768', + '1440x900', + '3840x2160', + '1536x864', + '1680x1050', + '2560x1080', + ], + mobile: ['390x844', '414x896', '375x812', '360x800', '428x926', '393x873', '412x915', '360x780'], + tablet: ['1024x768', '768x1024', '834x1194', '820x1180', '810x1080', '800x1280'], +}; + +export interface DeviceInfo { + device: DeviceType; + browser: string; + os: string; + screen: string; +} + +export function getRandomDevice(): DeviceInfo { + const device = weightedRandom(deviceWeights); + const browser = weightedRandom(browsersByDevice[device]); + const os = weightedRandom(osByDevice[device]); + const screen = pickRandom(screensByDevice[device]); + + return { device, browser, os, screen }; +} diff --git a/scripts/seed/distributions/geographic.ts b/scripts/seed/distributions/geographic.ts new file mode 100644 index 00000000..ba6ebae3 --- /dev/null +++ b/scripts/seed/distributions/geographic.ts @@ -0,0 +1,144 @@ +import { weightedRandom, pickRandom, type WeightedOption } from '../utils.js'; + +interface GeoLocation { + country: string; + region: string; + city: string; +} + +const countryWeights: WeightedOption[] = [ + { value: 'US', weight: 0.35 }, + { value: 'GB', weight: 0.08 }, + { value: 'DE', weight: 0.06 }, + { value: 'FR', weight: 0.05 }, + { value: 'CA', weight: 0.04 }, + { value: 'AU', weight: 0.03 }, + { value: 'IN', weight: 0.08 }, + { value: 'BR', weight: 0.04 }, + { value: 'JP', weight: 0.03 }, + { value: 'NL', weight: 0.02 }, + { value: 'ES', weight: 0.02 }, + { value: 'IT', weight: 0.02 }, + { value: 'PL', weight: 0.02 }, + { value: 'SE', weight: 0.01 }, + { value: 'MX', weight: 0.02 }, + { value: 'KR', weight: 0.02 }, + { value: 'SG', weight: 0.01 }, + { value: 'ID', weight: 0.02 }, + { value: 'PH', weight: 0.01 }, + { value: 'TH', weight: 0.01 }, + { value: 'VN', weight: 0.01 }, + { value: 'RU', weight: 0.02 }, + { value: 'UA', weight: 0.01 }, + { value: 'ZA', weight: 0.01 }, + { value: 'NG', weight: 0.01 }, +]; + +const regionsByCountry: Record = { + US: [ + { region: 'CA', city: 'San Francisco' }, + { region: 'CA', city: 'Los Angeles' }, + { region: 'NY', city: 'New York' }, + { region: 'TX', city: 'Austin' }, + { region: 'TX', city: 'Houston' }, + { region: 'WA', city: 'Seattle' }, + { region: 'IL', city: 'Chicago' }, + { region: 'MA', city: 'Boston' }, + { region: 'CO', city: 'Denver' }, + { region: 'GA', city: 'Atlanta' }, + { region: 'FL', city: 'Miami' }, + { region: 'PA', city: 'Philadelphia' }, + ], + GB: [ + { region: 'ENG', city: 'London' }, + { region: 'ENG', city: 'Manchester' }, + { region: 'ENG', city: 'Birmingham' }, + { region: 'SCT', city: 'Edinburgh' }, + { region: 'ENG', city: 'Bristol' }, + ], + DE: [ + { region: 'BE', city: 'Berlin' }, + { region: 'BY', city: 'Munich' }, + { region: 'HH', city: 'Hamburg' }, + { region: 'HE', city: 'Frankfurt' }, + { region: 'NW', city: 'Cologne' }, + ], + FR: [ + { region: 'IDF', city: 'Paris' }, + { region: 'ARA', city: 'Lyon' }, + { region: 'PAC', city: 'Marseille' }, + { region: 'OCC', city: 'Toulouse' }, + ], + CA: [ + { region: 'ON', city: 'Toronto' }, + { region: 'BC', city: 'Vancouver' }, + { region: 'QC', city: 'Montreal' }, + { region: 'AB', city: 'Calgary' }, + ], + AU: [ + { region: 'NSW', city: 'Sydney' }, + { region: 'VIC', city: 'Melbourne' }, + { region: 'QLD', city: 'Brisbane' }, + { region: 'WA', city: 'Perth' }, + ], + IN: [ + { region: 'MH', city: 'Mumbai' }, + { region: 'KA', city: 'Bangalore' }, + { region: 'DL', city: 'New Delhi' }, + { region: 'TN', city: 'Chennai' }, + { region: 'TG', city: 'Hyderabad' }, + ], + BR: [ + { region: 'SP', city: 'Sao Paulo' }, + { region: 'RJ', city: 'Rio de Janeiro' }, + { region: 'MG', city: 'Belo Horizonte' }, + ], + JP: [ + { region: '13', city: 'Tokyo' }, + { region: '27', city: 'Osaka' }, + { region: '23', city: 'Nagoya' }, + ], + NL: [ + { region: 'NH', city: 'Amsterdam' }, + { region: 'ZH', city: 'Rotterdam' }, + { region: 'ZH', city: 'The Hague' }, + ], +}; + +const defaultRegions = [{ region: '', city: '' }]; + +export function getRandomGeo(): GeoLocation { + const country = weightedRandom(countryWeights); + const regions = regionsByCountry[country] || defaultRegions; + const { region, city } = pickRandom(regions); + + return { country, region, city }; +} + +const languages: WeightedOption[] = [ + { value: 'en-US', weight: 0.4 }, + { value: 'en-GB', weight: 0.08 }, + { value: 'de-DE', weight: 0.06 }, + { value: 'fr-FR', weight: 0.05 }, + { value: 'es-ES', weight: 0.05 }, + { value: 'pt-BR', weight: 0.04 }, + { value: 'ja-JP', weight: 0.03 }, + { value: 'zh-CN', weight: 0.05 }, + { value: 'ko-KR', weight: 0.02 }, + { value: 'ru-RU', weight: 0.02 }, + { value: 'it-IT', weight: 0.02 }, + { value: 'nl-NL', weight: 0.02 }, + { value: 'pl-PL', weight: 0.02 }, + { value: 'hi-IN', weight: 0.04 }, + { value: 'ar-SA', weight: 0.02 }, + { value: 'tr-TR', weight: 0.02 }, + { value: 'vi-VN', weight: 0.01 }, + { value: 'th-TH', weight: 0.01 }, + { value: 'id-ID', weight: 0.02 }, + { value: 'sv-SE', weight: 0.01 }, + { value: 'da-DK', weight: 0.01 }, +]; + +export function getRandomLanguage(): string { + return weightedRandom(languages); +} diff --git a/scripts/seed/distributions/referrers.ts b/scripts/seed/distributions/referrers.ts new file mode 100644 index 00000000..5b3f2c45 --- /dev/null +++ b/scripts/seed/distributions/referrers.ts @@ -0,0 +1,163 @@ +import { weightedRandom, pickRandom, randomInt, type WeightedOption } from '../utils.js'; + +export type ReferrerType = 'direct' | 'organic' | 'social' | 'paid' | 'referral'; + +export interface ReferrerInfo { + type: ReferrerType; + domain: string | null; + path: string | null; + utmSource: string | null; + utmMedium: string | null; + utmCampaign: string | null; + utmContent: string | null; + utmTerm: string | null; + gclid: string | null; + fbclid: string | null; +} + +const referrerTypeWeights: WeightedOption[] = [ + { value: 'direct', weight: 0.4 }, + { value: 'organic', weight: 0.25 }, + { value: 'social', weight: 0.15 }, + { value: 'paid', weight: 0.1 }, + { value: 'referral', weight: 0.1 }, +]; + +const searchEngines = [ + { domain: 'google.com', path: '/search' }, + { domain: 'bing.com', path: '/search' }, + { domain: 'duckduckgo.com', path: '/' }, + { domain: 'yahoo.com', path: '/search' }, + { domain: 'baidu.com', path: '/s' }, +]; + +const socialPlatforms = [ + { domain: 'twitter.com', path: null }, + { domain: 'x.com', path: null }, + { domain: 'linkedin.com', path: '/feed' }, + { domain: 'facebook.com', path: null }, + { domain: 'reddit.com', path: '/r/programming' }, + { domain: 'news.ycombinator.com', path: '/item' }, + { domain: 'threads.net', path: null }, + { domain: 'bsky.app', path: null }, +]; + +const referralSites = [ + { domain: 'medium.com', path: '/@author/article' }, + { domain: 'dev.to', path: '/post' }, + { domain: 'hashnode.com', path: '/blog' }, + { domain: 'techcrunch.com', path: '/article' }, + { domain: 'producthunt.com', path: '/posts' }, + { domain: 'indiehackers.com', path: '/post' }, +]; + +interface PaidCampaign { + source: string; + medium: string; + campaign: string; + useGclid?: boolean; + useFbclid?: boolean; +} + +const paidCampaigns: PaidCampaign[] = [ + { source: 'google', medium: 'cpc', campaign: 'brand_search', useGclid: true }, + { source: 'google', medium: 'cpc', campaign: 'product_awareness', useGclid: true }, + { source: 'facebook', medium: 'paid_social', campaign: 'retargeting', useFbclid: true }, + { source: 'facebook', medium: 'paid_social', campaign: 'lookalike', useFbclid: true }, + { source: 'linkedin', medium: 'cpc', campaign: 'b2b_targeting' }, + { source: 'twitter', medium: 'paid_social', campaign: 'launch_promo' }, +]; + +const organicCampaigns = [ + { source: 'newsletter', medium: 'email', campaign: 'weekly_digest' }, + { source: 'newsletter', medium: 'email', campaign: 'product_update' }, + { source: 'partner', medium: 'referral', campaign: 'integration_launch' }, +]; + +function generateClickId(): string { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let result = ''; + for (let i = 0; i < 32; i++) { + result += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return result; +} + +export function getRandomReferrer(): ReferrerInfo { + const type = weightedRandom(referrerTypeWeights); + + const result: ReferrerInfo = { + type, + domain: null, + path: null, + utmSource: null, + utmMedium: null, + utmCampaign: null, + utmContent: null, + utmTerm: null, + gclid: null, + fbclid: null, + }; + + switch (type) { + case 'direct': + // No referrer data + break; + + case 'organic': { + const engine = pickRandom(searchEngines); + result.domain = engine.domain; + result.path = engine.path; + break; + } + + case 'social': { + const platform = pickRandom(socialPlatforms); + result.domain = platform.domain; + result.path = platform.path; + + // Some social traffic has UTM params + if (Math.random() < 0.3) { + result.utmSource = platform.domain.replace('.com', '').replace('.net', ''); + result.utmMedium = 'social'; + } + break; + } + + case 'paid': { + const campaign = pickRandom(paidCampaigns); + result.utmSource = campaign.source; + result.utmMedium = campaign.medium; + result.utmCampaign = campaign.campaign; + result.utmContent = `ad_${randomInt(1, 5)}`; + + if (campaign.useGclid) { + result.gclid = generateClickId(); + result.domain = 'google.com'; + result.path = '/search'; + } else if (campaign.useFbclid) { + result.fbclid = generateClickId(); + result.domain = 'facebook.com'; + result.path = null; + } + break; + } + + case 'referral': { + // Mix of pure referrals and organic campaigns + if (Math.random() < 0.6) { + const site = pickRandom(referralSites); + result.domain = site.domain; + result.path = site.path; + } else { + const campaign = pickRandom(organicCampaigns); + result.utmSource = campaign.source; + result.utmMedium = campaign.medium; + result.utmCampaign = campaign.campaign; + } + break; + } + } + + return result; +} diff --git a/scripts/seed/distributions/temporal.ts b/scripts/seed/distributions/temporal.ts new file mode 100644 index 00000000..da0409a9 --- /dev/null +++ b/scripts/seed/distributions/temporal.ts @@ -0,0 +1,69 @@ +import { weightedRandom, randomInt, type WeightedOption } from '../utils.js'; + +const hourlyWeights: WeightedOption[] = [ + { value: 0, weight: 0.02 }, + { value: 1, weight: 0.01 }, + { value: 2, weight: 0.01 }, + { value: 3, weight: 0.01 }, + { value: 4, weight: 0.01 }, + { value: 5, weight: 0.02 }, + { value: 6, weight: 0.03 }, + { value: 7, weight: 0.05 }, + { value: 8, weight: 0.07 }, + { value: 9, weight: 0.08 }, + { value: 10, weight: 0.09 }, + { value: 11, weight: 0.08 }, + { value: 12, weight: 0.07 }, + { value: 13, weight: 0.08 }, + { value: 14, weight: 0.09 }, + { value: 15, weight: 0.08 }, + { value: 16, weight: 0.07 }, + { value: 17, weight: 0.06 }, + { value: 18, weight: 0.05 }, + { value: 19, weight: 0.04 }, + { value: 20, weight: 0.03 }, + { value: 21, weight: 0.03 }, + { value: 22, weight: 0.02 }, + { value: 23, weight: 0.02 }, +]; + +const dayOfWeekWeights: WeightedOption[] = [ + { value: 0, weight: 0.08 }, // Sunday + { value: 1, weight: 0.16 }, // Monday + { value: 2, weight: 0.17 }, // Tuesday + { value: 3, weight: 0.17 }, // Wednesday + { value: 4, weight: 0.16 }, // Thursday + { value: 5, weight: 0.15 }, // Friday + { value: 6, weight: 0.11 }, // Saturday +]; + +export function getWeightedHour(): number { + return weightedRandom(hourlyWeights); +} + +export function getDayOfWeekMultiplier(dayOfWeek: number): number { + const weight = dayOfWeekWeights.find(d => d.value === dayOfWeek)?.weight ?? 0.14; + return weight / 0.14; // Normalize around 1.0 +} + +export function generateTimestampForDay(day: Date): Date { + const hour = getWeightedHour(); + const minute = randomInt(0, 59); + const second = randomInt(0, 59); + const millisecond = randomInt(0, 999); + + const timestamp = new Date(day); + timestamp.setHours(hour, minute, second, millisecond); + + return timestamp; +} + +export function getSessionCountForDay(baseCount: number, day: Date): number { + const dayOfWeek = day.getDay(); + const multiplier = getDayOfWeekMultiplier(dayOfWeek); + + // Add some random variance (±20%) + const variance = 0.8 + Math.random() * 0.4; + + return Math.round(baseCount * multiplier * variance); +} diff --git a/scripts/seed/generators/events.ts b/scripts/seed/generators/events.ts new file mode 100644 index 00000000..72429062 --- /dev/null +++ b/scripts/seed/generators/events.ts @@ -0,0 +1,191 @@ +import { uuid, addSeconds, randomInt } from '../utils.js'; +import { getRandomReferrer } from '../distributions/referrers.js'; +import type { SessionData } from './sessions.js'; + +export const EVENT_TYPE = { + pageView: 1, + customEvent: 2, +} as const; + +export interface PageConfig { + path: string; + title: string; + weight: number; + avgTimeOnPage: number; +} + +export interface CustomEventConfig { + name: string; + weight: number; + pages?: string[]; + data?: Record; +} + +export interface JourneyConfig { + pages: string[]; + weight: number; +} + +export interface EventData { + id: string; + websiteId: string; + sessionId: string; + visitId: string; + eventType: number; + urlPath: string; + urlQuery: string | null; + pageTitle: string | null; + hostname: string; + referrerDomain: string | null; + referrerPath: string | null; + utmSource: string | null; + utmMedium: string | null; + utmCampaign: string | null; + utmContent: string | null; + utmTerm: string | null; + gclid: string | null; + fbclid: string | null; + eventName: string | null; + tag: string | null; + createdAt: Date; +} + +export interface EventDataEntry { + id: string; + websiteId: string; + websiteEventId: string; + dataKey: string; + stringValue: string | null; + numberValue: number | null; + dateValue: Date | null; + dataType: number; + createdAt: Date; +} + +export interface SiteConfig { + hostname: string; + pages: PageConfig[]; + journeys: JourneyConfig[]; + customEvents: CustomEventConfig[]; +} + +function getPageTitle(pages: PageConfig[], path: string): string | null { + const page = pages.find(p => p.path === path); + return page?.title ?? null; +} + +function getPageTimeOnPage(pages: PageConfig[], path: string): number { + const page = pages.find(p => p.path === path); + return page?.avgTimeOnPage ?? 30; +} + +export function generateEventsForSession( + session: SessionData, + siteConfig: SiteConfig, + journey: string[], +): { events: EventData[]; eventDataEntries: EventDataEntry[] } { + const events: EventData[] = []; + const eventDataEntries: EventDataEntry[] = []; + const visitId = uuid(); + + let currentTime = session.createdAt; + const referrer = getRandomReferrer(); + + for (let i = 0; i < journey.length; i++) { + const pagePath = journey[i]; + const isFirstPage = i === 0; + + const eventId = uuid(); + const pageTitle = getPageTitle(siteConfig.pages, pagePath); + + events.push({ + id: eventId, + websiteId: session.websiteId, + sessionId: session.id, + visitId, + eventType: EVENT_TYPE.pageView, + urlPath: pagePath, + urlQuery: null, + pageTitle, + hostname: siteConfig.hostname, + referrerDomain: isFirstPage ? referrer.domain : null, + referrerPath: isFirstPage ? referrer.path : null, + utmSource: isFirstPage ? referrer.utmSource : null, + utmMedium: isFirstPage ? referrer.utmMedium : null, + utmCampaign: isFirstPage ? referrer.utmCampaign : null, + utmContent: isFirstPage ? referrer.utmContent : null, + utmTerm: isFirstPage ? referrer.utmTerm : null, + gclid: isFirstPage ? referrer.gclid : null, + fbclid: isFirstPage ? referrer.fbclid : null, + eventName: null, + tag: null, + createdAt: currentTime, + }); + + // Check for custom events on this page + for (const customEvent of siteConfig.customEvents) { + // Check if this event can occur on this page + if (customEvent.pages && !customEvent.pages.includes(pagePath)) { + continue; + } + + // Random chance based on weight + if (Math.random() < customEvent.weight) { + currentTime = addSeconds(currentTime, randomInt(2, 15)); + + const customEventId = uuid(); + events.push({ + id: customEventId, + websiteId: session.websiteId, + sessionId: session.id, + visitId, + eventType: EVENT_TYPE.customEvent, + urlPath: pagePath, + urlQuery: null, + pageTitle, + hostname: siteConfig.hostname, + referrerDomain: null, + referrerPath: null, + utmSource: null, + utmMedium: null, + utmCampaign: null, + utmContent: null, + utmTerm: null, + gclid: null, + fbclid: null, + eventName: customEvent.name, + tag: null, + createdAt: currentTime, + }); + + // Generate event data if configured + if (customEvent.data) { + for (const [key, values] of Object.entries(customEvent.data)) { + const value = values[Math.floor(Math.random() * values.length)]; + const isNumber = typeof value === 'number'; + + eventDataEntries.push({ + id: uuid(), + websiteId: session.websiteId, + websiteEventId: customEventId, + dataKey: key, + stringValue: isNumber ? null : String(value), + numberValue: isNumber ? value : null, + dateValue: null, + dataType: isNumber ? 2 : 1, // 1 = string, 2 = number + createdAt: currentTime, + }); + } + } + } + } + + // Time spent on page before navigating + const timeOnPage = getPageTimeOnPage(siteConfig.pages, pagePath); + const variance = Math.floor(timeOnPage * 0.5); + const actualTime = timeOnPage + randomInt(-variance, variance); + currentTime = addSeconds(currentTime, Math.max(5, actualTime)); + } + + return { events, eventDataEntries }; +} diff --git a/scripts/seed/generators/revenue.ts b/scripts/seed/generators/revenue.ts new file mode 100644 index 00000000..deea9e6b --- /dev/null +++ b/scripts/seed/generators/revenue.ts @@ -0,0 +1,65 @@ +import { uuid, randomFloat } from '../utils.js'; +import type { EventData } from './events.js'; + +export interface RevenueConfig { + eventName: string; + minAmount: number; + maxAmount: number; + currency: string; + weight: number; +} + +export interface RevenueData { + id: string; + websiteId: string; + sessionId: string; + eventId: string; + eventName: string; + currency: string; + revenue: number; + createdAt: Date; +} + +export function generateRevenue(event: EventData, config: RevenueConfig): RevenueData | null { + if (event.eventName !== config.eventName) { + return null; + } + + if (Math.random() > config.weight) { + return null; + } + + const revenue = randomFloat(config.minAmount, config.maxAmount); + + return { + id: uuid(), + websiteId: event.websiteId, + sessionId: event.sessionId, + eventId: event.id, + eventName: event.eventName!, + currency: config.currency, + revenue: Math.round(revenue * 100) / 100, // Round to 2 decimal places + createdAt: event.createdAt, + }; +} + +export function generateRevenueForEvents( + events: EventData[], + configs: RevenueConfig[], +): RevenueData[] { + const revenueEntries: RevenueData[] = []; + + for (const event of events) { + if (!event.eventName) continue; + + for (const config of configs) { + const revenue = generateRevenue(event, config); + if (revenue) { + revenueEntries.push(revenue); + break; // Only one revenue per event + } + } + } + + return revenueEntries; +} diff --git a/scripts/seed/generators/sessions.ts b/scripts/seed/generators/sessions.ts new file mode 100644 index 00000000..1370511f --- /dev/null +++ b/scripts/seed/generators/sessions.ts @@ -0,0 +1,52 @@ +import { uuid } from '../utils.js'; +import { getRandomDevice } from '../distributions/devices.js'; +import { getRandomGeo, getRandomLanguage } from '../distributions/geographic.js'; +import { generateTimestampForDay } from '../distributions/temporal.js'; + +export interface SessionData { + id: string; + websiteId: string; + browser: string; + os: string; + device: string; + screen: string; + language: string; + country: string; + region: string; + city: string; + createdAt: Date; +} + +export function createSession(websiteId: string, day: Date): SessionData { + const deviceInfo = getRandomDevice(); + const geo = getRandomGeo(); + const language = getRandomLanguage(); + const createdAt = generateTimestampForDay(day); + + return { + id: uuid(), + websiteId, + browser: deviceInfo.browser, + os: deviceInfo.os, + device: deviceInfo.device, + screen: deviceInfo.screen, + language, + country: geo.country, + region: geo.region, + city: geo.city, + createdAt, + }; +} + +export function createSessions(websiteId: string, day: Date, count: number): SessionData[] { + const sessions: SessionData[] = []; + + for (let i = 0; i < count; i++) { + sessions.push(createSession(websiteId, day)); + } + + // Sort by createdAt to maintain chronological order + sessions.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime()); + + return sessions; +} diff --git a/scripts/seed/index.ts b/scripts/seed/index.ts new file mode 100644 index 00000000..5b9de8de --- /dev/null +++ b/scripts/seed/index.ts @@ -0,0 +1,378 @@ +/* eslint-disable no-console */ +import 'dotenv/config'; +import { PrismaPg } from '@prisma/adapter-pg'; +import { PrismaClient, Prisma } from '../../src/generated/prisma/client.js'; +import { uuid, generateDatesBetween, subDays, formatNumber, progressBar } from './utils.js'; +import { createSessions, type SessionData } from './generators/sessions.js'; +import { + generateEventsForSession, + type EventData, + type EventDataEntry, +} from './generators/events.js'; +import { + generateRevenueForEvents, + type RevenueData, + type RevenueConfig, +} from './generators/revenue.js'; +import { getSessionCountForDay } from './distributions/temporal.js'; +import { + BLOG_WEBSITE_NAME, + BLOG_WEBSITE_DOMAIN, + BLOG_SESSIONS_PER_DAY, + getBlogSiteConfig, + getBlogJourney, +} from './sites/blog.js'; +import { + SAAS_WEBSITE_NAME, + SAAS_WEBSITE_DOMAIN, + SAAS_SESSIONS_PER_DAY, + getSaasSiteConfig, + getSaasJourney, + saasRevenueConfigs, +} from './sites/saas.js'; + +const BATCH_SIZE = 1000; + +type SessionCreateInput = Prisma.SessionCreateManyInput; +type WebsiteEventCreateInput = Prisma.WebsiteEventCreateManyInput; +type EventDataCreateInput = Prisma.EventDataCreateManyInput; +type RevenueCreateInput = Prisma.RevenueCreateManyInput; + +export interface SeedConfig { + days: number; + clear: boolean; + verbose: boolean; +} + +export interface SeedResult { + websites: number; + sessions: number; + events: number; + eventData: number; + revenue: number; +} + +async function batchInsertSessions( + prisma: PrismaClient, + data: SessionCreateInput[], + verbose: boolean, +): Promise { + for (let i = 0; i < data.length; i += BATCH_SIZE) { + const batch = data.slice(i, i + BATCH_SIZE); + await prisma.session.createMany({ data: batch, skipDuplicates: true }); + if (verbose) { + console.log( + ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} session records`, + ); + } + } +} + +async function batchInsertEvents( + prisma: PrismaClient, + data: WebsiteEventCreateInput[], + verbose: boolean, +): Promise { + for (let i = 0; i < data.length; i += BATCH_SIZE) { + const batch = data.slice(i, i + BATCH_SIZE); + await prisma.websiteEvent.createMany({ data: batch, skipDuplicates: true }); + if (verbose) { + console.log( + ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} event records`, + ); + } + } +} + +async function batchInsertEventData( + prisma: PrismaClient, + data: EventDataCreateInput[], + verbose: boolean, +): Promise { + for (let i = 0; i < data.length; i += BATCH_SIZE) { + const batch = data.slice(i, i + BATCH_SIZE); + await prisma.eventData.createMany({ data: batch, skipDuplicates: true }); + if (verbose) { + console.log( + ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} eventData records`, + ); + } + } +} + +async function batchInsertRevenue( + prisma: PrismaClient, + data: RevenueCreateInput[], + verbose: boolean, +): Promise { + for (let i = 0; i < data.length; i += BATCH_SIZE) { + const batch = data.slice(i, i + BATCH_SIZE); + await prisma.revenue.createMany({ data: batch, skipDuplicates: true }); + if (verbose) { + console.log( + ` Inserted ${Math.min(i + BATCH_SIZE, data.length)}/${data.length} revenue records`, + ); + } + } +} + +async function findAdminUser(prisma: PrismaClient): Promise { + const adminUser = await prisma.user.findFirst({ + where: { role: 'admin' }, + select: { id: true }, + }); + + if (!adminUser) { + throw new Error( + 'No admin user found in the database.\n' + + 'Please ensure you have run the initial setup and created an admin user.\n' + + 'The default admin user is created during first build (username: admin, password: umami).', + ); + } + + return adminUser.id; +} + +async function createWebsite( + prisma: PrismaClient, + name: string, + domain: string, + adminUserId: string, +): Promise { + const websiteId = uuid(); + + await prisma.website.create({ + data: { + id: websiteId, + name, + domain, + userId: adminUserId, + createdBy: adminUserId, + }, + }); + + return websiteId; +} + +async function clearDemoData(prisma: PrismaClient): Promise { + console.log('Clearing existing demo data...'); + + const demoWebsites = await prisma.website.findMany({ + where: { + OR: [{ name: BLOG_WEBSITE_NAME }, { name: SAAS_WEBSITE_NAME }], + }, + select: { id: true }, + }); + + const websiteIds = demoWebsites.map(w => w.id); + + if (websiteIds.length === 0) { + console.log(' No existing demo websites found'); + return; + } + + console.log(` Found ${websiteIds.length} demo website(s)`); + + // Delete in correct order due to foreign key constraints + await prisma.revenue.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.eventData.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.sessionData.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.websiteEvent.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.session.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.segment.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.report.deleteMany({ where: { websiteId: { in: websiteIds } } }); + await prisma.website.deleteMany({ where: { id: { in: websiteIds } } }); + + console.log(' Cleared existing demo data'); +} + +interface SiteGeneratorConfig { + name: string; + domain: string; + sessionsPerDay: number; + getSiteConfig: () => ReturnType; + getJourney: () => string[]; + revenueConfigs?: RevenueConfig[]; +} + +async function generateSiteData( + prisma: PrismaClient, + config: SiteGeneratorConfig, + days: Date[], + adminUserId: string, + verbose: boolean, +): Promise<{ sessions: number; events: number; eventData: number; revenue: number }> { + console.log(`\nGenerating data for ${config.name}...`); + + const websiteId = await createWebsite(prisma, config.name, config.domain, adminUserId); + console.log(` Created website: ${config.name} (${websiteId})`); + + const siteConfig = config.getSiteConfig(); + + const allSessions: SessionData[] = []; + const allEvents: EventData[] = []; + const allEventData: EventDataEntry[] = []; + const allRevenue: RevenueData[] = []; + + for (let dayIndex = 0; dayIndex < days.length; dayIndex++) { + const day = days[dayIndex]; + const sessionCount = getSessionCountForDay(config.sessionsPerDay, day); + const sessions = createSessions(websiteId, day, sessionCount); + + for (const session of sessions) { + const journey = config.getJourney(); + const { events, eventDataEntries } = generateEventsForSession(session, siteConfig, journey); + + allSessions.push(session); + allEvents.push(...events); + allEventData.push(...eventDataEntries); + + if (config.revenueConfigs) { + const revenueEntries = generateRevenueForEvents(events, config.revenueConfigs); + allRevenue.push(...revenueEntries); + } + } + + // Show progress (every day in verbose mode, otherwise every 2 days) + const shouldShowProgress = verbose || dayIndex % 2 === 0 || dayIndex === days.length - 1; + if (shouldShowProgress) { + process.stdout.write( + `\r ${progressBar(dayIndex + 1, days.length)} Day ${dayIndex + 1}/${days.length}`, + ); + } + } + + console.log(''); // New line after progress bar + + // Batch insert all data + console.log(` Inserting ${formatNumber(allSessions.length)} sessions...`); + await batchInsertSessions(prisma, allSessions as SessionCreateInput[], verbose); + + console.log(` Inserting ${formatNumber(allEvents.length)} events...`); + await batchInsertEvents(prisma, allEvents as WebsiteEventCreateInput[], verbose); + + if (allEventData.length > 0) { + console.log(` Inserting ${formatNumber(allEventData.length)} event data entries...`); + await batchInsertEventData(prisma, allEventData as EventDataCreateInput[], verbose); + } + + if (allRevenue.length > 0) { + console.log(` Inserting ${formatNumber(allRevenue.length)} revenue entries...`); + await batchInsertRevenue(prisma, allRevenue as RevenueCreateInput[], verbose); + } + + return { + sessions: allSessions.length, + events: allEvents.length, + eventData: allEventData.length, + revenue: allRevenue.length, + }; +} + +function createPrismaClient(): PrismaClient { + const url = process.env.DATABASE_URL; + if (!url) { + throw new Error( + 'DATABASE_URL environment variable is not set.\n' + + 'Please set DATABASE_URL in your .env file or environment.\n' + + 'Example: DATABASE_URL=postgresql://user:password@localhost:5432/umami', + ); + } + + let schema: string | undefined; + try { + const connectionUrl = new URL(url); + schema = connectionUrl.searchParams.get('schema') ?? undefined; + } catch { + throw new Error( + 'DATABASE_URL is not a valid URL.\n' + + 'Expected format: postgresql://user:password@host:port/database\n' + + `Received: ${url.substring(0, 30)}...`, + ); + } + + const adapter = new PrismaPg({ connectionString: url }, { schema }); + + return new PrismaClient({ + adapter, + errorFormat: 'pretty', + }); +} + +export async function seed(config: SeedConfig): Promise { + const prisma = createPrismaClient(); + + try { + const endDate = new Date(); + const startDate = subDays(endDate, config.days); + const days = generateDatesBetween(startDate, endDate); + + console.log(`\nSeed Configuration:`); + console.log( + ` Date range: ${startDate.toISOString().split('T')[0]} to ${endDate.toISOString().split('T')[0]}`, + ); + console.log(` Days: ${days.length}`); + console.log(` Clear existing: ${config.clear}`); + + if (config.clear) { + await clearDemoData(prisma); + } + + // Find admin user to own the demo websites + const adminUserId = await findAdminUser(prisma); + console.log(` Using admin user: ${adminUserId}`); + + // Generate Blog site (low traffic) + const blogResults = await generateSiteData( + prisma, + { + name: BLOG_WEBSITE_NAME, + domain: BLOG_WEBSITE_DOMAIN, + sessionsPerDay: BLOG_SESSIONS_PER_DAY, + getSiteConfig: getBlogSiteConfig, + getJourney: getBlogJourney, + }, + days, + adminUserId, + config.verbose, + ); + + // Generate SaaS site (high traffic) + const saasResults = await generateSiteData( + prisma, + { + name: SAAS_WEBSITE_NAME, + domain: SAAS_WEBSITE_DOMAIN, + sessionsPerDay: SAAS_SESSIONS_PER_DAY, + getSiteConfig: getSaasSiteConfig, + getJourney: getSaasJourney, + revenueConfigs: saasRevenueConfigs, + }, + days, + adminUserId, + config.verbose, + ); + + const result: SeedResult = { + websites: 2, + sessions: blogResults.sessions + saasResults.sessions, + events: blogResults.events + saasResults.events, + eventData: blogResults.eventData + saasResults.eventData, + revenue: blogResults.revenue + saasResults.revenue, + }; + + console.log(`\n${'─'.repeat(50)}`); + console.log(`Seed Complete!`); + console.log(`${'─'.repeat(50)}`); + console.log(` Websites: ${formatNumber(result.websites)}`); + console.log(` Sessions: ${formatNumber(result.sessions)}`); + console.log(` Events: ${formatNumber(result.events)}`); + console.log(` Event Data: ${formatNumber(result.eventData)}`); + console.log(` Revenue: ${formatNumber(result.revenue)}`); + console.log(`${'─'.repeat(50)}\n`); + + return result; + } finally { + await prisma.$disconnect(); + } +} diff --git a/scripts/seed/sites/blog.ts b/scripts/seed/sites/blog.ts new file mode 100644 index 00000000..e60b8b95 --- /dev/null +++ b/scripts/seed/sites/blog.ts @@ -0,0 +1,108 @@ +import { weightedRandom, type WeightedOption } from '../utils.js'; +import type { + SiteConfig, + JourneyConfig, + PageConfig, + CustomEventConfig, +} from '../generators/events.js'; + +export const BLOG_WEBSITE_NAME = 'Demo Blog'; +export const BLOG_WEBSITE_DOMAIN = 'blog.example.com'; + +const blogPosts = [ + 'getting-started-with-analytics', + 'privacy-first-tracking', + 'understanding-your-visitors', + 'improving-page-performance', + 'seo-best-practices', + 'content-marketing-guide', + 'building-audience-trust', + 'data-driven-decisions', +]; + +export const blogPages: PageConfig[] = [ + { path: '/', title: 'Demo Blog - Home', weight: 0.25, avgTimeOnPage: 30 }, + { path: '/blog', title: 'Blog Posts', weight: 0.2, avgTimeOnPage: 45 }, + { path: '/about', title: 'About Us', weight: 0.1, avgTimeOnPage: 60 }, + { path: '/contact', title: 'Contact', weight: 0.05, avgTimeOnPage: 45 }, + ...blogPosts.map(slug => ({ + path: `/blog/${slug}`, + title: slug + .split('-') + .map(w => w.charAt(0).toUpperCase() + w.slice(1)) + .join(' '), + weight: 0.05, + avgTimeOnPage: 180, + })), +]; + +export const blogJourneys: JourneyConfig[] = [ + // Direct to blog post (organic search) + { pages: ['/blog/getting-started-with-analytics'], weight: 0.15 }, + { pages: ['/blog/privacy-first-tracking'], weight: 0.12 }, + { pages: ['/blog/understanding-your-visitors'], weight: 0.1 }, + + // Homepage bounces + { pages: ['/'], weight: 0.15 }, + + // Homepage to blog listing + { pages: ['/', '/blog'], weight: 0.1 }, + + // Homepage to blog post + { pages: ['/', '/blog', '/blog/seo-best-practices'], weight: 0.08 }, + { pages: ['/', '/blog', '/blog/content-marketing-guide'], weight: 0.08 }, + + // About page visits + { pages: ['/', '/about'], weight: 0.07 }, + { pages: ['/', '/about', '/contact'], weight: 0.05 }, + + // Blog post to another + { pages: ['/blog/improving-page-performance', '/blog/data-driven-decisions'], weight: 0.05 }, + + // Longer sessions + { pages: ['/', '/blog', '/blog/building-audience-trust', '/about'], weight: 0.05 }, +]; + +export const blogCustomEvents: CustomEventConfig[] = [ + { + name: 'newsletter_signup', + weight: 0.03, + pages: ['/', '/blog'], + }, + { + name: 'share_click', + weight: 0.05, + pages: blogPosts.map(slug => `/blog/${slug}`), + data: { + platform: ['twitter', 'linkedin', 'facebook', 'copy_link'], + }, + }, + { + name: 'scroll_depth', + weight: 0.2, + pages: blogPosts.map(slug => `/blog/${slug}`), + data: { + depth: [25, 50, 75, 100], + }, + }, +]; + +export function getBlogSiteConfig(): SiteConfig { + return { + hostname: BLOG_WEBSITE_DOMAIN, + pages: blogPages, + journeys: blogJourneys, + customEvents: blogCustomEvents, + }; +} + +export function getBlogJourney(): string[] { + const journeyWeights: WeightedOption[] = blogJourneys.map(j => ({ + value: j.pages, + weight: j.weight, + })); + + return weightedRandom(journeyWeights); +} + +export const BLOG_SESSIONS_PER_DAY = 3; // ~90 sessions per month diff --git a/scripts/seed/sites/saas.ts b/scripts/seed/sites/saas.ts new file mode 100644 index 00000000..133895af --- /dev/null +++ b/scripts/seed/sites/saas.ts @@ -0,0 +1,185 @@ +import { weightedRandom, type WeightedOption } from '../utils.js'; +import type { + SiteConfig, + JourneyConfig, + PageConfig, + CustomEventConfig, +} from '../generators/events.js'; +import type { RevenueConfig } from '../generators/revenue.js'; + +export const SAAS_WEBSITE_NAME = 'Demo SaaS'; +export const SAAS_WEBSITE_DOMAIN = 'app.example.com'; + +const docsSections = [ + 'getting-started', + 'installation', + 'configuration', + 'api-reference', + 'integrations', +]; + +const blogPosts = [ + 'announcing-v2', + 'customer-success-story', + 'product-roadmap', + 'security-best-practices', +]; + +export const saasPages: PageConfig[] = [ + { path: '/', title: 'Demo SaaS - Analytics Made Simple', weight: 0.2, avgTimeOnPage: 45 }, + { path: '/features', title: 'Features', weight: 0.15, avgTimeOnPage: 90 }, + { path: '/pricing', title: 'Pricing', weight: 0.15, avgTimeOnPage: 120 }, + { path: '/docs', title: 'Documentation', weight: 0.1, avgTimeOnPage: 60 }, + { path: '/blog', title: 'Blog', weight: 0.05, avgTimeOnPage: 45 }, + { path: '/signup', title: 'Sign Up', weight: 0.08, avgTimeOnPage: 90 }, + { path: '/login', title: 'Login', weight: 0.05, avgTimeOnPage: 30 }, + { path: '/demo', title: 'Request Demo', weight: 0.05, avgTimeOnPage: 60 }, + ...docsSections.map(slug => ({ + path: `/docs/${slug}`, + title: `Docs: ${slug + .split('-') + .map(w => w.charAt(0).toUpperCase() + w.slice(1)) + .join(' ')}`, + weight: 0.02, + avgTimeOnPage: 180, + })), + ...blogPosts.map(slug => ({ + path: `/blog/${slug}`, + title: slug + .split('-') + .map(w => w.charAt(0).toUpperCase() + w.slice(1)) + .join(' '), + weight: 0.02, + avgTimeOnPage: 150, + })), +]; + +export const saasJourneys: JourneyConfig[] = [ + // Conversion funnel + { pages: ['/', '/features', '/pricing', '/signup'], weight: 0.12 }, + { pages: ['/', '/pricing', '/signup'], weight: 0.1 }, + { pages: ['/pricing', '/signup'], weight: 0.08 }, + + // Feature exploration + { pages: ['/', '/features'], weight: 0.1 }, + { pages: ['/', '/features', '/pricing'], weight: 0.08 }, + + // Documentation users + { pages: ['/docs', '/docs/getting-started'], weight: 0.08 }, + { pages: ['/docs/getting-started', '/docs/installation', '/docs/configuration'], weight: 0.06 }, + { pages: ['/docs/api-reference'], weight: 0.05 }, + + // Blog readers + { pages: ['/blog/announcing-v2'], weight: 0.05 }, + { pages: ['/blog/customer-success-story'], weight: 0.04 }, + + // Returning users + { pages: ['/login'], weight: 0.08 }, + + // Bounces + { pages: ['/'], weight: 0.08 }, + { pages: ['/pricing'], weight: 0.05 }, + + // Demo requests + { pages: ['/', '/demo'], weight: 0.03 }, +]; + +export const saasCustomEvents: CustomEventConfig[] = [ + { + name: 'signup_started', + weight: 0.6, + pages: ['/signup'], + data: { + plan: ['free', 'pro', 'enterprise'], + }, + }, + { + name: 'signup_completed', + weight: 0.3, + pages: ['/signup'], + data: { + plan: ['free', 'pro', 'enterprise'], + method: ['email', 'google', 'github'], + }, + }, + { + name: 'purchase', + weight: 0.15, + pages: ['/signup', '/pricing'], + data: { + plan: ['pro', 'enterprise'], + billing: ['monthly', 'annual'], + revenue: [29, 49, 99, 299], + currency: ['USD'], + }, + }, + { + name: 'demo_requested', + weight: 0.5, + pages: ['/demo'], + data: { + company_size: ['1-10', '11-50', '51-200', '200+'], + }, + }, + { + name: 'feature_viewed', + weight: 0.3, + pages: ['/features'], + data: { + feature: ['analytics', 'reports', 'api', 'integrations', 'privacy'], + }, + }, + { + name: 'cta_click', + weight: 0.15, + pages: ['/', '/features', '/pricing'], + data: { + button: ['hero_signup', 'nav_signup', 'pricing_cta', 'footer_cta'], + }, + }, + { + name: 'docs_search', + weight: 0.2, + pages: ['/docs', ...docsSections.map(s => `/docs/${s}`)], + data: { + query_type: ['api', 'setup', 'integration', 'troubleshooting'], + }, + }, +]; + +export const saasRevenueConfigs: RevenueConfig[] = [ + { + eventName: 'purchase', + minAmount: 29, + maxAmount: 29, + currency: 'USD', + weight: 0.7, // 70% Pro plan + }, + { + eventName: 'purchase', + minAmount: 299, + maxAmount: 299, + currency: 'USD', + weight: 0.3, // 30% Enterprise + }, +]; + +export function getSaasSiteConfig(): SiteConfig { + return { + hostname: SAAS_WEBSITE_DOMAIN, + pages: saasPages, + journeys: saasJourneys, + customEvents: saasCustomEvents, + }; +} + +export function getSaasJourney(): string[] { + const journeyWeights: WeightedOption[] = saasJourneys.map(j => ({ + value: j.pages, + weight: j.weight, + })); + + return weightedRandom(journeyWeights); +} + +export const SAAS_SESSIONS_PER_DAY = 500; diff --git a/scripts/seed/utils.ts b/scripts/seed/utils.ts new file mode 100644 index 00000000..7b44261e --- /dev/null +++ b/scripts/seed/utils.ts @@ -0,0 +1,85 @@ +import { v4 as uuidv4 } from 'uuid'; + +export interface WeightedOption { + value: T; + weight: number; +} + +export function weightedRandom(options: WeightedOption[]): T { + const totalWeight = options.reduce((sum, opt) => sum + opt.weight, 0); + let random = Math.random() * totalWeight; + + for (const option of options) { + random -= option.weight; + if (random <= 0) { + return option.value; + } + } + + return options[options.length - 1].value; +} + +export function randomInt(min: number, max: number): number { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +export function randomFloat(min: number, max: number): number { + return Math.random() * (max - min) + min; +} + +export function pickRandom(array: T[]): T { + return array[Math.floor(Math.random() * array.length)]; +} + +export function shuffleArray(array: T[]): T[] { + const result = [...array]; + for (let i = result.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [result[i], result[j]] = [result[j], result[i]]; + } + return result; +} + +export function uuid(): string { + return uuidv4(); +} + +export function generateDatesBetween(startDate: Date, endDate: Date): Date[] { + const dates: Date[] = []; + const current = new Date(startDate); + current.setHours(0, 0, 0, 0); + + while (current <= endDate) { + dates.push(new Date(current)); + current.setDate(current.getDate() + 1); + } + + return dates; +} + +export function addHours(date: Date, hours: number): Date { + return new Date(date.getTime() + hours * 60 * 60 * 1000); +} + +export function addMinutes(date: Date, minutes: number): Date { + return new Date(date.getTime() + minutes * 60 * 1000); +} + +export function addSeconds(date: Date, seconds: number): Date { + return new Date(date.getTime() + seconds * 1000); +} + +export function subDays(date: Date, days: number): Date { + return new Date(date.getTime() - days * 24 * 60 * 60 * 1000); +} + +export function formatNumber(num: number): string { + return num.toLocaleString(); +} + +export function progressBar(current: number, total: number, width = 30): string { + const percent = current / total; + const filled = Math.round(width * percent); + const empty = width - filled; + return `[${'█'.repeat(filled)}${'░'.repeat(empty)}] ${Math.round(percent * 100)}%`; +} From c481bc5dccda0a86b7ca0883de477874cba407cc Mon Sep 17 00:00:00 2001 From: Arthur Sepiol Date: Tue, 2 Dec 2025 20:25:25 +0300 Subject: [PATCH 29/45] chore: exclude seed scripts from Docker builds --- .dockerignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.dockerignore b/.dockerignore index 71cdb8b9..61cb85b9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,3 +7,5 @@ node_modules .idea .env .env.* +scripts/seed +scripts/seed-data.ts From 935517ce3a4a2aa046853338bb3e9e40f2a3449e Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 2 Dec 2025 09:41:46 -0800 Subject: [PATCH 30/45] add cascading deletes to revenue/segment table Closes #3798 --- src/queries/prisma/website.ts | 70 ++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/src/queries/prisma/website.ts b/src/queries/prisma/website.ts index d6ba6d38..79cb7247 100644 --- a/src/queries/prisma/website.ts +++ b/src/queries/prisma/website.ts @@ -137,6 +137,9 @@ export async function resetWebsite(websiteId: string) { return transaction( [ + client.revenue.deleteMany({ + where: { websiteId }, + }), client.eventData.deleteMany({ where: { websiteId }, }), @@ -175,35 +178,44 @@ export async function deleteWebsite(websiteId: string) { const { client, transaction } = prisma; const cloudMode = !!process.env.CLOUD_MODE; - return transaction([ - client.eventData.deleteMany({ - where: { websiteId }, - }), - client.sessionData.deleteMany({ - where: { websiteId }, - }), - client.websiteEvent.deleteMany({ - where: { websiteId }, - }), - client.session.deleteMany({ - where: { websiteId }, - }), - client.report.deleteMany({ - where: { - websiteId, - }, - }), - cloudMode - ? client.website.update({ - data: { - deletedAt: new Date(), - }, - where: { id: websiteId }, - }) - : client.website.delete({ - where: { id: websiteId }, - }), - ]).then(async data => { + return transaction( + [ + client.revenue.deleteMany({ + where: { websiteId }, + }), + client.eventData.deleteMany({ + where: { websiteId }, + }), + client.sessionData.deleteMany({ + where: { websiteId }, + }), + client.websiteEvent.deleteMany({ + where: { websiteId }, + }), + client.session.deleteMany({ + where: { websiteId }, + }), + client.report.deleteMany({ + where: { websiteId }, + }), + client.segment.deleteMany({ + where: { websiteId }, + }), + cloudMode + ? client.website.update({ + data: { + deletedAt: new Date(), + }, + where: { id: websiteId }, + }) + : client.website.delete({ + where: { id: websiteId }, + }), + ], + { + timeout: 30000, + }, + ).then(async data => { if (cloudMode) { await redis.client.del(`website:${websiteId}`); } From 170821e2f958132fd85a27e182fab68f8b400644 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 2 Dec 2025 13:45:49 -0800 Subject: [PATCH 31/45] Populate teams on login. Closes #3796 --- src/app/api/auth/login/route.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index 7c2b2fed..17ca2f7d 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -7,7 +7,7 @@ import { checkPassword } from '@/lib/password'; import redis from '@/lib/redis'; import { parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; -import { getUserByUsername } from '@/queries/prisma'; +import { getAllUserTeams, getUserByUsername } from '@/queries/prisma'; export async function POST(request: Request) { const schema = z.object({ @@ -39,8 +39,10 @@ export async function POST(request: Request) { token = createSecureToken({ userId: user.id, role }, secret()); } + const teams = await getAllUserTeams(id); + return json({ token, - user: { id, username, role, createdAt, isAdmin: role === ROLES.admin }, + user: { id, username, role, createdAt, isAdmin: role === ROLES.admin, teams }, }); } From b0f38b266bc6fbc079b65d75bd27b5b925bec827 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 2 Dec 2025 14:44:10 -0800 Subject: [PATCH 32/45] truncate large legend labels Closes #3813 --- src/components/metrics/Legend.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/metrics/Legend.tsx b/src/components/metrics/Legend.tsx index 63231919..34ddb5a0 100644 --- a/src/components/metrics/Legend.tsx +++ b/src/components/metrics/Legend.tsx @@ -22,7 +22,12 @@ export function Legend({ return ( onClick(item)}> - + {text} From 22f1b7d7c96d326887f55145d7798d2edb6b26b6 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 2 Dec 2025 15:57:45 -0800 Subject: [PATCH 33/45] add theme and locale url parameter options to share page Closes #3754 --- src/app/share/[...shareId]/SharePage.tsx | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/app/share/[...shareId]/SharePage.tsx b/src/app/share/[...shareId]/SharePage.tsx index 55d3ee9f..c1da2168 100644 --- a/src/app/share/[...shareId]/SharePage.tsx +++ b/src/app/share/[...shareId]/SharePage.tsx @@ -1,15 +1,33 @@ 'use client'; -import { Column } from '@umami/react-zen'; +import { Column, useTheme } from '@umami/react-zen'; +import { useEffect } from 'react'; import { WebsiteHeader } from '@/app/(main)/websites/[websiteId]/WebsiteHeader'; import { WebsitePage } from '@/app/(main)/websites/[websiteId]/WebsitePage'; import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; import { PageBody } from '@/components/common/PageBody'; -import { useShareTokenQuery } from '@/components/hooks'; +import { useLocale, useShareTokenQuery } from '@/components/hooks'; +import { languages } from '@/lib/lang'; import { Footer } from './Footer'; import { Header } from './Header'; export function SharePage({ shareId }) { const { shareToken, isLoading } = useShareTokenQuery(shareId); + const { setTheme } = useTheme(); + const { saveLocale } = useLocale(); + + useEffect(() => { + const url = new URL(window?.location?.href); + const theme = url.searchParams.get('theme'); + const locale = url.searchParams.get('locale'); + + if (theme === 'light' || theme === 'dark') { + setTheme(theme); + } + + if (Object.keys(languages).includes(locale)) { + saveLocale(locale); + } + }, []); if (isLoading || !shareToken) { return null; From f47e1072d9d0c0ba9650cdd5eb1f458f6a1d472a Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 2 Dec 2025 16:10:11 -0800 Subject: [PATCH 34/45] remove locale code from SharePage --- src/app/share/[...shareId]/SharePage.tsx | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/app/share/[...shareId]/SharePage.tsx b/src/app/share/[...shareId]/SharePage.tsx index c1da2168..7ed06673 100644 --- a/src/app/share/[...shareId]/SharePage.tsx +++ b/src/app/share/[...shareId]/SharePage.tsx @@ -5,28 +5,21 @@ import { WebsiteHeader } from '@/app/(main)/websites/[websiteId]/WebsiteHeader'; import { WebsitePage } from '@/app/(main)/websites/[websiteId]/WebsitePage'; import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; import { PageBody } from '@/components/common/PageBody'; -import { useLocale, useShareTokenQuery } from '@/components/hooks'; -import { languages } from '@/lib/lang'; +import { useShareTokenQuery } from '@/components/hooks'; import { Footer } from './Footer'; import { Header } from './Header'; export function SharePage({ shareId }) { const { shareToken, isLoading } = useShareTokenQuery(shareId); const { setTheme } = useTheme(); - const { saveLocale } = useLocale(); useEffect(() => { const url = new URL(window?.location?.href); const theme = url.searchParams.get('theme'); - const locale = url.searchParams.get('locale'); if (theme === 'light' || theme === 'dark') { setTheme(theme); } - - if (Object.keys(languages).includes(locale)) { - saveLocale(locale); - } }, []); if (isLoading || !shareToken) { From 89b985652ade3ecfca71f9948635accbb35b6aa9 Mon Sep 17 00:00:00 2001 From: Indra Gunawan Date: Wed, 3 Dec 2025 15:31:54 +0800 Subject: [PATCH 35/45] fix: disable prefetch for Links view button --- src/app/(main)/links/[linkId]/LinkHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx index b7c70f07..33f0c242 100644 --- a/src/app/(main)/links/[linkId]/LinkHeader.tsx +++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx @@ -11,7 +11,7 @@ export function LinkHeader() { return ( } marginBottom="3"> - + From a0940d78a7f0d63c28ecc262d50bb689b3008d45 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 2 Dec 2025 23:32:44 -0800 Subject: [PATCH 36/45] Updated packages. --- package.json | 2 +- pnpm-lock.yaml | 157 ++++++++++++++++++++++++++++++------------------- 2 files changed, 96 insertions(+), 63 deletions(-) diff --git a/package.json b/package.json index 077b74d3..fd40f40e 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", "@tanstack/react-query": "^5.90.5", - "@umami/react-zen": "^0.210.0", + "@umami/react-zen": "^0.211.0", "@umami/redis-client": "^0.29.0", "bcryptjs": "^3.0.2", "chalk": "^5.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e19b4029..ba2da5a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,8 +45,8 @@ importers: specifier: ^5.90.5 version: 5.90.10(react@19.2.0) '@umami/react-zen': - specifier: ^0.210.0 - version: 0.210.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + specifier: ^0.211.0 + version: 0.211.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) '@umami/redis-client': specifier: ^0.29.0 version: 0.29.0 @@ -1693,8 +1693,8 @@ packages: '@next/env@15.5.3': resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} - '@next/env@15.5.6': - resolution: {integrity: sha512-3qBGRW+sCGzgbpc5TS1a0p7eNxnOarGVQhZxfvTdnV0gFI61lX7QNtQ4V1TSREctXzYn5NetbUsLvyqwLFJM6Q==} + '@next/env@16.0.6': + resolution: {integrity: sha512-PFTK/G/vM3UJwK5XDYMFOqt8QW42mmhSgdKDapOlCqBUAOfJN2dyOnASR/xUR/JRrro0pLohh/zOJ77xUQWQAg==} '@next/swc-darwin-arm64@15.5.3': resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} @@ -1702,8 +1702,8 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.5.6': - resolution: {integrity: sha512-ES3nRz7N+L5Umz4KoGfZ4XX6gwHplwPhioVRc25+QNsDa7RtUF/z8wJcbuQ2Tffm5RZwuN2A063eapoJ1u4nPg==} + '@next/swc-darwin-arm64@16.0.6': + resolution: {integrity: sha512-AGzKiPlDiui+9JcPRHLI4V9WFTTcKukhJTfK9qu3e0tz+Y/88B7vo5yZoO7UaikplJEHORzG3QaBFQfkjhnL0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -1714,8 +1714,8 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.5.6': - resolution: {integrity: sha512-JIGcytAyk9LQp2/nuVZPAtj8uaJ/zZhsKOASTjxDug0SPU9LAM3wy6nPU735M1OqacR4U20LHVF5v5Wnl9ptTA==} + '@next/swc-darwin-x64@16.0.6': + resolution: {integrity: sha512-LlLLNrK9WCIUkq2GciWDcquXYIf7vLxX8XE49gz7EncssZGL1vlHwgmURiJsUZAvk0HM1a8qb1ABDezsjAE/jw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -1726,8 +1726,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.5.6': - resolution: {integrity: sha512-qvz4SVKQ0P3/Im9zcS2RmfFL/UCQnsJKJwQSkissbngnB/12c6bZTCB0gHTexz1s6d/mD0+egPKXAIRFVS7hQg==} + '@next/swc-linux-arm64-gnu@16.0.6': + resolution: {integrity: sha512-r04NzmLSGGfG8EPXKVK72N5zDNnq9pa9el78LhdtqIC3zqKh74QfKHnk24DoK4PEs6eY7sIK/CnNpt30oc59kg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1738,8 +1738,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.6': - resolution: {integrity: sha512-FsbGVw3SJz1hZlvnWD+T6GFgV9/NYDeLTNQB2MXoPN5u9VA9OEDy6fJEfePfsUKAhJufFbZLgp0cPxMuV6SV0w==} + '@next/swc-linux-arm64-musl@16.0.6': + resolution: {integrity: sha512-hfB/QV0hA7lbD1OJxp52wVDlpffUMfyxUB5ysZbb/pBC5iuhyLcEKSVQo56PFUUmUQzbMsAtUu6k2Gh9bBtWXA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -1750,8 +1750,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.6': - resolution: {integrity: sha512-3QnHGFWlnvAgyxFxt2Ny8PTpXtQD7kVEeaFat5oPAHHI192WKYB+VIKZijtHLGdBBvc16tiAkPTDmQNOQ0dyrA==} + '@next/swc-linux-x64-gnu@16.0.6': + resolution: {integrity: sha512-PZJushBgfvKhJBy01yXMdgL+l5XKr7uSn5jhOQXQXiH3iPT2M9iG64yHpPNGIKitKrHJInwmhPVGogZBAJOCPw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1762,8 +1762,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.6': - resolution: {integrity: sha512-OsGX148sL+TqMK9YFaPFPoIaJKbFJJxFzkXZljIgA9hjMjdruKht6xDCEv1HLtlLNfkx3c5w2GLKhj7veBQizQ==} + '@next/swc-linux-x64-musl@16.0.6': + resolution: {integrity: sha512-LqY76IojrH9yS5fyATjLzlOIOgwyzBuNRqXwVxcGfZ58DWNQSyfnLGlfF6shAEqjwlDNLh4Z+P0rnOI87Y9jEw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -1774,8 +1774,8 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.5.6': - resolution: {integrity: sha512-ONOMrqWxdzXDJNh2n60H6gGyKed42Ieu6UTVPZteXpuKbLZTH4G4eBMsr5qWgOBA+s7F+uB4OJbZnrkEDnZ5Fg==} + '@next/swc-win32-arm64-msvc@16.0.6': + resolution: {integrity: sha512-eIfSNNqAkj0tqKRf0u7BVjqylJCuabSrxnpSENY3YKApqwDMeAqYPmnOwmVe6DDl3Lvkbe7cJAyP6i9hQ5PmmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -1786,8 +1786,8 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.6': - resolution: {integrity: sha512-pxK4VIjFRx1MY92UycLOOw7dTdvccWsNETQ0kDHkBlcFH1GrTLUjSiHU1ohrznnux6TqRHgv5oflhfIWZwVROQ==} + '@next/swc-win32-x64-msvc@16.0.6': + resolution: {integrity: sha512-QGs18P4OKdK9y2F3Th42+KGnwsc2iaThOe6jxQgP62kslUU4W+g6AzI6bdIn/pslhSfxjAMU5SjakfT5Fyo/xA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2947,8 +2947,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@umami/react-zen@0.210.0': - resolution: {integrity: sha512-nQ8EfrSleuXMPBVabr6rDoH2VS0ca41A3V2OCQbG4HqgLJ5+Mj8gHT/aLqUz5EKNBAmMy0/XxPNAgsHwwoxrCQ==} + '@umami/react-zen@0.211.0': + resolution: {integrity: sha512-e9dfsmMYpClYU/xQ+nwFo4ktAJc6eth4k6lpdD4j47FD5PaMfSY1FK1qJ7yq/JVN0Ydomc8cuWBDZbHpG4sQmQ==} '@umami/redis-client@0.29.0': resolution: {integrity: sha512-Jaqh++jskqDB7ny75pfC02OvKp1JTS4asGDsFrRL3qy8sxL3PAl9+/mybCJe4/6vWrXDJKqpgkSfUDJq2bFjyw==} @@ -3277,8 +3277,8 @@ packages: caniuse-lite@1.0.30001741: resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} - caniuse-lite@1.0.30001756: - resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4194,6 +4194,10 @@ packages: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -5037,6 +5041,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -5044,13 +5052,13 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lucide-react@0.511.0: - resolution: {integrity: sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==} + lucide-react@0.543.0: + resolution: {integrity: sha512-fpVfuOQO0V3HBaOA1stIiP/A2fPCXHIleRZL16Mx3HmjTYwNSbimhnFBygs2CAfU1geexMX5ItUcWBGUaqw5CA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lucide-react@0.543.0: - resolution: {integrity: sha512-fpVfuOQO0V3HBaOA1stIiP/A2fPCXHIleRZL16Mx3HmjTYwNSbimhnFBygs2CAfU1geexMX5ItUcWBGUaqw5CA==} + lucide-react@0.555.0: + resolution: {integrity: sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -5161,6 +5169,10 @@ packages: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -5249,9 +5261,9 @@ packages: sass: optional: true - next@15.5.6: - resolution: {integrity: sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.0.6: + resolution: {integrity: sha512-2zOZ/4FdaAp5hfCU/RnzARlZzBsjaTZ/XjNQmuyYLluAPM7kcrbIkdeO2SL0Ysd1vnrSgU+GwugfeWX1cUCgCg==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -5451,6 +5463,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -6119,8 +6135,8 @@ packages: peerDependencies: react: '>=16.13.1' - react-hook-form@7.66.1: - resolution: {integrity: sha512-2KnjpgG2Rhbi+CIiIBQQ9Df6sMGH5ExNyFl4Hw9qO7pIqMBR8Bvu9RQyjl3JM4vehzCh9soiNUM/xYMswb2EiA==} + react-hook-form@7.67.0: + resolution: {integrity: sha512-E55EOwKJHHIT/I6J9DmQbCWToAYSw9nN5R57MZw9rMtjh+YQreMDxRLfdjfxQbiJ3/qbg3Z02wGzBX4M+5fMtQ==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -8450,54 +8466,54 @@ snapshots: '@next/env@15.5.3': {} - '@next/env@15.5.6': {} + '@next/env@16.0.6': {} '@next/swc-darwin-arm64@15.5.3': optional: true - '@next/swc-darwin-arm64@15.5.6': + '@next/swc-darwin-arm64@16.0.6': optional: true '@next/swc-darwin-x64@15.5.3': optional: true - '@next/swc-darwin-x64@15.5.6': + '@next/swc-darwin-x64@16.0.6': optional: true '@next/swc-linux-arm64-gnu@15.5.3': optional: true - '@next/swc-linux-arm64-gnu@15.5.6': + '@next/swc-linux-arm64-gnu@16.0.6': optional: true '@next/swc-linux-arm64-musl@15.5.3': optional: true - '@next/swc-linux-arm64-musl@15.5.6': + '@next/swc-linux-arm64-musl@16.0.6': optional: true '@next/swc-linux-x64-gnu@15.5.3': optional: true - '@next/swc-linux-x64-gnu@15.5.6': + '@next/swc-linux-x64-gnu@16.0.6': optional: true '@next/swc-linux-x64-musl@15.5.3': optional: true - '@next/swc-linux-x64-musl@15.5.6': + '@next/swc-linux-x64-musl@16.0.6': optional: true '@next/swc-win32-arm64-msvc@15.5.3': optional: true - '@next/swc-win32-arm64-msvc@15.5.6': + '@next/swc-win32-arm64-msvc@16.0.6': optional: true '@next/swc-win32-x64-msvc@15.5.3': optional: true - '@next/swc-win32-x64-msvc@15.5.6': + '@next/swc-win32-x64-msvc@16.0.6': optional: true '@nodelib/fs.scandir@2.1.5': @@ -10087,21 +10103,21 @@ snapshots: '@types/node': 24.10.1 optional: true - '@umami/react-zen@0.210.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': + '@umami/react-zen@0.211.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 '@internationalized/date': 3.10.0 '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@react-spring/web': 9.7.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) classnames: 2.5.1 - glob: 10.5.0 + glob: 13.0.0 highlight.js: 11.11.1 - lucide-react: 0.511.0(react@19.2.0) - next: 15.5.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + lucide-react: 0.555.0(react@19.2.0) + next: 16.0.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-aria-components: 1.13.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react-dom: 19.2.0(react@19.2.0) - react-hook-form: 7.66.1(react@19.2.0) + react-hook-form: 7.67.0(react@19.2.0) react-icons: 5.5.0(react@19.2.0) thenby: 1.3.4 zustand: 5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) @@ -10507,7 +10523,7 @@ snapshots: caniuse-lite@1.0.30001741: {} - caniuse-lite@1.0.30001756: {} + caniuse-lite@1.0.30001759: {} caseless@0.12.0: {} @@ -11616,6 +11632,12 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -12646,6 +12668,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.2.4: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -12654,11 +12678,11 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.511.0(react@19.2.0): + lucide-react@0.543.0(react@19.2.0): dependencies: react: 19.2.0 - lucide-react@0.543.0(react@19.2.0): + lucide-react@0.555.0(react@19.2.0): dependencies: react: 19.2.0 @@ -12769,6 +12793,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -12853,24 +12881,24 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.5.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.5.6 + '@next/env': 16.0.6 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001756 + caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.6 - '@next/swc-darwin-x64': 15.5.6 - '@next/swc-linux-arm64-gnu': 15.5.6 - '@next/swc-linux-arm64-musl': 15.5.6 - '@next/swc-linux-x64-gnu': 15.5.6 - '@next/swc-linux-x64-musl': 15.5.6 - '@next/swc-win32-arm64-msvc': 15.5.6 - '@next/swc-win32-x64-msvc': 15.5.6 + '@next/swc-darwin-arm64': 16.0.6 + '@next/swc-darwin-x64': 16.0.6 + '@next/swc-linux-arm64-gnu': 16.0.6 + '@next/swc-linux-arm64-musl': 16.0.6 + '@next/swc-linux-x64-gnu': 16.0.6 + '@next/swc-linux-x64-musl': 16.0.6 + '@next/swc-win32-arm64-msvc': 16.0.6 + '@next/swc-win32-x64-msvc': 16.0.6 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.5 transitivePeerDependencies: @@ -13055,6 +13083,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + path-type@3.0.0: dependencies: pify: 3.0.0 @@ -13750,7 +13783,7 @@ snapshots: '@babel/runtime': 7.28.3 react: 19.2.0 - react-hook-form@7.66.1(react@19.2.0): + react-hook-form@7.67.0(react@19.2.0): dependencies: react: 19.2.0 From 16cae691f6a814ff8a2dc947ad9c3980afd70ce1 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 00:03:56 -0800 Subject: [PATCH 37/45] Don't prefetch links/pixels. Closes #3814 --- package.json | 2 +- pnpm-lock.yaml | 36 +++++++++++++++++++++++--- src/app/(main)/links/LinksTable.tsx | 6 ++++- src/app/(main)/pixels/PixelsTable.tsx | 6 ++++- src/components/common/ExternalLink.tsx | 9 +++++-- 5 files changed, 50 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 6a38f854..dc701dfb 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "test": "jest", "cypress-open": "cypress open cypress run", "cypress-run": "cypress run cypress run", - "seed-data": "tsx scripts/seed-data.ts" + "seed-data": "tsx scripts/seed-data.ts", "lint": "biome lint .", "format": "biome format --write .", "check": "biome check --write" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba2da5a2..be25301f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -323,7 +323,10 @@ importers: version: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) tsup: specifier: ^8.5.0 - version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.1) + tsx: + specifier: ^4.19.0 + version: 4.21.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -4176,6 +4179,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + getos@3.2.1: resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} @@ -6287,6 +6293,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -6899,6 +6908,11 @@ packages: typescript: optional: true + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -11602,6 +11616,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + getos@3.2.1: dependencies: async: 3.2.6 @@ -13319,12 +13337,13 @@ snapshots: postcss: 8.5.6 ts-node: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 postcss: 8.5.6 + tsx: 4.21.0 yaml: 2.8.1 postcss-logical@5.0.4(postcss@8.5.6): @@ -13985,6 +14004,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.3: {} resolve@1.22.10: @@ -14737,7 +14758,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 @@ -14748,7 +14769,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.1) resolve-from: 5.0.0 rollup: 4.53.3 source-map: 0.7.6 @@ -14765,6 +14786,13 @@ snapshots: - tsx - yaml + tsx@4.21.0: + dependencies: + esbuild: 0.27.0 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 diff --git a/src/app/(main)/links/LinksTable.tsx b/src/app/(main)/links/LinksTable.tsx index 2ce4ba49..a3b4a86a 100644 --- a/src/app/(main)/links/LinksTable.tsx +++ b/src/app/(main)/links/LinksTable.tsx @@ -21,7 +21,11 @@ export function LinksTable(props: DataTableProps) { {({ slug }: any) => { const url = getSlugUrl(slug); - return {url}; + return ( + + {url} + + ); }} diff --git a/src/app/(main)/pixels/PixelsTable.tsx b/src/app/(main)/pixels/PixelsTable.tsx index 48f2121b..48a84589 100644 --- a/src/app/(main)/pixels/PixelsTable.tsx +++ b/src/app/(main)/pixels/PixelsTable.tsx @@ -21,7 +21,11 @@ export function PixelsTable(props: DataTableProps) { {({ slug }: any) => { const url = getSlugUrl(slug); - return {url}; + return ( + + {url} + + ); }} diff --git a/src/components/common/ExternalLink.tsx b/src/components/common/ExternalLink.tsx index 6b6dbb99..dec0d16f 100644 --- a/src/components/common/ExternalLink.tsx +++ b/src/components/common/ExternalLink.tsx @@ -1,8 +1,13 @@ import { Icon, Row, Text } from '@umami/react-zen'; -import Link from 'next/link'; +import Link, { type LinkProps } from 'next/link'; +import type { ReactNode } from 'react'; import { ExternalLink as LinkIcon } from '@/components/icons'; -export function ExternalLink({ href, children, ...props }) { +export function ExternalLink({ + href, + children, + ...props +}: LinkProps & { href: string; children: ReactNode }) { return ( From 6b584338e3a6efd7f32302f2bfb875fa2430013f Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 3 Dec 2025 11:06:03 -0800 Subject: [PATCH 38/45] fix PageHeader type errors --- src/app/(main)/links/[linkId]/LinkHeader.tsx | 4 ++-- src/app/(main)/pixels/[pixelId]/PixelHeader.tsx | 2 +- src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx index 33f0c242..8e4c9ebc 100644 --- a/src/app/(main)/links/[linkId]/LinkHeader.tsx +++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx @@ -10,8 +10,8 @@ export function LinkHeader() { const link = useLink(); return ( - } marginBottom="3"> - + }> + diff --git a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx index 8171aaf1..68fa6561 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx @@ -10,7 +10,7 @@ export function PixelHeader() { const pixel = usePixel(); return ( - } marginBottom="3"> + }> diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index e7a92516..7dd1d771 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -23,7 +23,6 @@ export function WebsiteHeader({ showActions }: { showActions?: boolean }) { } - marginBottom="3" titleHref={renderUrl(`/websites/${website.id}`, false)} > From 65f657dd230bef9004a6afeb17ec7615e5cab2b2 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 3 Dec 2025 11:08:54 -0800 Subject: [PATCH 39/45] Revert "prisma schema boards + varchar length increase" This reverts commit cb034a13710a97a9f04d8ab71726e2ad2a90cc44. --- prisma/migrations/15_boards/migration.sql | 33 ------------ .../migration.sql | 16 ------ prisma/schema.prisma | 54 ++++++------------- 3 files changed, 15 insertions(+), 88 deletions(-) delete mode 100644 prisma/migrations/15_boards/migration.sql delete mode 100644 prisma/migrations/16_update_website_event_length/migration.sql diff --git a/prisma/migrations/15_boards/migration.sql b/prisma/migrations/15_boards/migration.sql deleted file mode 100644 index 09608c5f..00000000 --- a/prisma/migrations/15_boards/migration.sql +++ /dev/null @@ -1,33 +0,0 @@ --- CreateTable -CREATE TABLE "board" ( - "board_id" UUID NOT NULL, - "type" VARCHAR(50) NOT NULL, - "name" VARCHAR(200) NOT NULL, - "description" VARCHAR(500) NOT NULL, - "parameters" JSONB NOT NULL, - "slug" VARCHAR(100) NOT NULL, - "user_id" UUID, - "team_id" UUID, - "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMPTZ(6), - - CONSTRAINT "board_pkey" PRIMARY KEY ("board_id") -); - --- CreateIndex -CREATE UNIQUE INDEX "board_board_id_key" ON "board"("board_id"); - --- CreateIndex -CREATE UNIQUE INDEX "board_slug_key" ON "board"("slug"); - --- CreateIndex -CREATE INDEX "board_slug_idx" ON "board"("slug"); - --- CreateIndex -CREATE INDEX "board_user_id_idx" ON "board"("user_id"); - --- CreateIndex -CREATE INDEX "board_team_id_idx" ON "board"("team_id"); - --- CreateIndex -CREATE INDEX "board_created_at_idx" ON "board"("created_at"); diff --git a/prisma/migrations/16_update_website_event_length/migration.sql b/prisma/migrations/16_update_website_event_length/migration.sql deleted file mode 100644 index 06dd57a6..00000000 --- a/prisma/migrations/16_update_website_event_length/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ --- AlterTable -ALTER TABLE "website_event" ALTER COLUMN "url_path" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "url_query" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "referrer_path" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "referrer_query" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "fbclid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "gclid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "li_fat_id" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "msclkid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "ttclid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "twclid" SET DATA TYPE VARCHAR(1024), -ALTER COLUMN "utm_campaign" SET DATA TYPE VARCHAR(512), -ALTER COLUMN "utm_content" SET DATA TYPE VARCHAR(512), -ALTER COLUMN "utm_medium" SET DATA TYPE VARCHAR(512), -ALTER COLUMN "utm_source" SET DATA TYPE VARCHAR(512), -ALTER COLUMN "utm_term" SET DATA TYPE VARCHAR(512); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c0e87e7a..aeb11648 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -27,7 +27,6 @@ model User { pixels Pixel[] @relation("user") teams TeamUser[] reports Report[] - boards Board[] @relation("user") @@map("user") } @@ -100,23 +99,23 @@ model WebsiteEvent { sessionId String @map("session_id") @db.Uuid visitId String @map("visit_id") @db.Uuid createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - urlPath String @map("url_path") @db.VarChar(1024) - urlQuery String? @map("url_query") @db.VarChar(1024) - utmSource String? @map("utm_source") @db.VarChar(512) - utmMedium String? @map("utm_medium") @db.VarChar(512) - utmCampaign String? @map("utm_campaign") @db.VarChar(512) - utmContent String? @map("utm_content") @db.VarChar(512) - utmTerm String? @map("utm_term") @db.VarChar(512) - referrerPath String? @map("referrer_path") @db.VarChar(1024) - referrerQuery String? @map("referrer_query") @db.VarChar(1024) + urlPath String @map("url_path") @db.VarChar(500) + urlQuery String? @map("url_query") @db.VarChar(500) + utmSource String? @map("utm_source") @db.VarChar(255) + utmMedium String? @map("utm_medium") @db.VarChar(255) + utmCampaign String? @map("utm_campaign") @db.VarChar(255) + utmContent String? @map("utm_content") @db.VarChar(255) + utmTerm String? @map("utm_term") @db.VarChar(255) + referrerPath String? @map("referrer_path") @db.VarChar(500) + referrerQuery String? @map("referrer_query") @db.VarChar(500) referrerDomain String? @map("referrer_domain") @db.VarChar(500) pageTitle String? @map("page_title") @db.VarChar(500) - gclid String? @db.VarChar(1024) - fbclid String? @db.VarChar(1024) - msclkid String? @db.VarChar(1024) - ttclid String? @db.VarChar(1024) - lifatid String? @map("li_fat_id") @db.VarChar(1024) - twclid String? @db.VarChar(1024) + gclid String? @db.VarChar(255) + fbclid String? @db.VarChar(255) + msclkid String? @db.VarChar(255) + ttclid String? @db.VarChar(255) + lifatid String? @map("li_fat_id") @db.VarChar(255) + twclid String? @db.VarChar(255) eventType Int @default(1) @map("event_type") @db.Integer eventName String? @map("event_name") @db.VarChar(50) tag String? @db.VarChar(50) @@ -200,7 +199,6 @@ model Team { members TeamUser[] links Link[] pixels Pixel[] - boards Board[] @@index([accessCode]) @@map("team") @@ -318,25 +316,3 @@ model Pixel { @@index([createdAt]) @@map("pixel") } - -model Board { - id String @id() @unique() @map("board_id") @db.Uuid - type String @db.VarChar(50) - name String @db.VarChar(200) - description String @db.VarChar(500) - parameters Json - slug String @unique() @db.VarChar(100) - userId String? @map("user_id") @db.Uuid - teamId String? @map("team_id") @db.Uuid - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) - - user User? @relation("user", fields: [userId], references: [id]) - team Team? @relation(fields: [teamId], references: [id]) - - @@index([slug]) - @@index([userId]) - @@index([teamId]) - @@index([createdAt]) - @@map("board") -} \ No newline at end of file From dae7327ed36328aaac95dffc903cd56281e0d2bc Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 3 Dec 2025 14:47:56 -0800 Subject: [PATCH 40/45] Fix date range increment function Closes #3828 --- src/components/input/WebsiteDateFilter.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/input/WebsiteDateFilter.tsx b/src/components/input/WebsiteDateFilter.tsx index beb6f371..18b4f13b 100644 --- a/src/components/input/WebsiteDateFilter.tsx +++ b/src/components/input/WebsiteDateFilter.tsx @@ -1,6 +1,6 @@ import { Button, Icon, ListItem, Row, Select, Text } from '@umami/react-zen'; import { isAfter } from 'date-fns'; -import { useCallback, useMemo } from 'react'; +import { useMemo } from 'react'; import { useDateRange, useDateRangeQuery, useMessages, useNavigation } from '@/components/hooks'; import { ChevronRight } from '@/components/icons'; import { getDateRangeValue } from '@/lib/date'; @@ -45,13 +45,9 @@ export function WebsiteDateFilter({ } }; - const handleIncrement = useCallback( - (increment: number) => { - router.push(updateParams({ offset: +offset + increment })); - }, - [offset], - ); - + const handleIncrement = increment => { + router.push(updateParams({ offset: Number(offset) + increment })); + }; const handleSelect = (compare: any) => { router.push(updateParams({ compare })); }; From 64767b189691ddb0816395a4a0c4c633f829333c Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 15:11:40 -0800 Subject: [PATCH 41/45] Updated next. Fixed link RSC fetch. --- Dockerfile | 18 +- package.json | 24 +- pnpm-lock.yaml | 2220 ++++++++--------- src/app/(main)/links/[linkId]/LinkHeader.tsx | 11 +- .../(main)/pixels/[pixelId]/PixelHeader.tsx | 11 +- .../websites/[websiteId]/WebsiteHeader.tsx | 1 - src/components/common/LinkButton.tsx | 14 +- src/components/common/PageHeader.tsx | 4 +- 8 files changed, 1155 insertions(+), 1148 deletions(-) diff --git a/Dockerfile b/Dockerfile index 32300687..aa894ea5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ +ARG NODE_IMAGE_VERSION="22-alpine" + # Install dependencies only when needed -FROM node:22-alpine AS deps +FROM node:${NODE_IMAGE_VERSION} AS deps # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat WORKDIR /app @@ -8,7 +10,7 @@ RUN npm install -g pnpm RUN pnpm install --frozen-lockfile # Rebuild the source code only when needed -FROM node:22-alpine AS builder +FROM node:${NODE_IMAGE_VERSION} AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . @@ -25,9 +27,10 @@ ENV NEXT_TELEMETRY_DISABLED=1 RUN npm run build-docker # Production image, copy all the files and run next -FROM node:22-alpine AS runner +FROM node:${NODE_IMAGE_VERSION} AS runner WORKDIR /app +ARG PRISMA_VERSION="6.19.0" ARG NODE_OPTIONS ENV NODE_ENV=production @@ -36,13 +39,14 @@ ENV NODE_OPTIONS=$NODE_OPTIONS RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs -RUN npm install -g pnpm - RUN set -x \ - && apk add --no-cache curl + && apk add --no-cache curl \ + && npm install -g pnpm # Script dependencies -RUN pnpm --allow-build='@prisma/engines' add npm-run-all dotenv chalk semver prisma@6.18.0 @prisma/adapter-pg@6.18.0 +RUN pnpm --allow-build='@prisma/engines' add npm-run-all dotenv chalk semver \ + prisma@${PRISMA_VERSION} \ + @prisma/adapter-pg@${PRISMA_VERSION} COPY --from=builder --chown=nextjs:nodejs /app/public ./public COPY --from=builder /app/prisma ./prisma diff --git a/package.json b/package.json index dc701dfb..e20ae62d 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@prisma/extension-read-replicas": "^0.4.1", "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", - "@tanstack/react-query": "^5.90.5", + "@tanstack/react-query": "^5.90.11", "@umami/react-zen": "^0.211.0", "@umami/redis-client": "^0.29.0", "bcryptjs": "^3.0.2", @@ -92,7 +92,7 @@ "esbuild": "^0.25.11", "fs-extra": "^11.3.2", "immer": "^10.2.0", - "ipaddr.js": "^2.0.1", + "ipaddr.js": "^2.3.0", "is-ci": "^3.0.1", "is-docker": "^3.0.0", "is-localhost-ip": "^2.0.0", @@ -102,15 +102,15 @@ "kafkajs": "^2.1.0", "lucide-react": "^0.543.0", "maxmind": "^5.0.0", - "next": "15.5.3", + "next": "^15.5.7", "node-fetch": "^3.2.8", "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", "pg": "^8.16.3", "prisma": "^6.18.0", "pure-rand": "^7.0.1", - "react": "^19.2.0", - "react-dom": "^19.2.0", + "react": "^19.2.1", + "react-dom": "^19.2.1", "react-error-boundary": "^4.0.4", "react-intl": "^7.1.14", "react-simple-maps": "^2.3.0", @@ -122,13 +122,13 @@ "thenby": "^1.3.4", "ua-parser-js": "^2.0.6", "uuid": "^11.1.0", - "zod": "^4.1.12", - "zustand": "^5.0.8" + "zod": "^4.1.13", + "zustand": "^5.0.9" }, "devDependencies": { - "@biomejs/biome": "^2.3.6", + "@biomejs/biome": "^2.3.8", "@formatjs/cli": "^4.2.29", - "@netlify/plugin-nextjs": "^5.14.4", + "@netlify/plugin-nextjs": "^5.15.1", "@rollup/plugin-alias": "^5.0.0", "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.0", @@ -138,7 +138,7 @@ "@rollup/plugin-typescript": "^12.3.0", "@types/jest": "^30.0.0", "@types/node": "^24.9.2", - "@types/react": "^19.2.2", + "@types/react": "^19.2.7", "@types/react-dom": "^19.2.2", "@types/react-window": "^1.8.8", "babel-plugin-react-compiler": "19.1.0-rc.2", @@ -156,7 +156,7 @@ "rollup": "^4.52.5", "rollup-plugin-copy": "^3.4.0", "rollup-plugin-delete": "^3.0.1", - "rollup-plugin-dts": "^6.2.3", + "rollup-plugin-dts": "^6.3.0", "rollup-plugin-node-externals": "^8.1.1", "rollup-plugin-peer-deps-external": "^2.2.4", "rollup-plugin-postcss": "^4.0.2", @@ -165,7 +165,7 @@ "stylelint-config-prettier": "^9.0.3", "stylelint-config-recommended": "^14.0.0", "tar": "^6.1.2", - "ts-jest": "^29.4.5", + "ts-jest": "^29.4.6", "ts-node": "^10.9.1", "tsup": "^8.5.0", "tsx": "^4.19.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be25301f..10eed821 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 5.2.8 '@hello-pangea/dnd': specifier: ^17.0.0 - version: 17.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 17.0.0(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@prisma/adapter-pg': specifier: ^6.18.0 version: 6.19.0 @@ -37,16 +37,16 @@ importers: version: 0.4.1(@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3)) '@react-spring/web': specifier: ^10.0.3 - version: 10.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 10.0.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@svgr/cli': specifier: ^8.1.0 version: 8.1.0(typescript@5.9.3) '@tanstack/react-query': - specifier: ^5.90.5 - version: 5.90.10(react@19.2.0) + specifier: ^5.90.11 + version: 5.90.11(react@19.2.1) '@umami/react-zen': specifier: ^0.211.0 - version: 0.211.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + version: 0.211.0(@babel/core@7.28.3)(@types/react@19.2.7)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.1)) '@umami/redis-client': specifier: ^0.29.0 version: 0.29.0 @@ -102,8 +102,8 @@ importers: specifier: ^10.2.0 version: 10.2.0 ipaddr.js: - specifier: ^2.0.1 - version: 2.2.0 + specifier: ^2.3.0 + version: 2.3.0 is-ci: specifier: ^3.0.1 version: 3.0.1 @@ -127,13 +127,13 @@ importers: version: 2.2.4 lucide-react: specifier: ^0.543.0 - version: 0.543.0(react@19.2.0) + version: 0.543.0(react@19.2.1) maxmind: specifier: ^5.0.0 version: 5.0.1 next: - specifier: 15.5.3 - version: 15.5.3(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^15.5.7 + version: 15.5.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) node-fetch: specifier: ^3.2.8 version: 3.3.2 @@ -153,26 +153,26 @@ importers: specifier: ^7.0.1 version: 7.0.1 react: - specifier: ^19.2.0 - version: 19.2.0 + specifier: ^19.2.1 + version: 19.2.1 react-dom: - specifier: ^19.2.0 - version: 19.2.0(react@19.2.0) + specifier: ^19.2.1 + version: 19.2.1(react@19.2.1) react-error-boundary: specifier: ^4.0.4 - version: 4.1.2(react@19.2.0) + version: 4.1.2(react@19.2.1) react-intl: specifier: ^7.1.14 - version: 7.1.14(react@19.2.0)(typescript@5.9.3) + version: 7.1.14(react@19.2.1)(typescript@5.9.3) react-simple-maps: specifier: ^2.3.0 - version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react-use-measure: specifier: ^2.0.4 - version: 2.1.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 2.1.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react-window: specifier: ^1.8.6 - version: 1.8.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.8.11(react-dom@19.2.1(react@19.2.1))(react@19.2.1) request-ip: specifier: ^3.3.0 version: 3.3.0 @@ -192,21 +192,21 @@ importers: specifier: ^11.1.0 version: 11.1.0 zod: - specifier: ^4.1.12 - version: 4.1.12 + specifier: ^4.1.13 + version: 4.1.13 zustand: - specifier: ^5.0.8 - version: 5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + specifier: ^5.0.9 + version: 5.0.9(@types/react@19.2.7)(immer@10.2.0)(react@19.2.1)(use-sync-external-store@1.6.0(react@19.2.1)) devDependencies: '@biomejs/biome': - specifier: ^2.3.6 - version: 2.3.7 + specifier: ^2.3.8 + version: 2.3.8 '@formatjs/cli': specifier: ^4.2.29 - version: 4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + version: 4.8.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@netlify/plugin-nextjs': - specifier: ^5.14.4 - version: 5.14.7 + specifier: ^5.15.1 + version: 5.15.1 '@rollup/plugin-alias': specifier: ^5.0.0 version: 5.1.1(rollup@4.53.3) @@ -235,11 +235,11 @@ importers: specifier: ^24.9.2 version: 24.10.1 '@types/react': - specifier: ^19.2.2 - version: 19.2.6 + specifier: ^19.2.7 + version: 19.2.7 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.3(@types/react@19.2.6) + version: 19.2.3(@types/react@19.2.7) '@types/react-window': specifier: ^1.8.8 version: 1.8.8 @@ -254,7 +254,7 @@ importers: version: 13.17.0 extract-react-intl-messages: specifier: ^4.1.1 - version: 4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + version: 4.1.1(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -289,8 +289,8 @@ importers: specifier: ^3.0.1 version: 3.0.1(rollup@4.53.3) rollup-plugin-dts: - specifier: ^6.2.3 - version: 6.2.3(rollup@4.53.3)(typescript@5.9.3) + specifier: ^6.3.0 + version: 6.3.0(rollup@4.53.3)(typescript@5.9.3) rollup-plugin-node-externals: specifier: ^8.1.1 version: 8.1.2(rollup@4.53.3) @@ -316,8 +316,8 @@ importers: specifier: ^6.1.2 version: 6.2.1 ts-jest: - specifier: ^29.4.5 - version: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + specifier: ^29.4.6 + version: 29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) @@ -508,55 +508,55 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biomejs/biome@2.3.7': - resolution: {integrity: sha512-CTbAS/jNAiUc6rcq94BrTB8z83O9+BsgWj2sBCQg9rD6Wkh2gjfR87usjx0Ncx0zGXP1NKgT7JNglay5Zfs9jw==} + '@biomejs/biome@2.3.8': + resolution: {integrity: sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.3.7': - resolution: {integrity: sha512-LirkamEwzIUULhXcf2D5b+NatXKeqhOwilM+5eRkbrnr6daKz9rsBL0kNZ16Hcy4b8RFq22SG4tcLwM+yx/wFA==} + '@biomejs/cli-darwin-arm64@2.3.8': + resolution: {integrity: sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.3.7': - resolution: {integrity: sha512-Q4TO633kvrMQkKIV7wmf8HXwF0dhdTD9S458LGE24TYgBjSRbuhvio4D5eOQzirEYg6eqxfs53ga/rbdd8nBKg==} + '@biomejs/cli-darwin-x64@2.3.8': + resolution: {integrity: sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.7': - resolution: {integrity: sha512-/afy8lto4CB8scWfMdt+NoCZtatBUF62Tk3ilWH2w8ENd5spLhM77zKlFZEvsKJv9AFNHknMl03zO67CiklL2Q==} + '@biomejs/cli-linux-arm64-musl@2.3.8': + resolution: {integrity: sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.3.7': - resolution: {integrity: sha512-inHOTdlstUBzgjDcx0ge71U4SVTbwAljmkfi3MC5WzsYCRhancqfeL+sa4Ke6v2ND53WIwCFD5hGsYExoI3EZQ==} + '@biomejs/cli-linux-arm64@2.3.8': + resolution: {integrity: sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.3.7': - resolution: {integrity: sha512-CQUtgH1tIN6e5wiYSJqzSwJumHYolNtaj1dwZGCnZXm2PZU1jOJof9TsyiP3bXNDb+VOR7oo7ZvY01If0W3iFQ==} + '@biomejs/cli-linux-x64-musl@2.3.8': + resolution: {integrity: sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.3.7': - resolution: {integrity: sha512-fJMc3ZEuo/NaMYo5rvoWjdSS5/uVSW+HPRQujucpZqm2ZCq71b8MKJ9U4th9yrv2L5+5NjPF0nqqILCl8HY/fg==} + '@biomejs/cli-linux-x64@2.3.8': + resolution: {integrity: sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.3.7': - resolution: {integrity: sha512-aJAE8eCNyRpcfx2JJAtsPtISnELJ0H4xVVSwnxm13bzI8RwbXMyVtxy2r5DV1xT3WiSP+7LxORcApWw0LM8HiA==} + '@biomejs/cli-win32-arm64@2.3.8': + resolution: {integrity: sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.7': - resolution: {integrity: sha512-pulzUshqv9Ed//MiE8MOUeeEkbkSHVDVY5Cz5wVAnH1DUqliCQG3j6s1POaITTFqFfo7AVIx2sWdKpx/GS+Nqw==} + '@biomejs/cli-win32-x64@2.3.8': + resolution: {integrity: sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -1689,108 +1689,108 @@ packages: '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} - '@netlify/plugin-nextjs@5.14.7': - resolution: {integrity: sha512-RJRPGIlaY3M4KA6GxpOlynCPUKCVbtkHwg4ccHhoSVrHgysW3nqw1pX+FBvlBexrUl1JO2zuDFh4enRal9BpAw==} + '@netlify/plugin-nextjs@5.15.1': + resolution: {integrity: sha512-HXm94tteOuA0FYwhkxjYIPe0zta+Dsu0wz7LnhfqVlaYcRaOLjHtd2vgfmpz3np/fx9TQg3gCfqGkXt2a9i7Aw==} engines: {node: '>=18.0.0'} - '@next/env@15.5.3': - resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} + '@next/env@15.5.7': + resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} - '@next/env@16.0.6': - resolution: {integrity: sha512-PFTK/G/vM3UJwK5XDYMFOqt8QW42mmhSgdKDapOlCqBUAOfJN2dyOnASR/xUR/JRrro0pLohh/zOJ77xUQWQAg==} + '@next/env@16.0.7': + resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} - '@next/swc-darwin-arm64@15.5.3': - resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@16.0.6': - resolution: {integrity: sha512-AGzKiPlDiui+9JcPRHLI4V9WFTTcKukhJTfK9qu3e0tz+Y/88B7vo5yZoO7UaikplJEHORzG3QaBFQfkjhnL0Q==} + '@next/swc-darwin-arm64@16.0.7': + resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.3': - resolution: {integrity: sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==} + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@16.0.6': - resolution: {integrity: sha512-LlLLNrK9WCIUkq2GciWDcquXYIf7vLxX8XE49gz7EncssZGL1vlHwgmURiJsUZAvk0HM1a8qb1ABDezsjAE/jw==} + '@next/swc-darwin-x64@16.0.7': + resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.3': - resolution: {integrity: sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==} + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@16.0.6': - resolution: {integrity: sha512-r04NzmLSGGfG8EPXKVK72N5zDNnq9pa9el78LhdtqIC3zqKh74QfKHnk24DoK4PEs6eY7sIK/CnNpt30oc59kg==} + '@next/swc-linux-arm64-gnu@16.0.7': + resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.3': - resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.6': - resolution: {integrity: sha512-hfB/QV0hA7lbD1OJxp52wVDlpffUMfyxUB5ysZbb/pBC5iuhyLcEKSVQo56PFUUmUQzbMsAtUu6k2Gh9bBtWXA==} + '@next/swc-linux-arm64-musl@16.0.7': + resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.3': - resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.6': - resolution: {integrity: sha512-PZJushBgfvKhJBy01yXMdgL+l5XKr7uSn5jhOQXQXiH3iPT2M9iG64yHpPNGIKitKrHJInwmhPVGogZBAJOCPw==} + '@next/swc-linux-x64-gnu@16.0.7': + resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.3': - resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.6': - resolution: {integrity: sha512-LqY76IojrH9yS5fyATjLzlOIOgwyzBuNRqXwVxcGfZ58DWNQSyfnLGlfF6shAEqjwlDNLh4Z+P0rnOI87Y9jEw==} + '@next/swc-linux-x64-musl@16.0.7': + resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.3': - resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@16.0.6': - resolution: {integrity: sha512-eIfSNNqAkj0tqKRf0u7BVjqylJCuabSrxnpSENY3YKApqwDMeAqYPmnOwmVe6DDl3Lvkbe7cJAyP6i9hQ5PmmQ==} + '@next/swc-win32-arm64-msvc@16.0.7': + resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.3': - resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.6': - resolution: {integrity: sha512-QGs18P4OKdK9y2F3Th42+KGnwsc2iaThOe6jxQgP62kslUU4W+g6AzI6bdIn/pslhSfxjAMU5SjakfT5Fyo/xA==} + '@next/swc-win32-x64-msvc@16.0.7': + resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2817,11 +2817,11 @@ packages: '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@tanstack/query-core@5.90.10': - resolution: {integrity: sha512-EhZVFu9rl7GfRNuJLJ3Y7wtbTnENsvzp+YpcAV7kCYiXni1v8qZh++lpw4ch4rrwC0u/EZRnBHIehzCGzwXDSQ==} + '@tanstack/query-core@5.90.11': + resolution: {integrity: sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==} - '@tanstack/react-query@5.90.10': - resolution: {integrity: sha512-BKLss9Y8PQ9IUjPYQiv3/Zmlx92uxffUOX8ZZNoQlCIZBJPT5M+GOMQj7xislvVQ6l1BstBjcX0XB/aHfFYVNw==} + '@tanstack/react-query@5.90.11': + resolution: {integrity: sha512-3uyzz01D1fkTLXuxF3JfoJoHQMU2fxsfJwE+6N5hHy0dVNoZOvwKP8Z2k7k1KDeD54N20apcJnG75TBAStIrBA==} peerDependencies: react: ^18 || ^19 @@ -2919,8 +2919,8 @@ packages: '@types/react-window@1.8.8': resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==} - '@types/react@19.2.6': - resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -4420,8 +4420,8 @@ packages: intl-messageformat@10.7.18: resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + ipaddr.js@2.3.0: + resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} is-array-buffer@3.0.5: @@ -5071,8 +5071,8 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.18: - resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -5246,8 +5246,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.5.3: - resolution: {integrity: sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==} + next@15.5.7: + resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -5267,8 +5267,8 @@ packages: sass: optional: true - next@16.0.6: - resolution: {integrity: sha512-2zOZ/4FdaAp5hfCU/RnzARlZzBsjaTZ/XjNQmuyYLluAPM7kcrbIkdeO2SL0Ysd1vnrSgU+GwugfeWX1cUCgCg==} + next@16.0.7: + resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -6131,10 +6131,10 @@ packages: 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-dom@19.2.0: - resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + react-dom@19.2.1: + resolution: {integrity: sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==} peerDependencies: - react: ^19.2.0 + react: ^19.2.1 react-error-boundary@4.1.2: resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} @@ -6207,8 +6207,8 @@ packages: react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react@19.2.0: - resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + react@19.2.1: + resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==} engines: {node: '>=0.10.0'} read-babelrc-up@1.1.0: @@ -6335,8 +6335,8 @@ packages: peerDependencies: rollup: '*' - rollup-plugin-dts@6.2.3: - resolution: {integrity: sha512-UgnEsfciXSPpASuOelix7m4DrmyQgiaWBnvI0TM4GxuDh5FkqW8E5hu57bCxXB90VvR1WNfLV80yEDN18UogSA==} + rollup-plugin-dts@6.3.0: + resolution: {integrity: sha512-d0UrqxYd8KyZ6i3M2Nx7WOMy708qsV/7fTHMHxCMCBOAe3V/U7OMPu5GkX8hC+cmkHhzGnfeYongl1IgiooddA==} engines: {node: '>=16'} peerDependencies: rollup: ^3.29.4 || ^4 @@ -6845,8 +6845,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@29.4.5: - resolution: {integrity: sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==} + ts-jest@29.4.6: + resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7194,11 +7194,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.1.12: - resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} - zustand@5.0.8: - resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} + zustand@5.0.9: + resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -7413,39 +7413,39 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@2.3.7': + '@biomejs/biome@2.3.8': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.7 - '@biomejs/cli-darwin-x64': 2.3.7 - '@biomejs/cli-linux-arm64': 2.3.7 - '@biomejs/cli-linux-arm64-musl': 2.3.7 - '@biomejs/cli-linux-x64': 2.3.7 - '@biomejs/cli-linux-x64-musl': 2.3.7 - '@biomejs/cli-win32-arm64': 2.3.7 - '@biomejs/cli-win32-x64': 2.3.7 + '@biomejs/cli-darwin-arm64': 2.3.8 + '@biomejs/cli-darwin-x64': 2.3.8 + '@biomejs/cli-linux-arm64': 2.3.8 + '@biomejs/cli-linux-arm64-musl': 2.3.8 + '@biomejs/cli-linux-x64': 2.3.8 + '@biomejs/cli-linux-x64-musl': 2.3.8 + '@biomejs/cli-win32-arm64': 2.3.8 + '@biomejs/cli-win32-x64': 2.3.8 - '@biomejs/cli-darwin-arm64@2.3.7': + '@biomejs/cli-darwin-arm64@2.3.8': optional: true - '@biomejs/cli-darwin-x64@2.3.7': + '@biomejs/cli-darwin-x64@2.3.8': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.7': + '@biomejs/cli-linux-arm64-musl@2.3.8': optional: true - '@biomejs/cli-linux-arm64@2.3.7': + '@biomejs/cli-linux-arm64@2.3.8': optional: true - '@biomejs/cli-linux-x64-musl@2.3.7': + '@biomejs/cli-linux-x64-musl@2.3.8': optional: true - '@biomejs/cli-linux-x64@2.3.7': + '@biomejs/cli-linux-x64@2.3.8': optional: true - '@biomejs/cli-win32-arm64@2.3.7': + '@biomejs/cli-win32-arm64@2.3.8': optional: true - '@biomejs/cli-win32-x64@2.3.7': + '@biomejs/cli-win32-x64@2.3.8': optional: true '@clickhouse/client-common@1.14.0': {} @@ -7914,10 +7914,10 @@ snapshots: '@fontsource/jetbrains-mono@5.2.8': {} - '@formatjs/cli@4.8.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/cli@4.8.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: '@formatjs/icu-messageformat-parser': 2.1.0 - '@formatjs/ts-transformer': 3.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + '@formatjs/ts-transformer': 3.9.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@types/estree': 0.0.50 '@types/fs-extra': 9.0.13 '@types/json-stable-stringify': 1.2.0 @@ -8004,15 +8004,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@formatjs/ts-transformer@2.13.0(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/ts-transformer@2.13.0(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: intl-messageformat-parser: 6.1.2 tslib: 2.8.1 typescript: 4.9.5 optionalDependencies: - ts-jest: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) - '@formatjs/ts-transformer@3.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': + '@formatjs/ts-transformer@3.9.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3))': dependencies: '@formatjs/icu-messageformat-parser': 2.1.0 '@types/node': 14.18.63 @@ -8020,19 +8020,19 @@ snapshots: tslib: 2.8.1 typescript: 4.9.5 optionalDependencies: - ts-jest: 29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) - '@hello-pangea/dnd@17.0.0(@types/react@19.2.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@hello-pangea/dnd@17.0.0(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@babel/runtime': 7.28.3 css-box-model: 1.2.1 memoize-one: 6.0.0 raf-schd: 4.0.3 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-redux: 9.2.0(@types/react@19.2.6)(react@19.2.0)(redux@5.0.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-redux: 9.2.0(@types/react@19.2.7)(react@19.2.1)(redux@5.0.1) redux: 5.0.1 - use-memo-one: 1.1.3(react@19.2.0) + use-memo-one: 1.1.3(react@19.2.1) transitivePeerDependencies: - '@types/react' @@ -8476,58 +8476,58 @@ snapshots: '@kurkle/color@0.3.4': {} - '@netlify/plugin-nextjs@5.14.7': {} + '@netlify/plugin-nextjs@5.15.1': {} - '@next/env@15.5.3': {} + '@next/env@15.5.7': {} - '@next/env@16.0.6': {} + '@next/env@16.0.7': {} - '@next/swc-darwin-arm64@15.5.3': + '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-arm64@16.0.6': + '@next/swc-darwin-arm64@16.0.7': optional: true - '@next/swc-darwin-x64@15.5.3': + '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-darwin-x64@16.0.6': + '@next/swc-darwin-x64@16.0.7': optional: true - '@next/swc-linux-arm64-gnu@15.5.3': + '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@16.0.6': + '@next/swc-linux-arm64-gnu@16.0.7': optional: true - '@next/swc-linux-arm64-musl@15.5.3': + '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-arm64-musl@16.0.6': + '@next/swc-linux-arm64-musl@16.0.7': optional: true - '@next/swc-linux-x64-gnu@15.5.3': + '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-gnu@16.0.6': + '@next/swc-linux-x64-gnu@16.0.7': optional: true - '@next/swc-linux-x64-musl@15.5.3': + '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-linux-x64-musl@16.0.6': + '@next/swc-linux-x64-musl@16.0.7': optional: true - '@next/swc-win32-arm64-msvc@15.5.3': + '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@16.0.6': + '@next/swc-win32-arm64-msvc@16.0.7': optional: true - '@next/swc-win32-x64-msvc@15.5.3': + '@next/swc-win32-x64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@16.0.6': + '@next/swc-win32-x64-msvc@16.0.7': optional: true '@nodelib/fs.scandir@2.1.5': @@ -8596,1110 +8596,1110 @@ snapshots: dependencies: '@prisma/debug': 6.19.0 - '@react-aria/autocomplete@3.0.0-rc.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/autocomplete@3.0.0-rc.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/combobox': 3.14.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/listbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/searchfield': 3.8.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/autocomplete': 3.0.0-beta.3(react@19.2.0) - '@react-stately/combobox': 3.12.0(react@19.2.0) - '@react-types/autocomplete': 3.0.0-alpha.35(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/combobox': 3.14.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/listbox': 3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/searchfield': 3.8.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/autocomplete': 3.0.0-beta.3(react@19.2.1) + '@react-stately/combobox': 3.12.0(react@19.2.1) + '@react-types/autocomplete': 3.0.0-alpha.35(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/breadcrumbs@3.5.29(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/breadcrumbs@3.5.29(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/link': 3.8.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/breadcrumbs': 3.7.17(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/link': 3.8.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/breadcrumbs': 3.7.17(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/button@3.14.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/button@3.14.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/toolbar': 3.0.0-beta.21(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/toolbar': 3.0.0-beta.21(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/calendar@3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/calendar@3.9.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/calendar': 3.9.0(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/calendar': 3.8.0(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/calendar': 3.9.0(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/calendar': 3.8.0(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/checkbox@3.16.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/checkbox@3.16.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/toggle': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/checkbox': 3.7.2(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/toggle': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/checkbox': 3.7.2(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/collections@3.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/collections@3.0.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + use-sync-external-store: 1.6.0(react@19.2.1) - '@react-aria/color@3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/color@3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/numberfield': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/slider': 3.8.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/spinbutton': 3.6.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/color': 3.9.2(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-types/color': 3.1.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/numberfield': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/slider': 3.8.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/spinbutton': 3.6.19(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/color': 3.9.2(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-types/color': 3.1.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/combobox@3.14.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/combobox@3.14.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/listbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/listbox': 3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/menu': 3.19.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/combobox': 3.12.0(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/combobox': 3.13.9(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/menu': 3.19.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/combobox': 3.12.0(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/combobox': 3.13.9(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/datepicker@3.15.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/datepicker@3.15.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 '@internationalized/number': 3.6.5 '@internationalized/string': 3.2.7 - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/spinbutton': 3.6.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/datepicker': 3.15.2(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/calendar': 3.8.0(react@19.2.0) - '@react-types/datepicker': 3.13.2(react@19.2.0) - '@react-types/dialog': 3.5.22(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/spinbutton': 3.6.19(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/datepicker': 3.15.2(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/calendar': 3.8.0(react@19.2.1) + '@react-types/datepicker': 3.13.2(react@19.2.1) + '@react-types/dialog': 3.5.22(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/dialog@3.5.31(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/dialog@3.5.31(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/dialog': 3.5.22(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/dialog': 3.5.22(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/disclosure@3.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/disclosure@3.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/disclosure': 3.0.8(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/disclosure': 3.0.8(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/dnd@3.11.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/dnd@3.11.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/string': 3.2.7 - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/dnd': 3.7.1(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/dnd': 3.7.1(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/focus@3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/focus@3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/form@3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/form@3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/grid@3.14.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/grid@3.14.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/grid': 3.11.6(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/grid': 3.11.6(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/gridlist@3.14.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/gridlist@3.14.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/grid': 3.14.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-stately/tree': 3.9.3(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/grid': 3.14.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-stately/tree': 3.9.3(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/i18n@3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/i18n@3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 '@internationalized/message': 3.1.8 '@internationalized/number': 3.6.5 '@internationalized/string': 3.2.7 - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/interactions@3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/interactions@3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/label@3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/label@3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/landmark@3.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/landmark@3.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + use-sync-external-store: 1.6.0(react@19.2.1) - '@react-aria/link@3.8.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/link@3.8.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/link': 3.6.5(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/link': 3.6.5(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/listbox@3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/listbox@3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-types/listbox': 3.7.4(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-types/listbox': 3.7.4(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) '@react-aria/live-announcer@3.4.4': dependencies: '@swc/helpers': 0.5.17 - '@react-aria/menu@3.19.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/menu@3.19.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/menu': 3.9.8(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/tree': 3.9.3(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/menu': 3.10.5(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/menu': 3.9.8(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/tree': 3.9.3(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/menu': 3.10.5(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/meter@3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/meter@3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/progress': 3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/meter': 3.4.13(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/progress': 3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/meter': 3.4.13(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/numberfield@3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/numberfield@3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/spinbutton': 3.6.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/numberfield': 3.10.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/numberfield': 3.8.15(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/spinbutton': 3.6.19(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/numberfield': 3.10.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/numberfield': 3.8.15(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/overlays@3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/overlays@3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/progress@3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/progress@3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/progress': 3.5.16(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/progress': 3.5.16(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/radio@3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/radio@3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/radio': 3.11.2(react@19.2.0) - '@react-types/radio': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/radio': 3.11.2(react@19.2.1) + '@react-types/radio': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/searchfield@3.8.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/searchfield@3.8.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/searchfield': 3.5.16(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/searchfield': 3.6.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/searchfield': 3.5.16(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/searchfield': 3.6.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/select@3.17.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/select@3.17.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/listbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/menu': 3.19.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/select': 3.8.0(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/select': 3.11.0(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/listbox': 3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/menu': 3.19.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/select': 3.8.0(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/select': 3.11.0(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/selection@3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/selection@3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/separator@3.4.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/separator@3.4.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/slider@3.8.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/slider@3.8.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/slider': 3.7.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/slider': 3.8.2(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/slider': 3.7.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/slider': 3.8.2(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/spinbutton@3.6.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/spinbutton@3.6.19(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/ssr@3.9.10(react@19.2.0)': + '@react-aria/ssr@3.9.10(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-aria/switch@3.7.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/switch@3.7.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/toggle': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/switch': 3.5.15(react@19.2.0) + '@react-aria/toggle': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/switch': 3.5.15(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/table@3.17.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/table@3.17.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/grid': 3.14.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/grid': 3.14.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-stately/table': 3.15.1(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/table': 3.13.4(react@19.2.0) + '@react-stately/table': 3.15.1(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/table': 3.13.4(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/tabs@3.10.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/tabs@3.10.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/tabs': 3.8.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/tabs': 3.3.19(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/tabs': 3.8.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/tabs': 3.3.19(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/tag@3.7.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/tag@3.7.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/gridlist': 3.14.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/gridlist': 3.14.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/textfield@3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/textfield@3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/form': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/textfield': 3.12.6(react@19.2.0) + '@react-aria/form': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/textfield': 3.12.6(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/toast@3.0.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/toast@3.0.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/landmark': 3.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/toast': 3.1.2(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/landmark': 3.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/toast': 3.1.2(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/toggle@3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/toggle@3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/toolbar@3.0.0-beta.21(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/toolbar@3.0.0-beta.21(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/tooltip@3.8.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/tooltip@3.8.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/tooltip': 3.5.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/tooltip': 3.4.21(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/tooltip': 3.5.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/tooltip': 3.4.21(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/tree@3.1.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/tree@3.1.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/gridlist': 3.14.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/tree': 3.9.3(react@19.2.0) - '@react-types/button': 3.14.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/gridlist': 3.14.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/tree': 3.9.3(react@19.2.1) + '@react-types/button': 3.14.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/utils@3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/utils@3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.0) + '@react-aria/ssr': 3.9.10(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 clsx: 2.1.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/virtualizer@4.1.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/virtualizer@4.1.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/virtualizer': 4.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/virtualizer': 4.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-aria/visually-hidden@3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-aria/visually-hidden@3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-spring/animated@10.0.3(react@19.2.0)': + '@react-spring/animated@10.0.3(react@19.2.1)': dependencies: - '@react-spring/shared': 10.0.3(react@19.2.0) + '@react-spring/shared': 10.0.3(react@19.2.1) '@react-spring/types': 10.0.3 - react: 19.2.0 + react: 19.2.1 - '@react-spring/animated@9.7.5(react@19.2.0)': + '@react-spring/animated@9.7.5(react@19.2.1)': dependencies: - '@react-spring/shared': 9.7.5(react@19.2.0) + '@react-spring/shared': 9.7.5(react@19.2.1) '@react-spring/types': 9.7.5 - react: 19.2.0 + react: 19.2.1 - '@react-spring/core@10.0.3(react@19.2.0)': + '@react-spring/core@10.0.3(react@19.2.1)': dependencies: - '@react-spring/animated': 10.0.3(react@19.2.0) - '@react-spring/shared': 10.0.3(react@19.2.0) + '@react-spring/animated': 10.0.3(react@19.2.1) + '@react-spring/shared': 10.0.3(react@19.2.1) '@react-spring/types': 10.0.3 - react: 19.2.0 + react: 19.2.1 - '@react-spring/core@9.7.5(react@19.2.0)': + '@react-spring/core@9.7.5(react@19.2.1)': dependencies: - '@react-spring/animated': 9.7.5(react@19.2.0) - '@react-spring/shared': 9.7.5(react@19.2.0) + '@react-spring/animated': 9.7.5(react@19.2.1) + '@react-spring/shared': 9.7.5(react@19.2.1) '@react-spring/types': 9.7.5 - react: 19.2.0 + react: 19.2.1 '@react-spring/rafz@10.0.3': {} '@react-spring/rafz@9.7.5': {} - '@react-spring/shared@10.0.3(react@19.2.0)': + '@react-spring/shared@10.0.3(react@19.2.1)': dependencies: '@react-spring/rafz': 10.0.3 '@react-spring/types': 10.0.3 - react: 19.2.0 + react: 19.2.1 - '@react-spring/shared@9.7.5(react@19.2.0)': + '@react-spring/shared@9.7.5(react@19.2.1)': dependencies: '@react-spring/rafz': 9.7.5 '@react-spring/types': 9.7.5 - react: 19.2.0 + react: 19.2.1 '@react-spring/types@10.0.3': {} '@react-spring/types@9.7.5': {} - '@react-spring/web@10.0.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-spring/web@10.0.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-spring/animated': 10.0.3(react@19.2.0) - '@react-spring/core': 10.0.3(react@19.2.0) - '@react-spring/shared': 10.0.3(react@19.2.0) + '@react-spring/animated': 10.0.3(react@19.2.1) + '@react-spring/core': 10.0.3(react@19.2.1) + '@react-spring/shared': 10.0.3(react@19.2.1) '@react-spring/types': 10.0.3 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-spring/web@9.7.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-spring/web@9.7.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-spring/animated': 9.7.5(react@19.2.0) - '@react-spring/core': 9.7.5(react@19.2.0) - '@react-spring/shared': 9.7.5(react@19.2.0) + '@react-spring/animated': 9.7.5(react@19.2.1) + '@react-spring/core': 9.7.5(react@19.2.1) + '@react-spring/shared': 9.7.5(react@19.2.1) '@react-spring/types': 9.7.5 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-stately/autocomplete@3.0.0-beta.3(react@19.2.0)': + '@react-stately/autocomplete@3.0.0-beta.3(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/calendar@3.9.0(react@19.2.0)': + '@react-stately/calendar@3.9.0(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/calendar': 3.8.0(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/calendar': 3.8.0(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/checkbox@3.7.2(react@19.2.0)': + '@react-stately/checkbox@3.7.2(react@19.2.1)': dependencies: - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/collections@3.12.8(react@19.2.0)': + '@react-stately/collections@3.12.8(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/color@3.9.2(react@19.2.0)': + '@react-stately/color@3.9.2(react@19.2.1)': dependencies: '@internationalized/number': 3.6.5 '@internationalized/string': 3.2.7 - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/numberfield': 3.10.2(react@19.2.0) - '@react-stately/slider': 3.7.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/color': 3.1.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/numberfield': 3.10.2(react@19.2.1) + '@react-stately/slider': 3.7.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/color': 3.1.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/combobox@3.12.0(react@19.2.0)': + '@react-stately/combobox@3.12.0(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/combobox': 3.13.9(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/combobox': 3.13.9(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/data@3.14.1(react@19.2.0)': + '@react-stately/data@3.14.1(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/datepicker@3.15.2(react@19.2.0)': + '@react-stately/datepicker@3.15.2(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 '@internationalized/string': 3.2.7 - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/datepicker': 3.13.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/datepicker': 3.13.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/disclosure@3.0.8(react@19.2.0)': + '@react-stately/disclosure@3.0.8(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/dnd@3.7.1(react@19.2.0)': + '@react-stately/dnd@3.7.1(react@19.2.1)': dependencies: - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 '@react-stately/flags@3.1.2': dependencies: '@swc/helpers': 0.5.17 - '@react-stately/form@3.2.2(react@19.2.0)': + '@react-stately/form@3.2.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/grid@3.11.6(react@19.2.0)': + '@react-stately/grid@3.11.6(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/layout@4.5.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-stately/layout@4.5.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/table': 3.15.1(react@19.2.0) - '@react-stately/virtualizer': 4.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/table': 3.13.4(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/table': 3.15.1(react@19.2.1) + '@react-stately/virtualizer': 4.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/table': 3.13.4(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-stately/list@3.13.1(react@19.2.0)': + '@react-stately/list@3.13.1(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/menu@3.9.8(react@19.2.0)': + '@react-stately/menu@3.9.8(react@19.2.1)': dependencies: - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-types/menu': 3.10.5(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-types/menu': 3.10.5(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/numberfield@3.10.2(react@19.2.0)': + '@react-stately/numberfield@3.10.2(react@19.2.1)': dependencies: '@internationalized/number': 3.6.5 - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/numberfield': 3.8.15(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/numberfield': 3.8.15(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/overlays@3.6.20(react@19.2.0)': + '@react-stately/overlays@3.6.20(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/overlays': 3.9.2(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/overlays': 3.9.2(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/radio@3.11.2(react@19.2.0)': + '@react-stately/radio@3.11.2(react@19.2.1)': dependencies: - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/radio': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/radio': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/searchfield@3.5.16(react@19.2.0)': + '@react-stately/searchfield@3.5.16(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/searchfield': 3.6.6(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/searchfield': 3.6.6(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/select@3.8.0(react@19.2.0)': + '@react-stately/select@3.8.0(react@19.2.1)': dependencies: - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/select': 3.11.0(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/select': 3.11.0(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/selection@3.20.6(react@19.2.0)': + '@react-stately/selection@3.20.6(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/slider@3.7.2(react@19.2.0)': + '@react-stately/slider@3.7.2(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/slider': 3.8.2(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/slider': 3.8.2(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/table@3.15.1(react@19.2.0)': + '@react-stately/table@3.15.1(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) '@react-stately/flags': 3.1.2 - '@react-stately/grid': 3.11.6(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/table': 3.13.4(react@19.2.0) + '@react-stately/grid': 3.11.6(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/table': 3.13.4(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/tabs@3.8.6(react@19.2.0)': + '@react-stately/tabs@3.8.6(react@19.2.1)': dependencies: - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/tabs': 3.3.19(react@19.2.0) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/tabs': 3.3.19(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/toast@3.1.2(react@19.2.0)': + '@react-stately/toast@3.1.2(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + use-sync-external-store: 1.6.0(react@19.2.1) - '@react-stately/toggle@3.9.2(react@19.2.0)': + '@react-stately/toggle@3.9.2(react@19.2.1)': dependencies: - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/checkbox': 3.10.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/checkbox': 3.10.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/tooltip@3.5.8(react@19.2.0)': + '@react-stately/tooltip@3.5.8(react@19.2.1)': dependencies: - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-types/tooltip': 3.4.21(react@19.2.0) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-types/tooltip': 3.4.21(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/tree@3.9.3(react@19.2.0)': + '@react-stately/tree@3.9.3(react@19.2.1)': dependencies: - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/utils@3.10.8(react@19.2.0)': + '@react-stately/utils@3.10.8(react@19.2.1)': dependencies: '@swc/helpers': 0.5.17 - react: 19.2.0 + react: 19.2.1 - '@react-stately/virtualizer@4.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@react-stately/virtualizer@4.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) + '@react-types/shared': 3.32.1(react@19.2.1) '@swc/helpers': 0.5.17 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - '@react-types/autocomplete@3.0.0-alpha.35(react@19.2.0)': + '@react-types/autocomplete@3.0.0-alpha.35(react@19.2.1)': dependencies: - '@react-types/combobox': 3.13.9(react@19.2.0) - '@react-types/searchfield': 3.6.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/combobox': 3.13.9(react@19.2.1) + '@react-types/searchfield': 3.6.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/breadcrumbs@3.7.17(react@19.2.0)': + '@react-types/breadcrumbs@3.7.17(react@19.2.1)': dependencies: - '@react-types/link': 3.6.5(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/link': 3.6.5(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/button@3.14.1(react@19.2.0)': + '@react-types/button@3.14.1(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/calendar@3.8.0(react@19.2.0)': + '@react-types/calendar@3.8.0(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/checkbox@3.10.2(react@19.2.0)': + '@react-types/checkbox@3.10.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/color@3.1.2(react@19.2.0)': + '@react-types/color@3.1.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/slider': 3.8.2(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/slider': 3.8.2(react@19.2.1) + react: 19.2.1 - '@react-types/combobox@3.13.9(react@19.2.0)': + '@react-types/combobox@3.13.9(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/datepicker@3.13.2(react@19.2.0)': + '@react-types/datepicker@3.13.2(react@19.2.1)': dependencies: '@internationalized/date': 3.10.0 - '@react-types/calendar': 3.8.0(react@19.2.0) - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/calendar': 3.8.0(react@19.2.1) + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/dialog@3.5.22(react@19.2.0)': + '@react-types/dialog@3.5.22(react@19.2.1)': dependencies: - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/form@3.7.16(react@19.2.0)': + '@react-types/form@3.7.16(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/grid@3.3.6(react@19.2.0)': + '@react-types/grid@3.3.6(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/link@3.6.5(react@19.2.0)': + '@react-types/link@3.6.5(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/listbox@3.7.4(react@19.2.0)': + '@react-types/listbox@3.7.4(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/menu@3.10.5(react@19.2.0)': + '@react-types/menu@3.10.5(react@19.2.1)': dependencies: - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/meter@3.4.13(react@19.2.0)': + '@react-types/meter@3.4.13(react@19.2.1)': dependencies: - '@react-types/progress': 3.5.16(react@19.2.0) - react: 19.2.0 + '@react-types/progress': 3.5.16(react@19.2.1) + react: 19.2.1 - '@react-types/numberfield@3.8.15(react@19.2.0)': + '@react-types/numberfield@3.8.15(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/overlays@3.9.2(react@19.2.0)': + '@react-types/overlays@3.9.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/progress@3.5.16(react@19.2.0)': + '@react-types/progress@3.5.16(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/radio@3.9.2(react@19.2.0)': + '@react-types/radio@3.9.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/searchfield@3.6.6(react@19.2.0)': + '@react-types/searchfield@3.6.6(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/textfield': 3.12.6(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/textfield': 3.12.6(react@19.2.1) + react: 19.2.1 - '@react-types/select@3.11.0(react@19.2.0)': + '@react-types/select@3.11.0(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/shared@3.32.1(react@19.2.0)': + '@react-types/shared@3.32.1(react@19.2.1)': dependencies: - react: 19.2.0 + react: 19.2.1 - '@react-types/slider@3.8.2(react@19.2.0)': + '@react-types/slider@3.8.2(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/switch@3.5.15(react@19.2.0)': + '@react-types/switch@3.5.15(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/table@3.13.4(react@19.2.0)': + '@react-types/table@3.13.4(react@19.2.1)': dependencies: - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/tabs@3.3.19(react@19.2.0)': + '@react-types/tabs@3.3.19(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/textfield@3.12.6(react@19.2.0)': + '@react-types/textfield@3.12.6(react@19.2.1)': dependencies: - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - '@react-types/tooltip@3.4.21(react@19.2.0)': + '@react-types/tooltip@3.4.21(react@19.2.1)': dependencies: - '@react-types/overlays': 3.9.2(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-types/overlays': 3.9.2(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 '@redis/bloom@1.2.0(@redis/client@1.6.1)': dependencies: @@ -9981,12 +9981,12 @@ snapshots: dependencies: tslib: 2.8.1 - '@tanstack/query-core@5.90.10': {} + '@tanstack/query-core@5.90.11': {} - '@tanstack/react-query@5.90.10(react@19.2.0)': + '@tanstack/react-query@5.90.11(react@19.2.1)': dependencies: - '@tanstack/query-core': 5.90.10 - react: 19.2.0 + '@tanstack/query-core': 5.90.11 + react: 19.2.1 '@trysound/sax@0.2.0': {} @@ -10040,9 +10040,9 @@ snapshots: dependencies: '@types/node': 24.10.1 - '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.6)': + '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.7)': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 hoist-non-react-statics: 3.3.2 '@types/istanbul-lib-coverage@2.0.6': {} @@ -10080,15 +10080,15 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/react-dom@19.2.3(@types/react@19.2.6)': + '@types/react-dom@19.2.3(@types/react@19.2.7)': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 '@types/react-window@1.8.8': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 - '@types/react@19.2.6': + '@types/react@19.2.7': dependencies: csstype: 3.2.3 @@ -10117,24 +10117,24 @@ snapshots: '@types/node': 24.10.1 optional: true - '@umami/react-zen@0.211.0(@babel/core@7.28.3)(@types/react@19.2.6)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.0))': + '@umami/react-zen@0.211.0(@babel/core@7.28.3)(@types/react@19.2.7)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.2.0)(use-sync-external-store@1.6.0(react@19.2.1))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 '@internationalized/date': 3.10.0 - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-spring/web': 9.7.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-spring/web': 9.7.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1) classnames: 2.5.1 glob: 13.0.0 highlight.js: 11.11.1 - lucide-react: 0.555.0(react@19.2.0) - next: 16.0.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-aria-components: 1.13.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-dom: 19.2.0(react@19.2.0) - react-hook-form: 7.67.0(react@19.2.0) - react-icons: 5.5.0(react@19.2.0) + lucide-react: 0.555.0(react@19.2.1) + next: 16.0.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-aria-components: 1.13.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react-dom: 19.2.1(react@19.2.1) + react-hook-form: 7.67.0(react@19.2.1) + react-icons: 5.5.0(react@19.2.1) thenby: 1.3.4 - zustand: 5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + zustand: 5.0.9(@types/react@19.2.7)(immer@10.2.0)(react@19.2.1)(use-sync-external-store@1.6.0(react@19.2.1)) transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' @@ -10174,7 +10174,7 @@ snapshots: '@vue/compiler-ssr': 3.5.18 '@vue/shared': 3.5.18 estree-walker: 2.0.2 - magic-string: 0.30.18 + magic-string: 0.30.21 postcss: 8.5.6 source-map-js: 1.2.1 @@ -10368,12 +10368,12 @@ snapshots: dependencies: '@babel/types': 7.28.2 - babel-plugin-react-intl@7.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): + babel-plugin-react-intl@7.9.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/types': 7.28.2 - '@formatjs/ts-transformer': 2.13.0(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + '@formatjs/ts-transformer': 2.13.0(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) '@types/babel__core': 7.20.5 '@types/fs-extra': 9.0.13 '@types/schema-utils': 2.4.0 @@ -11388,10 +11388,10 @@ snapshots: extend@3.0.2: {} - extract-react-intl-messages@4.1.1(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): + extract-react-intl-messages@4.1.1(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)): dependencies: '@babel/core': 7.28.3 - babel-plugin-react-intl: 7.9.4(ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) + babel-plugin-react-intl: 7.9.4(ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3)) flat: 5.0.2 glob: 7.2.3 js-yaml: 3.14.1 @@ -11486,7 +11486,7 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: - magic-string: 0.30.18 + magic-string: 0.30.21 mlly: 1.8.0 rollup: 4.53.3 @@ -11867,7 +11867,7 @@ snapshots: '@formatjs/icu-messageformat-parser': 2.11.4 tslib: 2.8.1 - ipaddr.js@2.2.0: {} + ipaddr.js@2.3.0: {} is-array-buffer@3.0.5: dependencies: @@ -12696,19 +12696,19 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.543.0(react@19.2.0): + lucide-react@0.543.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - lucide-react@0.555.0(react@19.2.0): + lucide-react@0.555.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.18: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -12875,48 +12875,48 @@ snapshots: neo-async@2.6.2: {} - next@15.5.3(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@15.5.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 15.5.3 + '@next/env': 15.5.7 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001741 postcss: 8.4.31 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.3 - '@next/swc-darwin-x64': 15.5.3 - '@next/swc-linux-arm64-gnu': 15.5.3 - '@next/swc-linux-arm64-musl': 15.5.3 - '@next/swc-linux-x64-gnu': 15.5.3 - '@next/swc-linux-x64-musl': 15.5.3 - '@next/swc-win32-arm64-msvc': 15.5.3 - '@next/swc-win32-x64-msvc': 15.5.3 + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@16.0.6(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.7(@babel/core@7.28.3)(babel-plugin-react-compiler@19.1.0-rc.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - '@next/env': 16.0.6 + '@next/env': 16.0.7 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001759 postcss: 8.4.31 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.3)(react@19.2.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.6 - '@next/swc-darwin-x64': 16.0.6 - '@next/swc-linux-arm64-gnu': 16.0.6 - '@next/swc-linux-arm64-musl': 16.0.6 - '@next/swc-linux-x64-gnu': 16.0.6 - '@next/swc-linux-x64-musl': 16.0.6 - '@next/swc-win32-arm64-msvc': 16.0.6 - '@next/swc-win32-x64-msvc': 16.0.6 + '@next/swc-darwin-arm64': 16.0.7 + '@next/swc-darwin-x64': 16.0.7 + '@next/swc-linux-arm64-gnu': 16.0.7 + '@next/swc-linux-arm64-musl': 16.0.7 + '@next/swc-linux-x64-gnu': 16.0.7 + '@next/swc-linux-x64-musl': 16.0.7 + '@next/swc-win32-arm64-msvc': 16.0.7 + '@next/swc-win32-x64-msvc': 16.0.7 babel-plugin-react-compiler: 19.1.0-rc.2 sharp: 0.34.5 transitivePeerDependencies: @@ -13711,115 +13711,115 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - react-aria-components@1.13.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-aria-components@1.13.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@internationalized/date': 3.10.0 '@internationalized/string': 3.2.7 - '@react-aria/autocomplete': 3.0.0-rc.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/collections': 3.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/dnd': 3.11.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@react-aria/autocomplete': 3.0.0-rc.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/collections': 3.0.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/dnd': 3.11.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@react-aria/live-announcer': 3.4.4 - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/toolbar': 3.0.0-beta.21(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/virtualizer': 4.1.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/autocomplete': 3.0.0-beta.3(react@19.2.0) - '@react-stately/layout': 4.5.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/table': 3.15.1(react@19.2.0) - '@react-stately/utils': 3.10.8(react@19.2.0) - '@react-stately/virtualizer': 4.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/form': 3.7.16(react@19.2.0) - '@react-types/grid': 3.3.6(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - '@react-types/table': 3.13.4(react@19.2.0) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/toolbar': 3.0.0-beta.21(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/virtualizer': 4.1.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/autocomplete': 3.0.0-beta.3(react@19.2.1) + '@react-stately/layout': 4.5.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/table': 3.15.1(react@19.2.1) + '@react-stately/utils': 3.10.8(react@19.2.1) + '@react-stately/virtualizer': 4.4.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/form': 3.7.16(react@19.2.1) + '@react-types/grid': 3.3.6(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + '@react-types/table': 3.13.4(react@19.2.1) '@swc/helpers': 0.5.17 client-only: 0.0.1 - react: 19.2.0 - react-aria: 3.44.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-dom: 19.2.0(react@19.2.0) - react-stately: 3.42.0(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + react-aria: 3.44.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react-dom: 19.2.1(react@19.2.1) + react-stately: 3.42.0(react@19.2.1) + use-sync-external-store: 1.6.0(react@19.2.1) - react-aria@3.44.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-aria@3.44.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@internationalized/string': 3.2.7 - '@react-aria/breadcrumbs': 3.5.29(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/button': 3.14.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/calendar': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/checkbox': 3.16.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/color': 3.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/combobox': 3.14.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/datepicker': 3.15.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/dialog': 3.5.31(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/disclosure': 3.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/dnd': 3.11.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/focus': 3.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/gridlist': 3.14.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/i18n': 3.12.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/interactions': 3.25.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/label': 3.7.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/landmark': 3.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/link': 3.8.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/listbox': 3.15.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/menu': 3.19.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/meter': 3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/numberfield': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/overlays': 3.30.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/progress': 3.4.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/radio': 3.12.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/searchfield': 3.8.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/select': 3.17.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/selection': 3.26.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/separator': 3.4.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/slider': 3.8.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/ssr': 3.9.10(react@19.2.0) - '@react-aria/switch': 3.7.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/table': 3.17.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/tabs': 3.10.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/tag': 3.7.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/textfield': 3.18.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/toast': 3.0.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/tooltip': 3.8.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/tree': 3.1.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/utils': 3.31.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@react-aria/breadcrumbs': 3.5.29(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/button': 3.14.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/calendar': 3.9.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/checkbox': 3.16.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/color': 3.1.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/combobox': 3.14.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/datepicker': 3.15.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/dialog': 3.5.31(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/disclosure': 3.1.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/dnd': 3.11.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/focus': 3.21.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/gridlist': 3.14.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/i18n': 3.12.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/interactions': 3.25.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/label': 3.7.22(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/landmark': 3.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/link': 3.8.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/listbox': 3.15.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/menu': 3.19.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/meter': 3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/numberfield': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/overlays': 3.30.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/progress': 3.4.27(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/radio': 3.12.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/searchfield': 3.8.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/select': 3.17.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/selection': 3.26.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/separator': 3.4.13(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/slider': 3.8.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/ssr': 3.9.10(react@19.2.1) + '@react-aria/switch': 3.7.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/table': 3.17.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/tabs': 3.10.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/tag': 3.7.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/textfield': 3.18.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/toast': 3.0.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/tooltip': 3.8.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/tree': 3.1.4(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/utils': 3.31.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-aria/visually-hidden': 3.8.28(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - react-dom@19.2.0(react@19.2.0): + react-dom@19.2.1(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 scheduler: 0.27.0 - react-error-boundary@4.1.2(react@19.2.0): + react-error-boundary@4.1.2(react@19.2.1): dependencies: '@babel/runtime': 7.28.3 - react: 19.2.0 + react: 19.2.1 - react-hook-form@7.67.0(react@19.2.0): + react-hook-form@7.67.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - react-icons@5.5.0(react@19.2.0): + react-icons@5.5.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - react-intl@7.1.14(react@19.2.0)(typescript@5.9.3): + react-intl@7.1.14(react@19.2.1)(typescript@5.9.3): dependencies: '@formatjs/ecma402-abstract': 2.3.6 '@formatjs/icu-messageformat-parser': 2.11.4 '@formatjs/intl': 3.1.8(typescript@5.9.3) - '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.6) - '@types/react': 19.2.6 + '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.7) + '@types/react': 19.2.7 hoist-non-react-statics: 3.3.2 intl-messageformat: 10.7.18 - react: 19.2.0 + react: 19.2.1 tslib: 2.8.1 optionalDependencies: typescript: 5.9.3 @@ -13828,69 +13828,69 @@ snapshots: react-is@18.3.1: {} - react-redux@9.2.0(@types/react@19.2.6)(react@19.2.0)(redux@5.0.1): + react-redux@9.2.0(@types/react@19.2.7)(react@19.2.1)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 - react: 19.2.0 - use-sync-external-store: 1.5.0(react@19.2.0) + react: 19.2.1 + use-sync-external-store: 1.5.0(react@19.2.1) optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 redux: 5.0.1 - react-simple-maps@2.3.0(prop-types@15.8.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-simple-maps@2.3.0(prop-types@15.8.1)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: d3-geo: 2.0.2 d3-selection: 2.0.0 d3-zoom: 2.0.0 prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) topojson-client: 3.1.0 - react-stately@3.42.0(react@19.2.0): + react-stately@3.42.0(react@19.2.1): dependencies: - '@react-stately/calendar': 3.9.0(react@19.2.0) - '@react-stately/checkbox': 3.7.2(react@19.2.0) - '@react-stately/collections': 3.12.8(react@19.2.0) - '@react-stately/color': 3.9.2(react@19.2.0) - '@react-stately/combobox': 3.12.0(react@19.2.0) - '@react-stately/data': 3.14.1(react@19.2.0) - '@react-stately/datepicker': 3.15.2(react@19.2.0) - '@react-stately/disclosure': 3.0.8(react@19.2.0) - '@react-stately/dnd': 3.7.1(react@19.2.0) - '@react-stately/form': 3.2.2(react@19.2.0) - '@react-stately/list': 3.13.1(react@19.2.0) - '@react-stately/menu': 3.9.8(react@19.2.0) - '@react-stately/numberfield': 3.10.2(react@19.2.0) - '@react-stately/overlays': 3.6.20(react@19.2.0) - '@react-stately/radio': 3.11.2(react@19.2.0) - '@react-stately/searchfield': 3.5.16(react@19.2.0) - '@react-stately/select': 3.8.0(react@19.2.0) - '@react-stately/selection': 3.20.6(react@19.2.0) - '@react-stately/slider': 3.7.2(react@19.2.0) - '@react-stately/table': 3.15.1(react@19.2.0) - '@react-stately/tabs': 3.8.6(react@19.2.0) - '@react-stately/toast': 3.1.2(react@19.2.0) - '@react-stately/toggle': 3.9.2(react@19.2.0) - '@react-stately/tooltip': 3.5.8(react@19.2.0) - '@react-stately/tree': 3.9.3(react@19.2.0) - '@react-types/shared': 3.32.1(react@19.2.0) - react: 19.2.0 + '@react-stately/calendar': 3.9.0(react@19.2.1) + '@react-stately/checkbox': 3.7.2(react@19.2.1) + '@react-stately/collections': 3.12.8(react@19.2.1) + '@react-stately/color': 3.9.2(react@19.2.1) + '@react-stately/combobox': 3.12.0(react@19.2.1) + '@react-stately/data': 3.14.1(react@19.2.1) + '@react-stately/datepicker': 3.15.2(react@19.2.1) + '@react-stately/disclosure': 3.0.8(react@19.2.1) + '@react-stately/dnd': 3.7.1(react@19.2.1) + '@react-stately/form': 3.2.2(react@19.2.1) + '@react-stately/list': 3.13.1(react@19.2.1) + '@react-stately/menu': 3.9.8(react@19.2.1) + '@react-stately/numberfield': 3.10.2(react@19.2.1) + '@react-stately/overlays': 3.6.20(react@19.2.1) + '@react-stately/radio': 3.11.2(react@19.2.1) + '@react-stately/searchfield': 3.5.16(react@19.2.1) + '@react-stately/select': 3.8.0(react@19.2.1) + '@react-stately/selection': 3.20.6(react@19.2.1) + '@react-stately/slider': 3.7.2(react@19.2.1) + '@react-stately/table': 3.15.1(react@19.2.1) + '@react-stately/tabs': 3.8.6(react@19.2.1) + '@react-stately/toast': 3.1.2(react@19.2.1) + '@react-stately/toggle': 3.9.2(react@19.2.1) + '@react-stately/tooltip': 3.5.8(react@19.2.1) + '@react-stately/tree': 3.9.3(react@19.2.1) + '@react-types/shared': 3.32.1(react@19.2.1) + react: 19.2.1 - react-use-measure@2.1.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-use-measure@2.1.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 optionalDependencies: - react-dom: 19.2.0(react@19.2.0) + react-dom: 19.2.1(react@19.2.1) - react-window@1.8.11(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-window@1.8.11(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@babel/runtime': 7.28.3 memoize-one: 5.2.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) - react@19.2.0: {} + react@19.2.1: {} read-babelrc-up@1.1.0: dependencies: @@ -14045,9 +14045,9 @@ snapshots: del: 8.0.0 rollup: 4.53.3 - rollup-plugin-dts@6.2.3(rollup@4.53.3)(typescript@5.9.3): + rollup-plugin-dts@6.3.0(rollup@4.53.3)(typescript@5.9.3): dependencies: - magic-string: 0.30.18 + magic-string: 0.30.21 rollup: 4.53.3 typescript: 5.9.3 optionalDependencies: @@ -14491,10 +14491,10 @@ snapshots: style-search@0.1.0: {} - styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.2.0): + styled-jsx@5.1.6(@babel/core@7.28.3)(react@19.2.1): dependencies: client-only: 0.0.1 - react: 19.2.0 + react: 19.2.1 optionalDependencies: '@babel/core': 7.28.3 @@ -14717,7 +14717,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.5(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.6(@babel/core@7.28.3)(@jest/transform@29.7.0)(@jest/types@30.0.5)(babel-jest@29.7.0(@babel/core@7.28.3))(esbuild@0.25.12)(jest-util@30.0.5)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -14894,17 +14894,17 @@ snapshots: dependencies: punycode: 2.3.1 - use-memo-one@1.1.3(react@19.2.0): + use-memo-one@1.1.3(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - use-sync-external-store@1.5.0(react@19.2.0): + use-sync-external-store@1.5.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 - use-sync-external-store@1.6.0(react@19.2.0): + use-sync-external-store@1.6.0(react@19.2.1): dependencies: - react: 19.2.0 + react: 19.2.1 util-deprecate@1.0.2: {} @@ -15092,11 +15092,11 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.1.12: {} + zod@4.1.13: {} - zustand@5.0.8(@types/react@19.2.6)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): + zustand@5.0.9(@types/react@19.2.7)(immer@10.2.0)(react@19.2.1)(use-sync-external-store@1.6.0(react@19.2.1)): optionalDependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 immer: 10.2.0 - react: 19.2.0 - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.2.1 + use-sync-external-store: 1.6.0(react@19.2.1) diff --git a/src/app/(main)/links/[linkId]/LinkHeader.tsx b/src/app/(main)/links/[linkId]/LinkHeader.tsx index 33f0c242..a84a6260 100644 --- a/src/app/(main)/links/[linkId]/LinkHeader.tsx +++ b/src/app/(main)/links/[linkId]/LinkHeader.tsx @@ -1,4 +1,4 @@ -import { Icon, Text } from '@umami/react-zen'; +import { IconLabel } from '@umami/react-zen'; import { LinkButton } from '@/components/common/LinkButton'; import { PageHeader } from '@/components/common/PageHeader'; import { useLink, useMessages, useSlug } from '@/components/hooks'; @@ -10,12 +10,9 @@ export function LinkHeader() { const link = useLink(); return ( - } marginBottom="3"> - - - - - {formatMessage(labels.view)} + }> + + } label={formatMessage(labels.view)} /> ); diff --git a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx index 8171aaf1..c771687f 100644 --- a/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx +++ b/src/app/(main)/pixels/[pixelId]/PixelHeader.tsx @@ -1,4 +1,4 @@ -import { Icon, Text } from '@umami/react-zen'; +import { IconLabel } from '@umami/react-zen'; import { LinkButton } from '@/components/common/LinkButton'; import { PageHeader } from '@/components/common/PageHeader'; import { useMessages, usePixel, useSlug } from '@/components/hooks'; @@ -10,12 +10,9 @@ export function PixelHeader() { const pixel = usePixel(); return ( - } marginBottom="3"> - - - - - {formatMessage(labels.view)} + }> + + } label={formatMessage(labels.view)} /> ); diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index e7a92516..7dd1d771 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -23,7 +23,6 @@ export function WebsiteHeader({ showActions }: { showActions?: boolean }) { } - marginBottom="3" titleHref={renderUrl(`/websites/${website.id}`, false)} > diff --git a/src/components/common/LinkButton.tsx b/src/components/common/LinkButton.tsx index 682970e8..35292ba4 100644 --- a/src/components/common/LinkButton.tsx +++ b/src/components/common/LinkButton.tsx @@ -9,6 +9,7 @@ export interface LinkButtonProps extends ButtonProps { scroll?: boolean; variant?: any; prefetch?: boolean; + asAnchor?: boolean; children?: ReactNode; } @@ -19,15 +20,22 @@ export function LinkButton({ target, prefetch, children, + asAnchor, ...props }: LinkButtonProps) { const { dir } = useLocale(); return ( ); } diff --git a/src/components/common/PageHeader.tsx b/src/components/common/PageHeader.tsx index 6d8c122a..92167888 100644 --- a/src/components/common/PageHeader.tsx +++ b/src/components/common/PageHeader.tsx @@ -50,7 +50,9 @@ export function PageHeader({ )} - {children} + + {children} + ); } From c427c6f54762ffb5a4fe92e495abf371ca254498 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 17:05:14 -0800 Subject: [PATCH 42/45] Fixed replica logic. --- src/lib/prisma.ts | 60 ++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 94970584..06336d3b 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -206,6 +206,10 @@ async function rawQuery(sql: string, data: Record, name?: string): return `$${params.length}${type ?? ''}`; }); + if (process.env.DATABASE_REPLICA_URL && '$replica' in client) { + return client.$replica().$queryRawUnsafe(query, ...params); + } + return client.$queryRawUnsafe(query, ...params); } @@ -296,10 +300,6 @@ function getSchema() { } function getClient() { - if (!process.env.DATABASE_URL) { - return null; - } - const url = process.env.DATABASE_URL; const replicaUrl = process.env.DATABASE_REPLICA_URL; const logQuery = process.env.LOG_QUERY; @@ -307,43 +307,49 @@ function getClient() { const connectionUrl = new URL(url); const schema = connectionUrl.searchParams.get('schema') ?? undefined; - const adapter = new PrismaPg({ connectionString: url.toString() }, { schema }); + const baseAdapter = new PrismaPg({ connectionString: url }, { schema }); - const prisma = new PrismaClient({ - adapter, + const baseClient = new PrismaClient({ + adapter: baseAdapter, errorFormat: 'pretty', ...(logQuery ? PRISMA_LOG_OPTIONS : {}), }); - if (replicaUrl) { - const replicaAdapter = new PrismaPg({ connectionString: replicaUrl.toString() }, { schema }); - - const replicaClient = new PrismaClient({ - adapter: replicaAdapter, - ...(logQuery ? PRISMA_LOG_OPTIONS : {}), - }); - - prisma.$extends( - readReplicas({ - replicas: [replicaClient], - }), - ); + if (logQuery) { + baseClient.$on('query', log); } + if (!replicaUrl) { + log('Prisma initialized'); + globalThis[PRISMA] ??= baseClient; + return baseClient; + } + + const replicaAdapter = new PrismaPg({ connectionString: replicaUrl }, { schema }); + + const replicaClient = new PrismaClient({ + adapter: replicaAdapter, + errorFormat: 'pretty', + ...(logQuery ? PRISMA_LOG_OPTIONS : {}), + }); + if (logQuery) { - prisma.$on('query' as never, log); + replicaClient.$on('query', log); } - log('Prisma initialized'); + const extended = baseClient.$extends( + readReplicas({ + replicas: [replicaClient], + }), + ); - if (!globalThis[PRISMA]) { - globalThis[PRISMA] = prisma; - } + log('Prisma initialized (with replica)'); + globalThis[PRISMA] ??= extended; - return prisma; + return extended; } -const client: PrismaClient = globalThis[PRISMA] || getClient(); +const client = (globalThis[PRISMA] || getClient()) as ReturnType; export default { client, From 2993db14f09754a41aaec953bf7a93cd7ac3cb52 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 19:37:51 -0800 Subject: [PATCH 43/45] Updated README. --- README.md | 29 ++++++++++++++--------------- pnpm-lock.yaml | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index dcc6865f..95bb4330 100644 --- a/README.md +++ b/README.md @@ -27,10 +27,10 @@ A detailed getting started guide can be found at [umami.is/docs](https://umami.i ### Requirements -- A server with Node.js version 18.18 or newer -- A database. Umami supports [PostgreSQL](https://www.postgresql.org/) (minimum v12.14) databases. +- A server with Node.js version 18.18+. +- A PostgreSQL database version v12.14+. -### Get the Source Code and Install Packages +### Get the source code and install packages ```bash git clone https://github.com/umami-software/umami.git @@ -58,7 +58,7 @@ postgresql://username:mypassword@localhost:5432/mydb pnpm run build ``` -_The build step will create tables in your database if you are installing for the first time. It will also create a login user with username **admin** and password **umami**._ +The build step will create tables in your database if you are installing for the first time. It will also create a login user with username **admin** and password **umami**. ### Start the Application @@ -66,37 +66,36 @@ _The build step will create tables in your database if you are installing for th pnpm run start ``` -_By default, this will launch the application on `http://localhost:3000`. You will need to either [proxy](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) requests from your web server or change the [port](https://nextjs.org/docs/api-reference/cli#production) to serve the application directly._ +By default, this will launch the application on `http://localhost:3000`. You will need to either [proxy](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) requests from your web server or change the [port](https://nextjs.org/docs/api-reference/cli#production) to serve the application directly. --- ## 🐳 Installing with Docker -To build the Umami container and start up a Postgres database, run: +Umami provides Docker images as well as a Docker compose file for easy deployment. -```bash -docker compose up -d -``` - -Alternatively, to pull just the Umami Docker image with PostgreSQL support: +Docker image: ```bash docker pull docker.umami.is/umami-software/umami:latest ``` +Docker compose to run Umami with a Postgres database, run: + +```bash +docker compose up -d +``` + --- ## 🔄 Getting Updates -> [!WARNING] -> If you are updating from Umami V2, image "postgresql-latest" is deprecated. You must change it to "latest". -> e.g., rename `docker.umami.is/umami-software/umami:postgresql-latest` to `docker.umami.is/umami-software/umami:latest`. To get the latest features, simply do a pull, install any new dependencies, and rebuild: ```bash git pull pnpm install -pnpm run build +pnpm build ``` To update the Docker image, simply pull the new images and rebuild: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10eed821..ef3eb1fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -331,7 +331,44 @@ importers: specifier: ^5.9.3 version: 5.9.3 - dist: {} + dist: + dependencies: + chart.js: + specifier: ^4.5.0 + version: 4.5.1 + chartjs-adapter-date-fns: + specifier: ^3.0.0 + version: 3.0.0(chart.js@4.5.1)(date-fns@2.30.0) + colord: + specifier: ^2.9.2 + version: 2.9.3 + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + lucide-react: + specifier: ^0.542.0 + version: 0.542.0(react@19.2.1) + pure-rand: + specifier: ^7.0.1 + version: 7.0.1 + react-simple-maps: + specifier: ^2.3.0 + version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react-use-measure: + specifier: ^2.0.4 + version: 2.1.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react-window: + specifier: ^1.8.6 + version: 1.8.11(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + serialize-error: + specifier: ^12.0.0 + version: 12.0.0 + thenby: + specifier: ^1.3.4 + version: 1.3.4 + uuid: + specifier: ^11.1.0 + version: 11.1.0 packages: @@ -5058,6 +5095,11 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lucide-react@0.542.0: + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lucide-react@0.543.0: resolution: {integrity: sha512-fpVfuOQO0V3HBaOA1stIiP/A2fPCXHIleRZL16Mx3HmjTYwNSbimhnFBygs2CAfU1geexMX5ItUcWBGUaqw5CA==} peerDependencies: @@ -12696,6 +12738,10 @@ snapshots: dependencies: yallist: 4.0.0 + lucide-react@0.542.0(react@19.2.1): + dependencies: + react: 19.2.1 + lucide-react@0.543.0(react@19.2.1): dependencies: react: 19.2.1 From 33e927ed1fe04a9b2c8253b5f57f0b64f6bdcb48 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 23:01:22 -0800 Subject: [PATCH 44/45] Bump version 3.0.2. --- biome.json | 8 ++++++++ package.json | 2 +- pnpm-lock.yaml | 48 +---------------------------------------------- src/lib/prisma.ts | 4 +--- 4 files changed, 11 insertions(+), 51 deletions(-) diff --git a/biome.json b/biome.json index 0dec793b..61d094ca 100644 --- a/biome.json +++ b/biome.json @@ -46,6 +46,14 @@ "arrowParentheses": "asNeeded" } }, + "css": { + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf" + } + }, "assist": { "enabled": true, "actions": { diff --git a/package.json b/package.json index e20ae62d..09a69135 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "umami", - "version": "3.0.1", + "version": "3.0.2", "description": "A modern, privacy-focused alternative to Google Analytics.", "author": "Umami Software, Inc. ", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef3eb1fa..10eed821 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -331,44 +331,7 @@ importers: specifier: ^5.9.3 version: 5.9.3 - dist: - dependencies: - chart.js: - specifier: ^4.5.0 - version: 4.5.1 - chartjs-adapter-date-fns: - specifier: ^3.0.0 - version: 3.0.0(chart.js@4.5.1)(date-fns@2.30.0) - colord: - specifier: ^2.9.2 - version: 2.9.3 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - lucide-react: - specifier: ^0.542.0 - version: 0.542.0(react@19.2.1) - pure-rand: - specifier: ^7.0.1 - version: 7.0.1 - react-simple-maps: - specifier: ^2.3.0 - version: 2.3.0(prop-types@15.8.1)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - react-use-measure: - specifier: ^2.0.4 - version: 2.1.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - react-window: - specifier: ^1.8.6 - version: 1.8.11(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - serialize-error: - specifier: ^12.0.0 - version: 12.0.0 - thenby: - specifier: ^1.3.4 - version: 1.3.4 - uuid: - specifier: ^11.1.0 - version: 11.1.0 + dist: {} packages: @@ -5095,11 +5058,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lucide-react@0.542.0: - resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lucide-react@0.543.0: resolution: {integrity: sha512-fpVfuOQO0V3HBaOA1stIiP/A2fPCXHIleRZL16Mx3HmjTYwNSbimhnFBygs2CAfU1geexMX5ItUcWBGUaqw5CA==} peerDependencies: @@ -12738,10 +12696,6 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.542.0(react@19.2.1): - dependencies: - react: 19.2.1 - lucide-react@0.543.0(react@19.2.1): dependencies: react: 19.2.1 diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 06336d3b..64cb870f 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -303,9 +303,7 @@ function getClient() { const url = process.env.DATABASE_URL; const replicaUrl = process.env.DATABASE_REPLICA_URL; const logQuery = process.env.LOG_QUERY; - - const connectionUrl = new URL(url); - const schema = connectionUrl.searchParams.get('schema') ?? undefined; + const schema = getSchema(); const baseAdapter = new PrismaPg({ connectionString: url }, { schema }); From 60271779dea1f9886bdadf5444fc23f86897fa23 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 3 Dec 2025 23:53:22 -0800 Subject: [PATCH 45/45] Fixed Docker build. --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index aa894ea5..1282fd86 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,13 +16,11 @@ COPY --from=deps /app/node_modules ./node_modules COPY . . COPY docker/middleware.ts ./src -ARG DATABASE_TYPE ARG BASE_PATH -ENV DATABASE_TYPE=$DATABASE_TYPE ENV BASE_PATH=$BASE_PATH - ENV NEXT_TELEMETRY_DISABLED=1 +ENV DATABASE_URL="postgresql://user:pass@localhost:5432/dummy" RUN npm run build-docker