From 4ae69e99764848df78e9c22a1fd0e24446468038 Mon Sep 17 00:00:00 2001 From: Harsh Shrikant Bhat <90265455+harshsbhat@users.noreply.github.com> Date: Wed, 18 Sep 2024 20:55:25 +0530 Subject: [PATCH 1/7] feat: Show keyId after creating a new key (#2107) * Show keyId after creating a new key * lint * Requested changes * Removed unused component --- .../apis/[apiId]/keys/[keyAuthId]/new/client.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx index 6e4af59ef..99a264dcd 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx @@ -249,7 +249,13 @@ export const CreateKey: React.FC = ({ apiId, keyAuthId }) => { {key.data ? (
-

Your API Key

+
+

Your API Key

+ +
{key.data.keyId}
+ +
+
This key is only shown once and can not be recovered @@ -257,8 +263,7 @@ export const CreateKey: React.FC = ({ apiId, keyAuthId }) => { Please pass it on to your user or store it somewhere safe. - - +
{showKey ? key.data.key : maskedKey}
From 3cebea85117a735e76c7e76529b85a84fc54cc28 Mon Sep 17 00:00:00 2001 From: chronark Date: Wed, 18 Sep 2024 18:11:03 +0200 Subject: [PATCH 2/7] fix: default ratelimits --- apps/api/src/pkg/cache/index.ts | 2 +- apps/api/src/pkg/cache/namespaces.ts | 2 +- apps/api/src/pkg/keys/service.ts | 33 +- pnpm-lock.yaml | 1626 +++++++++++++------------- 4 files changed, 864 insertions(+), 799 deletions(-) diff --git a/apps/api/src/pkg/cache/index.ts b/apps/api/src/pkg/cache/index.ts index cc000ba56..b78d75905 100644 --- a/apps/api/src/pkg/cache/index.ts +++ b/apps/api/src/pkg/cache/index.ts @@ -35,7 +35,7 @@ export function initCache(c: Context, metrics: Metrics): C }; identity: CachedIdentity | null; } | null; apiById: (Api & { keyAuth: KeyAuth | null }) | null; diff --git a/apps/api/src/pkg/keys/service.ts b/apps/api/src/pkg/keys/service.ts index 2065a95e6..407c34965 100644 --- a/apps/api/src/pkg/keys/service.ts +++ b/apps/api/src/pkg/keys/service.ts @@ -284,7 +284,19 @@ export class KeyService { * Merge ratelimits from the identity and the key * Key limits take pecedence */ - const ratelimits: { [name: string]: Ratelimit } = {}; + const ratelimits: { [name: string]: Pick } = {}; + + if ( + dbRes.ratelimitAsync !== null && + dbRes.ratelimitDuration !== null && + dbRes.ratelimitLimit !== null + ) { + ratelimits.default = { + name: "default", + limit: dbRes.ratelimitLimit, + duration: dbRes.ratelimitDuration, + }; + } for (const rl of dbRes.identity?.ratelimits ?? []) { ratelimits[rl.name] = rl; } @@ -457,26 +469,17 @@ export class KeyService { const ratelimits: { [name: string | "default"]: Required; } = {}; - if ( - data.key.ratelimitAsync !== null && - data.key.ratelimitDuration !== null && - data.key.ratelimitLimit !== null - ) { + if ("default" in data.ratelimits) { ratelimits.default = { - identity: data.identity?.id ?? data.key.id, - name: "default", + identity: data.key.id, + name: data.ratelimits.default.name, cost: req.ratelimit?.cost ?? 1, - limit: data.key.ratelimitLimit, - duration: data.key.ratelimitDuration, + limit: data.ratelimits.default.limit, + duration: data.ratelimits.default.duration, }; } for (const r of req.ratelimits ?? []) { - if (r.name === "default" && "default" in ratelimits) { - // it's already added above - continue; - } - if (typeof r.limit !== "undefined" && typeof r.duration !== "undefined") { ratelimits[r.name] = { identity: data.identity?.id ?? data.key.id, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab3167927..72872e685 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -861,7 +861,7 @@ importers: version: link:../../internal/worker-logging ai: specifier: ^3.0.23 - version: 3.0.23(react@18.3.1)(solid-js@1.8.22)(svelte@4.2.19)(vue@3.4.38)(zod@3.23.8) + version: 3.0.23(react@18.3.1)(solid-js@1.8.22)(svelte@4.2.19)(vue@3.5.6)(zod@3.23.8) drizzle-orm: specifier: generated version: 0.32.0-aaf764c(@cloudflare/workers-types@4.20240603.0)(@planetscale/database@1.18.0)(react@18.3.1) @@ -1223,7 +1223,7 @@ importers: devDependencies: checkly: specifier: latest - version: 4.9.0(@types/node@20.14.9)(typescript@5.5.3) + version: 4.8.1(@types/node@20.14.9)(typescript@5.5.3) ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@20.14.9)(typescript@5.5.3) @@ -1425,7 +1425,7 @@ importers: version: 18.3.1 react-email: specifier: 2.1.1 - version: 2.1.1(@babel/core@7.25.2)(eslint@9.9.1)(ts-node@10.9.2) + version: 2.1.1(@babel/core@7.25.2)(eslint@9.10.0)(ts-node@10.9.2) resend: specifier: ^3.4.0 version: 3.4.0 @@ -2264,7 +2264,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.1.0 /@babel/compat-data@7.25.4: resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} @@ -2285,7 +2285,7 @@ packages: '@babel/traverse': 7.25.6 '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -2369,7 +2369,7 @@ packages: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 /@babel/parser@7.24.1: resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} @@ -2409,7 +2409,7 @@ packages: '@babel/parser': 7.25.6 '@babel/template': 7.25.0 '@babel/types': 7.25.6 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2533,14 +2533,13 @@ packages: tough-cookie: 4.1.4 dev: false - /@changesets/apply-release-plan@7.0.4: - resolution: {integrity: sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==} + /@changesets/apply-release-plan@7.0.5: + resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} dependencies: - '@babel/runtime': 7.25.6 - '@changesets/config': 3.0.2 + '@changesets/config': 3.0.3 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/should-skip-package': 0.1.0 + '@changesets/git': 3.0.1 + '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 @@ -2552,13 +2551,12 @@ packages: semver: 7.6.3 dev: true - /@changesets/assemble-release-plan@6.0.3: - resolution: {integrity: sha512-bLNh9/Lgl1VwkjWZTq8JmRqH+hj7/Yzfz0jsQ/zJJ+FTmVqmqPj3szeKOri8O/hEM8JmHW019vh2gTO9iq5Cuw==} + /@changesets/assemble-release-plan@6.0.4: + resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} dependencies: - '@babel/runtime': 7.25.6 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.1 - '@changesets/should-skip-package': 0.1.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 semver: 7.6.3 @@ -2575,19 +2573,19 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.25.6 - '@changesets/apply-release-plan': 7.0.4 - '@changesets/assemble-release-plan': 6.0.3 + '@changesets/apply-release-plan': 7.0.5 + '@changesets/assemble-release-plan': 6.0.4 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.2 + '@changesets/config': 3.0.3 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.1 - '@changesets/get-release-plan': 4.0.3 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.4 + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 '@changesets/types': 6.0.0 - '@changesets/write': 0.3.1 + '@changesets/write': 0.3.2 '@manypkg/get-packages': 1.1.3 '@types/semver': 7.5.8 ansi-colors: 4.1.3 @@ -2608,12 +2606,12 @@ packages: tty-table: 4.2.3 dev: true - /@changesets/config@3.0.2: - resolution: {integrity: sha512-cdEhS4t8woKCX2M8AotcV2BOWnBp09sqICxKapgLHf9m5KdENpWjyrFNMjkLqGJtUys9U+w93OxWT0czorVDfw==} + /@changesets/config@3.0.3: + resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.1 - '@changesets/logger': 0.1.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 @@ -2626,24 +2624,22 @@ packages: extendable-error: 0.1.7 dev: true - /@changesets/get-dependents-graph@2.1.1: - resolution: {integrity: sha512-LRFjjvigBSzfnPU2n/AhFsuWR5DK++1x47aq6qZ8dzYsPtS/I5mNhIGAS68IAxh1xjO9BTtz55FwefhANZ+FCA==} + /@changesets/get-dependents-graph@2.1.2: + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 + picocolors: 1.1.0 semver: 7.6.3 dev: true - /@changesets/get-release-plan@4.0.3: - resolution: {integrity: sha512-6PLgvOIwTSdJPTtpdcr3sLtGatT+Jr22+cQwEBJBy6wP0rjB4yJ9lv583J9fVpn1bfQlBkDa8JxbS2g/n9lIyA==} + /@changesets/get-release-plan@4.0.4: + resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} dependencies: - '@babel/runtime': 7.25.6 - '@changesets/assemble-release-plan': 6.0.3 - '@changesets/config': 3.0.2 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/config': 3.0.3 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 dev: true @@ -2652,22 +2648,20 @@ packages: resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} dev: true - /@changesets/git@3.0.0: - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + /@changesets/git@3.0.1: + resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} dependencies: - '@babel/runtime': 7.25.6 '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 micromatch: 4.0.8 spawndamnit: 2.0.0 dev: true - /@changesets/logger@0.1.0: - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + /@changesets/logger@0.1.1: + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} dependencies: - chalk: 2.4.2 + picocolors: 1.1.0 dev: true /@changesets/parse@0.4.0: @@ -2677,33 +2671,30 @@ packages: js-yaml: 3.14.1 dev: true - /@changesets/pre@2.0.0: - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + /@changesets/pre@2.0.1: + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} dependencies: - '@babel/runtime': 7.25.6 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 dev: true - /@changesets/read@0.6.0: - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + /@changesets/read@0.6.1: + resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} dependencies: - '@babel/runtime': 7.25.6 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 '@changesets/parse': 0.4.0 '@changesets/types': 6.0.0 - chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 + picocolors: 1.1.0 dev: true - /@changesets/should-skip-package@0.1.0: - resolution: {integrity: sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==} + /@changesets/should-skip-package@0.1.1: + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} dependencies: - '@babel/runtime': 7.25.6 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 dev: true @@ -2716,10 +2707,9 @@ packages: resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} dev: true - /@changesets/write@0.3.1: - resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} + /@changesets/write@0.3.2: + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} dependencies: - '@babel/runtime': 7.25.6 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 @@ -2735,7 +2725,7 @@ packages: /@clack/core@0.3.4: resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} dependencies: - picocolors: 1.0.1 + picocolors: 1.1.0 sisteransi: 1.0.5 dev: true @@ -2743,7 +2733,7 @@ packages: resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} dependencies: '@clack/core': 0.3.4 - picocolors: 1.0.1 + picocolors: 1.1.0 sisteransi: 1.0.5 dev: true bundledDependencies: @@ -2887,7 +2877,7 @@ packages: '@vitest/runner': 1.5.3 '@vitest/snapshot': 1.5.3 birpc: 0.2.14 - cjs-module-lexer: 1.4.0 + cjs-module-lexer: 1.4.1 devalue: 4.3.3 esbuild: 0.17.19 miniflare: 3.20240610.0 @@ -2912,7 +2902,7 @@ packages: '@vitest/runner': 1.5.3 '@vitest/snapshot': 1.5.3 birpc: 0.2.14 - cjs-module-lexer: 1.4.0 + cjs-module-lexer: 1.4.1 devalue: 4.3.3 esbuild: 0.17.19 miniflare: 3.20240610.0 @@ -2937,7 +2927,7 @@ packages: '@vitest/runner': 1.5.3 '@vitest/snapshot': 1.5.3 birpc: 0.2.14 - cjs-module-lexer: 1.4.0 + cjs-module-lexer: 1.4.1 devalue: 4.3.3 esbuild: 0.17.19 miniflare: 3.20240610.0 @@ -3045,30 +3035,30 @@ packages: /@cloudflare/workers-types@4.20240603.0: resolution: {integrity: sha512-KmsjZcd/dPWM51FoT08cvUGCq9l3nFEriloQ12mcdJPoW911Gi5S/9Cq4xeFvTrtk9TJ2krvxP23IeobecRmOQ==} - /@commitlint/config-validator@19.0.3: - resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + /@commitlint/config-validator@19.5.0: + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 ajv: 8.17.1 dev: true optional: true - /@commitlint/execute-rule@19.0.0: - resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + /@commitlint/execute-rule@19.5.0: + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} engines: {node: '>=v18'} dev: true optional: true - /@commitlint/load@19.4.0(@types/node@20.14.9)(typescript@5.5.3): - resolution: {integrity: sha512-I4lCWaEZYQJ1y+Y+gdvbGAx9pYPavqZAZ3/7/8BpWh+QjscAn8AjsUpLV2PycBsEx7gupq5gM4BViV9xwTIJuw==} + /@commitlint/load@19.5.0(@types/node@20.14.9)(typescript@5.5.3): + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} engines: {node: '>=v18'} requiresBuild: true dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/execute-rule': 19.0.0 - '@commitlint/resolve-extends': 19.1.0 - '@commitlint/types': 19.0.3 + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.5.3) cosmiconfig-typescript-loader: 5.0.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3) @@ -3081,12 +3071,12 @@ packages: dev: true optional: true - /@commitlint/resolve-extends@19.1.0: - resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + /@commitlint/resolve-extends@19.5.0: + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} engines: {node: '>=v18'} dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/types': 19.0.3 + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 global-directory: 4.0.1 import-meta-resolve: 4.1.0 lodash.mergewith: 4.6.2 @@ -3094,8 +3084,8 @@ packages: dev: true optional: true - /@commitlint/types@19.0.3: - resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + /@commitlint/types@19.5.0: + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} engines: {node: '>=v18'} dependencies: '@types/conventional-commits-parser': 5.0.0 @@ -3117,7 +3107,7 @@ packages: pluralize: 8.0.0 serialize-javascript: 6.0.2 typescript: 5.5.3 - yaml: 2.5.0 + yaml: 2.5.1 zod: 3.23.8 dev: true @@ -3244,7 +3234,7 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.8.0 + get-tsconfig: 4.8.1 dev: true /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): @@ -3271,7 +3261,7 @@ packages: esbuild: '*' dependencies: '@types/resolve': 1.20.6 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) esbuild: 0.19.12 escape-string-regexp: 4.0.0 resolve: 1.22.8 @@ -4481,18 +4471,18 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@9.9.1): + /@eslint-community/eslint-utils@4.4.0(eslint@9.10.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 9.9.1 + eslint: 9.10.0 eslint-visitor-keys: 3.4.3 dev: false - /@eslint-community/regexpp@4.11.0: - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + /@eslint-community/regexpp@4.11.1: + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: false @@ -4501,7 +4491,7 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4512,7 +4502,7 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: ajv: 6.12.6 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) espree: 10.1.0 globals: 14.0.0 ignore: 5.3.2 @@ -4524,8 +4514,8 @@ packages: - supports-color dev: false - /@eslint/js@9.9.1: - resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} + /@eslint/js@9.10.0: + resolution: {integrity: sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false @@ -4534,6 +4524,13 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false + /@eslint/plugin-kit@0.1.0: + resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + levn: 0.4.1 + dev: false + /@faker-js/faker@8.4.1: resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} @@ -4547,29 +4544,29 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - /@floating-ui/core@1.6.7: - resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + /@floating-ui/core@1.6.8: + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} dependencies: - '@floating-ui/utils': 0.2.7 + '@floating-ui/utils': 0.2.8 - /@floating-ui/dom@1.6.10: - resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + /@floating-ui/dom@1.6.11: + resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} dependencies: - '@floating-ui/core': 1.6.7 - '@floating-ui/utils': 0.2.7 + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 - /@floating-ui/react-dom@2.1.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + /@floating-ui/react-dom@2.1.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.10 + '@floating-ui/dom': 1.6.11 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@floating-ui/utils@0.2.7: - resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + /@floating-ui/utils@0.2.8: + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} /@formatjs/intl-localematcher@0.5.4: resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} @@ -4590,8 +4587,8 @@ packages: graphql: 16.9.0 dev: false - /@grpc/grpc-js@1.11.1: - resolution: {integrity: sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==} + /@grpc/grpc-js@1.11.3: + resolution: {integrity: sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==} engines: {node: '>=12.10.0'} dependencies: '@grpc/proto-loader': 0.7.13 @@ -5018,24 +5015,23 @@ packages: dev: true optional: true - /@inquirer/confirm@3.1.22: - resolution: {integrity: sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==} + /@inquirer/confirm@3.2.0: + resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} engines: {node: '>=18'} dependencies: - '@inquirer/core': 9.0.10 - '@inquirer/type': 1.5.2 + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 - /@inquirer/core@9.0.10: - resolution: {integrity: sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==} + /@inquirer/core@9.2.1: + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} engines: {node: '>=18'} dependencies: - '@inquirer/figures': 1.0.5 - '@inquirer/type': 1.5.2 + '@inquirer/figures': 1.0.6 + '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.5.2 + '@types/node': 22.5.5 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 - cli-spinners: 2.9.2 cli-width: 4.1.0 mute-stream: 1.0.0 signal-exit: 4.1.0 @@ -5043,12 +5039,18 @@ packages: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 - /@inquirer/figures@1.0.5: - resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + /@inquirer/figures@1.0.6: + resolution: {integrity: sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==} engines: {node: '>=18'} - /@inquirer/type@1.5.2: - resolution: {integrity: sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==} + /@inquirer/type@1.5.5: + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + dependencies: + mute-stream: 1.0.0 + + /@inquirer/type@2.0.0: + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} engines: {node: '>=18'} dependencies: mute-stream: 1.0.0 @@ -5297,7 +5299,7 @@ packages: /@mdx-js/mdx@3.0.1: resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 @@ -5330,7 +5332,7 @@ packages: react: '>=16' dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 /@million/lint@0.0.73: @@ -5352,7 +5354,7 @@ packages: react-dom: 18.3.1(react@18.3.1) react-draggable: 4.4.6(react-dom@18.3.1)(react@18.3.1) react-reconciler: 0.29.2(react@18.3.1) - unplugin: 1.12.3 + unplugin: 1.14.1 zustand: 4.5.5(@types/react@18.2.79)(react@18.3.1) transitivePeerDependencies: - '@types/react' @@ -5362,6 +5364,7 @@ packages: - immer - rollup - supports-color + - webpack-sources dev: true /@mintlify/cli@4.0.182(openapi-types@12.1.3)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3): @@ -5531,7 +5534,7 @@ packages: '@octokit/rest': 19.0.13 chalk: 5.3.0 chokidar: 3.6.0 - express: 4.19.2 + express: 4.21.0 fs-extra: 11.2.0 got: 13.0.0 gray-matter: 4.0.3 @@ -5589,7 +5592,7 @@ packages: lodash: 4.17.21 openapi-types: 12.1.3 zod: 3.23.8 - zod-to-json-schema: 3.23.2(zod@3.23.8) + zod-to-json-schema: 3.23.3(zod@3.23.8) transitivePeerDependencies: - debug dev: true @@ -5611,8 +5614,8 @@ packages: strict-event-emitter: 0.5.1 dev: true - /@mswjs/interceptors@0.29.1: - resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==} + /@mswjs/interceptors@0.35.6: + resolution: {integrity: sha512-PpD687w7qLxVMK176bpQjbzU9O0VC75QnBK5U1lKd29s4hIuxfTItUD6raNKyQ6BN8b64/8HE34RuYTkwH9uPQ==} engines: {node: '>=18'} dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -6018,7 +6021,7 @@ packages: chalk: 4.1.2 clean-stack: 3.0.1 cli-progress: 3.12.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) ejs: 3.1.10 fs-extra: 9.1.0 get-package-type: 0.1.0 @@ -6051,7 +6054,7 @@ packages: chalk: 4.1.2 clean-stack: 3.0.1 cli-progress: 3.12.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) ejs: 3.1.10 fs-extra: 9.1.0 get-package-type: 0.1.0 @@ -6080,15 +6083,15 @@ packages: - typescript dev: true - /@oclif/core@4.0.19: - resolution: {integrity: sha512-VXnsYNVfmucXp5BdOA/OcWi8F/h2h8ofW1GxQDdspodnmnUgALEpqrxXBl5NFuA+iEihtAJeXzX260ICHYDaBg==} + /@oclif/core@4.0.22: + resolution: {integrity: sha512-aXM2O4g7f+kPNzhhOfqGOVRVYDxTVrH7Y720MuH0Twq5WHMxI4XwntnyBaRscoCPG6FWhItZLtiZxsvaUdupGg==} engines: {node: '>=18.0.0'} dependencies: ansi-escapes: 4.3.2 ansis: 3.3.2 clean-stack: 3.0.1 cli-spinners: 2.9.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) ejs: 3.1.10 get-package-type: 0.1.0 globby: 11.1.0 @@ -6133,9 +6136,9 @@ packages: resolution: {integrity: sha512-p30fo3JPtbOqTJOX9A/8qKV/14XWt8xFgG/goVfIkuKBAO+cdY78ag8pYatlpzsYzJhO27X1MFn0WkkPWo36Ww==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 4.0.19 + '@oclif/core': 4.0.22 ansis: 3.3.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) npm: 10.8.3 npm-package-arg: 11.0.3 npm-run-path: 5.3.0 @@ -6154,7 +6157,7 @@ packages: dependencies: '@oclif/core': 2.8.11(@types/node@20.14.9)(typescript@5.5.3) chalk: 4.1.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 9.1.0 http-call: 5.3.0 lodash: 4.17.21 @@ -6556,7 +6559,7 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@grpc/grpc-js': 1.11.1 + '@grpc/grpc-js': 1.11.3 '@opentelemetry/api': 1.4.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/otlp-grpc-exporter-base': 0.39.1(@opentelemetry/api@1.4.1) @@ -6650,7 +6653,7 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@grpc/grpc-js': 1.11.1 + '@grpc/grpc-js': 1.11.3 '@opentelemetry/api': 1.4.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/otlp-exporter-base': 0.39.1(@opentelemetry/api@1.4.1) @@ -6992,7 +6995,7 @@ packages: resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} engines: {node: '>=8.0.0'} dependencies: - tslib: 2.7.0 + tslib: 2.4.1 dev: false /@peculiar/webcrypto@1.4.1: @@ -7002,7 +7005,7 @@ packages: '@peculiar/asn1-schema': 2.3.13 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.5 - tslib: 2.7.0 + tslib: 2.4.1 webcrypto-core: 1.8.0 dev: false @@ -7016,8 +7019,8 @@ packages: resolution: {integrity: sha512-t2XdOfrVgcF7AW791FtdPS27NyNqcE1SpoXgk3HpziousvUMsJi4Q6NL3JyOBpsMOrvk94749o8yyonvX5quPw==} engines: {node: '>=16'} - /@polka/url@1.0.0-next.25: - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + /@polka/url@1.0.0-next.27: + resolution: {integrity: sha512-MU0SYgcrBdSVLu7Tfow3VY4z1odzlaTYRjt3WQ0z8XbjDWReuy+EALt2HdjhrwD2HPiW2GY+KTSw4HLv4C/EOA==} /@probe.gl/env@3.6.0: resolution: {integrity: sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==} @@ -7231,7 +7234,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -7245,8 +7248,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7370,7 +7373,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -7385,14 +7388,14 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7476,7 +7479,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -7490,11 +7493,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7582,7 +7585,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -7592,7 +7595,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -7643,7 +7646,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-context@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -7653,7 +7656,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -7815,7 +7818,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-direction@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -7825,7 +7828,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -7870,7 +7873,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} peerDependencies: '@types/react': '*' @@ -7885,11 +7888,11 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7920,7 +7923,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -7935,11 +7938,11 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8063,7 +8066,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -8073,7 +8076,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -8125,7 +8128,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -8139,10 +8142,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8222,7 +8225,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-id@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -8232,8 +8235,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -8392,7 +8395,7 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.2.79)(react@18.3.1) dev: false - /@radix-ui/react-popover@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-popover@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} peerDependencies: '@types/react': '*' @@ -8407,27 +8410,27 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.5)(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.7)(react@18.3.1) dev: false - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: '@types/react': '*' @@ -8441,17 +8444,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.5)(react@18.3.1) + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.7)(react@18.3.1) '@radix-ui/rect': 1.0.1 - '@types/react': 18.3.5 + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8471,7 +8474,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.2.79)(react@18.3.1) @@ -8487,7 +8490,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -8501,17 +8504,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.5)(react@18.3.1) + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.7)(react@18.3.1) '@radix-ui/rect': 1.0.1 - '@types/react': 18.3.5 + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8530,7 +8533,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.79)(react@18.3.1) '@radix-ui/react-context': 1.1.0(@types/react@18.2.79)(react@18.3.1) @@ -8559,7 +8562,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.1.0(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.2)(react@18.3.1) '@radix-ui/react-context': 1.1.0(@types/react@18.3.2)(react@18.3.1) @@ -8584,7 +8587,7 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} peerDependencies: '@types/react': '*' @@ -8598,8 +8601,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8626,7 +8629,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -8640,8 +8643,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8742,7 +8745,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -8756,9 +8759,9 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8878,7 +8881,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -8892,8 +8895,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8979,7 +8982,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -8994,15 +8997,15 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -9225,7 +9228,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-slot@1.0.2(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-slot@1.0.2(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -9235,8 +9238,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -9393,7 +9396,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} peerDependencies: '@types/react': '*' @@ -9408,19 +9411,19 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} peerDependencies: '@types/react': '*' @@ -9435,15 +9438,15 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} peerDependencies: '@types/react': '*' @@ -9458,18 +9461,18 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -9558,7 +9561,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -9568,7 +9571,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -9621,7 +9624,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -9631,8 +9634,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -9701,7 +9704,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -9711,8 +9714,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -9779,7 +9782,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -9789,7 +9792,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -9847,7 +9850,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -9858,7 +9861,7 @@ packages: dependencies: '@babel/runtime': 7.25.6 '@radix-ui/rect': 1.0.1 - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -9890,7 +9893,7 @@ packages: react: 18.3.1 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.3.5)(react@18.3.1): + /@radix-ui/react-use-size@1.0.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -9900,8 +9903,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.5)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@types/react': 18.3.7 react: 18.3.1 dev: false @@ -9953,7 +9956,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -9967,8 +9970,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.25.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10066,7 +10069,7 @@ packages: react: 18.3.1 dev: false - /@react-email/components@0.0.16(@types/react@18.3.5)(react@18.3.1): + /@react-email/components@0.0.16(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-1WATpMSH03cRvhfNjGl/Up3seZJOzN9KLzlk3Q9g/cqNhZEJ7HYxoZM4AQKAI0V3ttXzzxKv8Oj+AZQLHDiICA==} engines: {node: '>=18.0.0'} peerDependencies: @@ -10080,7 +10083,7 @@ packages: '@react-email/container': 0.0.11(react@18.3.1) '@react-email/font': 0.0.5(react@18.3.1) '@react-email/head': 0.0.7(react@18.3.1) - '@react-email/heading': 0.0.11(@types/react@18.3.5)(react@18.3.1) + '@react-email/heading': 0.0.11(@types/react@18.3.7)(react@18.3.1) '@react-email/hr': 0.0.7(react@18.3.1) '@react-email/html': 0.0.7(react@18.3.1) '@react-email/img': 0.0.7(react@18.3.1) @@ -10135,13 +10138,13 @@ packages: - '@types/react' dev: false - /@react-email/heading@0.0.11(@types/react@18.3.5)(react@18.3.1): + /@react-email/heading@0.0.11(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-EF5ZtRCxhHPw3m+8iibKKg0RAvAeHj1AP68sjU7s6+J+kvRgllr/E972Wi5Y8UvcIGossCvpX1WrSMDzeB4puA==} engines: {node: '>=18.0.0'} peerDependencies: react: 18.2.0 dependencies: - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.7)(react@18.3.1) react: 18.3.1 transitivePeerDependencies: - '@types/react' @@ -10403,133 +10406,133 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 2.3.1 dev: true - /@rollup/rollup-android-arm-eabi@4.21.2: - resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} + /@rollup/rollup-android-arm-eabi@4.21.3: + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.21.2: - resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} + /@rollup/rollup-android-arm64@4.21.3: + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.21.2: - resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} + /@rollup/rollup-darwin-arm64@4.21.3: + resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.21.2: - resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} + /@rollup/rollup-darwin-x64@4.21.3: + resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.21.2: - resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} + /@rollup/rollup-linux-arm-gnueabihf@4.21.3: + resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-musleabihf@4.21.2: - resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} + /@rollup/rollup-linux-arm-musleabihf@4.21.3: + resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.21.2: - resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} + /@rollup/rollup-linux-arm64-gnu@4.21.3: + resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.21.2: - resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} + /@rollup/rollup-linux-arm64-musl@4.21.3: + resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.21.2: - resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + /@rollup/rollup-linux-powerpc64le-gnu@4.21.3: + resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.21.2: - resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} + /@rollup/rollup-linux-riscv64-gnu@4.21.3: + resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.21.2: - resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} + /@rollup/rollup-linux-s390x-gnu@4.21.3: + resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.21.2: - resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} + /@rollup/rollup-linux-x64-gnu@4.21.3: + resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.21.2: - resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} + /@rollup/rollup-linux-x64-musl@4.21.3: + resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.21.2: - resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} + /@rollup/rollup-win32-arm64-msvc@4.21.3: + resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.21.2: - resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} + /@rollup/rollup-win32-ia32-msvc@4.21.3: + resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.21.2: - resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} + /@rollup/rollup-win32-x64-msvc@4.21.3: + resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} cpu: [x64] os: [win32] requiresBuild: true @@ -10553,32 +10556,59 @@ packages: '@types/hast': 3.0.4 dev: false - /@shikijs/core@1.16.1: - resolution: {integrity: sha512-aI0hBtw+a6KsJp2jcD4YuQqKpeCbURMZbhHVozDknJpm+KJqeMRkEnfBC8BaKE/5XC+uofPgCLsa/TkTk0Ba0w==} + /@shikijs/core@1.17.7: + resolution: {integrity: sha512-ZnIDxFu/yvje3Q8owSHaEHd+bu/jdWhHAaJ17ggjXofHx5rc4bhpCSW+OjC6smUBi5s5dd023jWtZ1gzMu/yrw==} dependencies: - '@shikijs/vscode-textmate': 9.2.0 + '@shikijs/engine-javascript': 1.17.7 + '@shikijs/engine-oniguruma': 1.17.7 + '@shikijs/types': 1.17.7 + '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + dev: false + + /@shikijs/engine-javascript@1.17.7: + resolution: {integrity: sha512-wwSf7lKPsm+hiYQdX+1WfOXujtnUG6fnN4rCmExxa4vo+OTmvZ9B1eKauilvol/LHUPrQgW12G3gzem7pY5ckw==} + dependencies: + '@shikijs/types': 1.17.7 + '@shikijs/vscode-textmate': 9.2.2 + oniguruma-to-js: 0.4.3 dev: false - /@shikijs/rehype@1.16.1: - resolution: {integrity: sha512-6GM4yvvs4iz9JYaKWww/02tkOK3nBkmK1j2IcRd8y4/LKnDrv2Nm/TeNohYkZG8CjX8UQfLlBQB5nCXD2OMSgg==} + /@shikijs/engine-oniguruma@1.17.7: + resolution: {integrity: sha512-pvSYGnVeEIconU28NEzBXqSQC/GILbuNbAHwMoSfdTBrobKAsV1vq2K4cAgiaW1TJceLV9QMGGh18hi7cCzbVQ==} dependencies: - '@shikijs/transformers': 1.16.1 + '@shikijs/types': 1.17.7 + '@shikijs/vscode-textmate': 9.2.2 + dev: false + + /@shikijs/rehype@1.17.7: + resolution: {integrity: sha512-h7P21wNPm2OHNDtOYzIogTdI9BW/+q8fR167A/NAExXpMlqfiDbaN0uodOWjHlaohwbebZXPvjpoInEinP/d+w==} + dependencies: + '@shikijs/transformers': 1.17.7 + '@shikijs/types': 1.17.7 '@types/hast': 3.0.4 hast-util-to-string: 3.0.0 - shiki: 1.16.1 + shiki: 1.17.7 unified: 11.0.5 unist-util-visit: 5.0.0 dev: false - /@shikijs/transformers@1.16.1: - resolution: {integrity: sha512-mfbe4YMov+1eyIBU3F6BtaPmLgDkRQaVse8xsBlKTVAcNF3cbZMRCyUz2N6gJOMKLJiv9T5gapBPbRxrDMuoxA==} + /@shikijs/transformers@1.17.7: + resolution: {integrity: sha512-Nu7DaUT/qHDqbEsWBBqX6MyPMFbR4hUZcK11TA+zU/nPu9eDFE8v0p+n+eT4A3+3mxX6czMSF81W4QNsQ/NSpQ==} + dependencies: + shiki: 1.17.7 + dev: false + + /@shikijs/types@1.17.7: + resolution: {integrity: sha512-+qA4UyhWLH2q4EFd+0z4K7GpERDU+c+CN2XYD3sC+zjvAr5iuwD1nToXZMt1YODshjkEGEDV86G7j66bKjqDdg==} dependencies: - shiki: 1.16.1 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 dev: false - /@shikijs/vscode-textmate@9.2.0: - resolution: {integrity: sha512-5FinaOp6Vdh/dl4/yaOTh0ZeKch+rYS8DUb38V3GMKYVkdqzxw53lViRKUYkVILRiVQT7dcPC7VvAKOR73zVtQ==} + /@shikijs/vscode-textmate@9.2.2: + resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} dev: false /@shuding/opentype.js@1.4.0-beta.0: @@ -10626,8 +10656,8 @@ packages: '@types/node': 20.14.9 dev: false - /@slack/types@2.13.0: - resolution: {integrity: sha512-OAQVtKYIgBVNRmgIoiTjorGPTlgfcfstU3XYYCBA+czlB9aGcKb9MQc+6Jovi4gq3S98yP/GPBZsJSI/2mHKDQ==} + /@slack/types@2.14.0: + resolution: {integrity: sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} dev: false @@ -10636,7 +10666,7 @@ packages: engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} dependencies: '@slack/logger': 3.0.0 - '@slack/types': 2.13.0 + '@slack/types': 2.14.0 '@types/is-stream': 1.1.0 '@types/node': 20.14.9 axios: 1.7.7 @@ -10941,7 +10971,7 @@ packages: next: '>=12.0.0' dependencies: '@trigger.dev/sdk': 2.3.18 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) next: 14.1.4(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: - supports-color @@ -10955,7 +10985,7 @@ packages: next: '>=12.0.0' dependencies: '@trigger.dev/sdk': 3.0.0-beta.23(typescript@5.5.3) - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: - supports-color @@ -10969,7 +10999,7 @@ packages: '@trigger.dev/core-backend': 2.3.19 chalk: 5.3.0 cronstrue: 2.50.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) evt: 2.5.7 get-caller-file: 2.0.5 git-remote-origin-url: 4.0.0 @@ -10997,12 +11027,12 @@ packages: '@trigger.dev/core-backend': 3.0.0-beta.23 chalk: 5.3.0 cronstrue: 2.50.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) evt: 2.5.7 get-caller-file: 2.0.5 git-remote-origin-url: 4.0.0 git-repo-info: 2.1.1 - msw: 2.4.1(typescript@5.5.3) + msw: 2.4.8(typescript@5.5.3) slug: 6.1.0 terminal-link: 3.0.0 ulid: 2.3.0 @@ -11011,7 +11041,6 @@ packages: zod: 3.22.3 transitivePeerDependencies: - bufferutil - - graphql - supports-color - typescript - utf-8-validate @@ -11041,7 +11070,6 @@ packages: transitivePeerDependencies: - bufferutil - debug - - graphql - supports-color - typescript - utf-8-validate @@ -11090,7 +11118,7 @@ packages: /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -11382,16 +11410,20 @@ packages: /@types/estree-jsx@1.0.5: resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} /@types/express-serve-static-core@4.19.5: resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} dependencies: '@types/node': 20.14.9 - '@types/qs': 6.9.15 + '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 dev: false @@ -11401,14 +11433,14 @@ packages: dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.19.5 - '@types/qs': 6.9.15 + '@types/qs': 6.9.16 '@types/serve-static': 1.15.7 dev: false /@types/fslightbox-react@1.7.7: resolution: {integrity: sha512-pp9Y7/+L4NFlMp+PdESx66EG0/m70aqg81FNlLP08dGWvRRSvNJFv08Jc91IEQkbh/C1PpokCekNCWZqpWxiyQ==} dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 dev: true /@types/geojson@7946.0.14: @@ -11525,8 +11557,8 @@ packages: resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==} dev: false - /@types/node@18.19.48: - resolution: {integrity: sha512-7WevbG4ekUcRQSZzOwxWgi5dZmTak7FaxXDoW7xVxPBmKx1rTzfmRLkeCgJzcbBnOV2dkhAPc8cCeT6agocpjg==} + /@types/node@18.19.50: + resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==} dependencies: undici-types: 5.26.5 dev: false @@ -11536,8 +11568,8 @@ packages: dependencies: undici-types: 5.26.5 - /@types/node@22.5.2: - resolution: {integrity: sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==} + /@types/node@22.5.5: + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} dependencies: undici-types: 6.19.8 @@ -11552,11 +11584,11 @@ packages: /@types/prismjs@1.26.4: resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + /@types/prop-types@15.7.13: + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} - /@types/qs@6.9.15: - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + /@types/qs@6.9.16: + resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} dev: false /@types/range-parser@1.2.7: @@ -11566,7 +11598,7 @@ packages: /@types/react-dom@18.2.25: resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 /@types/react-dom@18.3.0: resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} @@ -11576,25 +11608,25 @@ packages: /@types/react-syntax-highlighter@15.5.13: resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 dev: true /@types/react@18.2.79: resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 csstype: 3.1.3 /@types/react@18.3.2: resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 csstype: 3.1.3 - /@types/react@18.3.5: - resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} + /@types/react@18.3.7: + resolution: {integrity: sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==} dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 csstype: 3.1.3 /@types/resolve@1.20.6: @@ -11691,7 +11723,7 @@ packages: dependencies: '@typescript-eslint/types': 6.19.0 '@typescript-eslint/visitor-keys': 6.19.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -11765,7 +11797,7 @@ packages: peerDependencies: react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 '@visx/group': 3.3.0(react@18.3.1) '@visx/point': 3.3.0 '@visx/scale': 3.5.0 @@ -11782,7 +11814,7 @@ packages: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 react-dom: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 prop-types: 15.8.1 react: 18.3.1 @@ -11799,7 +11831,7 @@ packages: /@visx/event@3.3.0: resolution: {integrity: sha512-fKalbNgNz2ooVOTXhvcOx5IlEQDgVfX66rI7bgZhBxI2/scy+5rWcXJXpwkheRF68SMx9R93SjKW6tmiD0h+jA==} dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 '@visx/point': 3.3.0 dev: false @@ -11808,7 +11840,7 @@ packages: peerDependencies: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 prop-types: 15.8.1 react: 18.3.1 dev: false @@ -11818,7 +11850,7 @@ packages: peerDependencies: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 classnames: 2.5.1 prop-types: 15.8.1 react: 18.3.1 @@ -11834,7 +11866,7 @@ packages: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: '@types/lodash': 4.17.7 - '@types/react': 18.3.5 + '@types/react': 18.3.7 lodash: 4.17.21 prop-types: 15.8.1 react: 18.3.1 @@ -11854,7 +11886,7 @@ packages: '@types/d3-path': 1.0.11 '@types/d3-shape': 1.3.12 '@types/lodash': 4.17.7 - '@types/react': 18.3.5 + '@types/react': 18.3.7 '@visx/curve': 3.3.0 '@visx/group': 3.3.0(react@18.3.1) '@visx/scale': 3.5.0 @@ -11872,7 +11904,7 @@ packages: react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: '@types/lodash': 4.17.7 - '@types/react': 18.3.5 + '@types/react': 18.3.7 classnames: 2.5.1 lodash: 4.17.21 prop-types: 15.8.1 @@ -11886,7 +11918,7 @@ packages: react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 react-dom: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 '@visx/bounds': 3.3.0(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 prop-types: 15.8.1 @@ -12035,7 +12067,7 @@ packages: fflate: 0.8.2 flatted: 3.3.1 pathe: 1.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 sirv: 2.0.4 vitest: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0) dev: true @@ -12076,78 +12108,78 @@ packages: pretty-format: 29.7.0 dev: true - /@vue/compiler-core@3.4.38: - resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} + /@vue/compiler-core@3.5.6: + resolution: {integrity: sha512-r+gNu6K4lrvaQLQGmf+1gc41p3FO2OUJyWmNqaIITaJU6YFiV5PtQSFZt8jfztYyARwqhoCayjprC7KMvT3nRA==} dependencies: '@babel/parser': 7.25.6 - '@vue/shared': 3.4.38 + '@vue/shared': 3.5.6 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.2.0 + source-map-js: 1.2.1 dev: false - /@vue/compiler-dom@3.4.38: - resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} + /@vue/compiler-dom@3.5.6: + resolution: {integrity: sha512-xRXqxDrIqK8v8sSScpistyYH0qYqxakpsIvqMD2e5sV/PXQ1mTwtXp4k42yHK06KXxKSmitop9e45Ui/3BrTEw==} dependencies: - '@vue/compiler-core': 3.4.38 - '@vue/shared': 3.4.38 + '@vue/compiler-core': 3.5.6 + '@vue/shared': 3.5.6 dev: false - /@vue/compiler-sfc@3.4.38: - resolution: {integrity: sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==} + /@vue/compiler-sfc@3.5.6: + resolution: {integrity: sha512-pjWJ8Kj9TDHlbF5LywjVso+BIxCY5wVOLhkEXRhuCHDxPFIeX1zaFefKs8RYoHvkSMqRWt93a0f2gNJVJixHwg==} dependencies: '@babel/parser': 7.25.6 - '@vue/compiler-core': 3.4.38 - '@vue/compiler-dom': 3.4.38 - '@vue/compiler-ssr': 3.4.38 - '@vue/shared': 3.4.38 + '@vue/compiler-core': 3.5.6 + '@vue/compiler-dom': 3.5.6 + '@vue/compiler-ssr': 3.5.6 + '@vue/shared': 3.5.6 estree-walker: 2.0.2 magic-string: 0.30.11 - postcss: 8.4.44 - source-map-js: 1.2.0 + postcss: 8.4.47 + source-map-js: 1.2.1 dev: false - /@vue/compiler-ssr@3.4.38: - resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==} + /@vue/compiler-ssr@3.5.6: + resolution: {integrity: sha512-VpWbaZrEOCqnmqjE83xdwegtr5qO/2OPUC6veWgvNqTJ3bYysz6vY3VqMuOijubuUYPRpG3OOKIh9TD0Stxb9A==} dependencies: - '@vue/compiler-dom': 3.4.38 - '@vue/shared': 3.4.38 + '@vue/compiler-dom': 3.5.6 + '@vue/shared': 3.5.6 dev: false - /@vue/reactivity@3.4.38: - resolution: {integrity: sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==} + /@vue/reactivity@3.5.6: + resolution: {integrity: sha512-shZ+KtBoHna5GyUxWfoFVBCVd7k56m6lGhk5e+J9AKjheHF6yob5eukssHRI+rzvHBiU1sWs/1ZhNbLExc5oYQ==} dependencies: - '@vue/shared': 3.4.38 + '@vue/shared': 3.5.6 dev: false - /@vue/runtime-core@3.4.38: - resolution: {integrity: sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==} + /@vue/runtime-core@3.5.6: + resolution: {integrity: sha512-FpFULR6+c2lI+m1fIGONLDqPQO34jxV8g6A4wBOgne8eSRHP6PQL27+kWFIx5wNhhjkO7B4rgtsHAmWv7qKvbg==} dependencies: - '@vue/reactivity': 3.4.38 - '@vue/shared': 3.4.38 + '@vue/reactivity': 3.5.6 + '@vue/shared': 3.5.6 dev: false - /@vue/runtime-dom@3.4.38: - resolution: {integrity: sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==} + /@vue/runtime-dom@3.5.6: + resolution: {integrity: sha512-SDPseWre45G38ENH2zXRAHL1dw/rr5qp91lS4lt/nHvMr0MhsbCbihGAWLXNB/6VfFOJe2O+RBRkXU+CJF7/sw==} dependencies: - '@vue/reactivity': 3.4.38 - '@vue/runtime-core': 3.4.38 - '@vue/shared': 3.4.38 + '@vue/reactivity': 3.5.6 + '@vue/runtime-core': 3.5.6 + '@vue/shared': 3.5.6 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.4.38(vue@3.4.38): - resolution: {integrity: sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==} + /@vue/server-renderer@3.5.6(vue@3.5.6): + resolution: {integrity: sha512-zivnxQnOnwEXVaT9CstJ64rZFXMS5ZkKxCjDQKiMSvUhXRzFLWZVbaBiNF4HGDqGNNsTgmjcCSmU6TB/0OOxLA==} peerDependencies: - vue: 3.4.38 + vue: 3.5.6 dependencies: - '@vue/compiler-ssr': 3.4.38 - '@vue/shared': 3.4.38 - vue: 3.4.38(typescript@5.5.3) + '@vue/compiler-ssr': 3.5.6 + '@vue/shared': 3.5.6 + vue: 3.5.6(typescript@5.5.3) dev: false - /@vue/shared@3.4.38: - resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} + /@vue/shared@3.5.6: + resolution: {integrity: sha512-eidH0HInnL39z6wAt6SFIwBrvGOpDWsDxlw3rCgo1B+CQ1781WzQUSU3YjxgdkcJo9Q8S6LmXTkvI+cLHGkQfA==} dev: false /@webassemblyjs/ast@1.12.1: @@ -12323,8 +12355,8 @@ packages: engines: {node: '>=0.4.0'} dev: true - /acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + /acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} dependencies: acorn: 8.12.1 @@ -12349,7 +12381,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -12377,7 +12409,7 @@ packages: indent-string: 5.0.0 dev: true - /ai@3.0.23(react@18.3.1)(solid-js@1.8.22)(svelte@4.2.19)(vue@3.4.38)(zod@3.23.8): + /ai@3.0.23(react@18.3.1)(solid-js@1.8.22)(svelte@4.2.19)(vue@3.5.6)(zod@3.23.8): resolution: {integrity: sha512-VL8Fx9euEtffzIu0BpLDZkACB+oU6zj4vHXSsSoT5VfwAzE009FJedOMPK1M4u60RpYw/DgwlD7OLN7XQfvSHw==} engines: {node: '>=18'} peerDependencies: @@ -12412,8 +12444,8 @@ packages: svelte: 4.2.19 swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 - swrv: 1.0.4(vue@3.4.38) - vue: 3.4.38(typescript@5.5.3) + swrv: 1.0.4(vue@3.5.6) + vue: 3.5.6(typescript@5.5.3) zod: 3.23.8 zod-to-json-schema: 3.22.5(zod@3.23.8) dev: false @@ -12514,8 +12546,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + /ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} /ansi-sequence-parser@1.1.1: @@ -12588,10 +12620,9 @@ packages: dependencies: tslib: 2.7.0 - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - dependencies: - dequal: 2.0.3 + /aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} dev: false /arity-n@1.0.4: @@ -12728,10 +12759,10 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001655 + caniuse-lite: 1.0.30001660 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: false @@ -12744,10 +12775,10 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001655 + caniuse-lite: 1.0.30001660 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 postcss: 8.4.38 postcss-value-parser: 4.2.0 @@ -12764,7 +12795,7 @@ packages: /axios@1.7.4: resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} dependencies: - follow-redirects: 1.15.6 + follow-redirects: 1.15.9 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -12774,7 +12805,7 @@ packages: /axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} dependencies: - follow-redirects: 1.15.6 + follow-redirects: 1.15.9 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -12860,8 +12891,8 @@ packages: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} dev: true - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + /body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 @@ -12872,7 +12903,7 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -12912,8 +12943,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001655 - electron-to-chromium: 1.5.13 + caniuse-lite: 1.0.30001660 + electron-to-chromium: 1.5.25 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -13044,13 +13075,13 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false - /caniuse-lite@1.0.30001655: - resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} + /caniuse-lite@1.0.30001660: + resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) tslib: 2.7.0 transitivePeerDependencies: - supports-color @@ -13152,8 +13183,8 @@ packages: get-func-name: 2.0.2 dev: true - /checkly@4.9.0(@types/node@20.14.9)(typescript@5.5.3): - resolution: {integrity: sha512-LqohEntErF7dJaJPsEpjvr/O9wUfzBRac6DOXgFDMEw+dNi19oBAcspdOqVGjPjMoCZ9/s5b5tSJI1pusY4mJQ==} + /checkly@4.8.1(@types/node@20.14.9)(typescript@5.5.3): + resolution: {integrity: sha512-LyVxHVOqjZ6k/QXGZQhZgnG7stL5mYfzu+Vl5hkdh2ZKDm/MLk4Q+gRKAyMLOjMN66jrJN1ZM1K3zlLt2/EJcg==} engines: {node: '>=16.0.0'} hasBin: true dependencies: @@ -13280,8 +13311,8 @@ packages: engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.4.0: - resolution: {integrity: sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==} + /cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} /class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} @@ -13475,7 +13506,7 @@ packages: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 acorn: 8.12.1 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -13827,7 +13858,7 @@ packages: engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 dev: false /css-what@2.1.3: @@ -13883,7 +13914,7 @@ packages: longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 19.4.0(@types/node@20.14.9)(typescript@5.5.3) + '@commitlint/load': 19.5.0(@types/node@20.14.9)(typescript@5.5.3) transitivePeerDependencies: - '@types/node' - typescript @@ -14149,8 +14180,8 @@ packages: ms: 2.1.2 dev: true - /debug@4.3.6(supports-color@8.1.1): - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + /debug@4.3.7(supports-color@8.1.1): + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -14158,7 +14189,7 @@ packages: supports-color: optional: true dependencies: - ms: 2.1.2 + ms: 2.1.3 supports-color: 8.1.1 /decamelize-keys@1.1.1: @@ -14332,7 +14363,7 @@ packages: hasBin: true dependencies: address: 1.2.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -14452,7 +14483,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.4.1 dev: false /dot-prop@6.0.1: @@ -14834,8 +14865,8 @@ packages: jake: 10.9.2 dev: true - /electron-to-chromium@1.5.13: - resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + /electron-to-chromium@1.5.25: + resolution: {integrity: sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==} /emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -14851,6 +14882,11 @@ packages: engines: {node: '>= 0.8'} dev: true + /encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + dev: true + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -14861,7 +14897,7 @@ packages: resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) engine.io-parser: 5.2.3 ws: 8.17.1 xmlhttprequest-ssl: 2.0.0 @@ -14886,7 +14922,7 @@ packages: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) engine.io-parser: 5.2.3 ws: 8.17.1 transitivePeerDependencies: @@ -15054,7 +15090,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) esbuild: 0.19.12 transitivePeerDependencies: - supports-color @@ -15262,31 +15298,31 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - /eslint-config-prettier@9.0.0(eslint@9.9.1): + /eslint-config-prettier@9.0.0(eslint@9.10.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 9.9.1 + eslint: 9.10.0 dev: false - /eslint-config-turbo@1.10.12(eslint@9.9.1): + /eslint-config-turbo@1.10.12(eslint@9.10.0): resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 9.9.1 - eslint-plugin-turbo: 1.10.12(eslint@9.9.1) + eslint: 9.10.0 + eslint-plugin-turbo: 1.10.12(eslint@9.10.0) dev: false - /eslint-plugin-turbo@1.10.12(eslint@9.9.1): + /eslint-plugin-turbo@1.10.12(eslint@9.10.0): resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 9.9.1 + eslint: 9.10.0 dev: false /eslint-scope@5.1.1: @@ -15314,8 +15350,8 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false - /eslint@9.9.1: - resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} + /eslint@9.10.0: + resolution: {integrity: sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -15324,18 +15360,19 @@ packages: jiti: optional: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.9.1 + '@eslint/js': 9.10.0 + '@eslint/plugin-kit': 0.1.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.0.2 eslint-visitor-keys: 4.0.0 @@ -15351,7 +15388,6 @@ packages: is-glob: 4.0.3 is-path-inside: 3.0.3 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 @@ -15404,12 +15440,12 @@ packages: /estree-util-attach-comments@2.1.1: resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 /estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /estree-util-build-jsx@2.2.2: @@ -15452,7 +15488,7 @@ packages: /estree-util-value-to-estree@3.1.2: resolution: {integrity: sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /estree-util-visit@1.2.1: @@ -15477,7 +15513,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} @@ -15588,36 +15624,36 @@ packages: engines: {node: ^v12.20.0 || >=v14.13.0} dev: false - /express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + /express@4.21.0: + resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.10 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -15655,7 +15691,7 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.4 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -15778,7 +15814,7 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} dependencies: - is-unicode-supported: 2.0.0 + is-unicode-supported: 2.1.0 dev: false /file-entry-cache@8.0.0: @@ -15808,12 +15844,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + /finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -15897,8 +15933,8 @@ packages: uglify-js: 2.8.29 dev: false - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + /follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -16108,8 +16144,8 @@ packages: react-dom: '>= 18' dependencies: '@formatjs/intl-localematcher': 0.5.4 - '@shikijs/rehype': 1.16.1 - '@shikijs/transformers': 1.16.1 + '@shikijs/rehype': 1.17.7 + '@shikijs/transformers': 1.17.7 flexsearch: 0.7.21 github-slugger: 2.0.0 negotiator: 0.6.3 @@ -16117,7 +16153,7 @@ packages: npm-to-yarn: 2.2.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.10(@types/react@18.2.79)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.2.79)(react@18.3.1) remark: 15.0.1 remark-gfm: 4.0.0 remark-mdx: 3.0.1 @@ -16217,7 +16253,7 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} dependencies: - pump: 3.0.0 + pump: 3.0.2 dev: true /get-stream@6.0.1: @@ -16246,8 +16282,8 @@ packages: es-errors: 1.3.0 get-intrinsic: 1.2.4 - /get-tsconfig@4.8.0: - resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} + /get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -16562,7 +16598,7 @@ packages: dependencies: '@types/hast': 3.0.4 hast-util-from-dom: 5.0.0 - hast-util-from-html: 2.0.2 + hast-util-from-html: 2.0.3 unist-util-remove-position: 5.0.0 dev: true @@ -16576,8 +16612,8 @@ packages: vfile-message: 3.1.4 dev: true - /hast-util-from-html@2.0.2: - resolution: {integrity: sha512-HwOHwxdt2zC5KQ/CNoybBntRook2zJvfZE/u5/Ap7aLPe22bDqen7KwGkOqOyzL5zIqKwiYX/OTtE0FWgr6XXA==} + /hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 @@ -16680,7 +16716,7 @@ packages: /hast-util-to-estree@2.3.3: resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 '@types/unist': 2.0.11 @@ -16701,7 +16737,7 @@ packages: /hast-util-to-estree@3.1.0: resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -16709,7 +16745,7 @@ packages: estree-util-attach-comments: 3.0.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.1.3 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 @@ -16737,22 +16773,38 @@ packages: zwitch: 2.0.4 dev: true + /hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + dev: false + /hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.1.3 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.7 + style-to-object: 1.0.8 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -16819,7 +16871,6 @@ packages: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} dependencies: '@types/hast': 3.0.4 - dev: true /hast@1.0.0: resolution: {integrity: sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==} @@ -16953,7 +17004,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: content-type: 1.0.5 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) is-retry-allowed: 1.2.0 is-stream: 2.0.1 parse-json: 4.0.0 @@ -16986,7 +17037,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -17061,7 +17112,7 @@ packages: dependencies: acorn: 8.12.1 acorn-import-assertions: 1.9.0(acorn@8.12.1) - cjs-module-lexer: 1.4.0 + cjs-module-lexer: 1.4.1 module-details-from-path: 1.0.3 dev: false @@ -17107,8 +17158,8 @@ packages: /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - /inline-style-parser@0.2.3: - resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + /inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} dev: true /input-otp@1.2.4(react-dom@18.3.1)(react@18.3.1): @@ -17443,7 +17494,7 @@ packages: /is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -17517,8 +17568,8 @@ packages: engines: {node: '>=12'} dev: true - /is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + /is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} dev: false @@ -17816,7 +17867,7 @@ packages: summary: 2.1.0 typescript: 5.5.3 zod: 3.23.8 - zod-validation-error: 3.3.1(zod@3.23.8) + zod-validation-error: 3.4.0(zod@3.23.8) dev: true /layerr@3.0.0: @@ -18121,7 +18172,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.7.0 + tslib: 2.4.1 dev: false /lowercase-keys@3.0.0: @@ -18463,8 +18514,8 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdx-expression@2.0.0: - resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + /mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -18526,7 +18577,7 @@ packages: resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} dependencies: mdast-util-from-markdown: 2.0.1 - mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.1.3 mdast-util-mdxjs-esm: 2.0.1 mdast-util-to-markdown: 2.1.0 @@ -18678,8 +18729,8 @@ packages: yargs-parser: 18.1.3 dev: true - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + /merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} dev: true /merge-stream@2.0.0: @@ -18908,7 +18959,7 @@ packages: /micromark-extension-mdx-expression@1.0.8: resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -18920,9 +18971,9 @@ packages: /micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.1 + micromark-factory-mdx-expression: 2.0.2 micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-events-to-acorn: 2.0.2 @@ -18933,7 +18984,7 @@ packages: resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-util-is-identifier-name: 2.1.0 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 @@ -18943,16 +18994,17 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-extension-mdx-jsx@3.0.0: - resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + /micromark-extension-mdx-jsx@3.0.1: + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.1 + micromark-factory-mdx-expression: 2.0.2 micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 vfile-message: 4.0.2 @@ -18970,7 +19022,7 @@ packages: /micromark-extension-mdxjs-esm@1.0.5: resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 micromark-core-commonmark: 1.1.0 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 @@ -18983,7 +19035,7 @@ packages: /micromark-extension-mdxjs-esm@3.0.0: resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 micromark-util-character: 2.1.0 @@ -19011,7 +19063,7 @@ packages: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 micromark-extension-mdx-md: 2.0.0 micromark-extension-mdxjs-esm: 3.0.0 micromark-util-combine-extensions: 2.0.0 @@ -19050,7 +19102,7 @@ packages: /micromark-factory-mdx-expression@1.0.9: resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 micromark-util-symbol: 1.1.0 @@ -19059,11 +19111,12 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-factory-mdx-expression@2.0.1: - resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + /micromark-factory-mdx-expression@2.0.2: + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 devlop: 1.1.0 + micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.0 @@ -19199,7 +19252,7 @@ packages: resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/unist': 2.0.11 estree-util-visit: 1.2.1 micromark-util-symbol: 1.1.0 @@ -19211,7 +19264,7 @@ packages: resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -19291,7 +19344,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -19314,7 +19367,7 @@ packages: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -19410,7 +19463,7 @@ packages: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 @@ -19433,7 +19486,7 @@ packages: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 @@ -19516,7 +19569,6 @@ packages: /minipass@6.0.2: resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==} engines: {node: '>=16 || 14 >=14.17'} - dev: true /minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} @@ -19633,7 +19685,7 @@ packages: resolution: {integrity: sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==} dependencies: bl: 4.1.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) process-nextick-args: 2.0.1 transitivePeerDependencies: - supports-color @@ -19646,7 +19698,7 @@ packages: dependencies: commist: 1.1.0 concat-stream: 2.0.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) duplexify: 4.1.3 help-me: 3.0.0 inherits: 2.0.4 @@ -19654,7 +19706,7 @@ packages: minimist: 1.2.8 mqtt-packet: 6.10.0 number-allocator: 1.0.14 - pump: 3.0.0 + pump: 3.0.2 readable-stream: 3.6.2 reinterval: 1.1.0 rfdc: 1.4.1 @@ -19681,6 +19733,7 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -19698,7 +19751,7 @@ packages: dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 - '@inquirer/confirm': 3.1.22 + '@inquirer/confirm': 3.2.0 '@mswjs/cookies': 1.1.1 '@mswjs/interceptors': 0.26.15 '@open-draft/until': 2.1.0 @@ -19709,42 +19762,40 @@ packages: headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 - path-to-regexp: 6.2.2 + path-to-regexp: 6.3.0 strict-event-emitter: 0.5.1 - type-fest: 4.26.0 + type-fest: 4.26.1 typescript: 5.5.3 yargs: 17.7.2 dev: true - /msw@2.4.1(typescript@5.5.3): - resolution: {integrity: sha512-HXcoQPzYTwEmVk+BGIcRa0vLabBT+J20SSSeYh/QfajaK5ceA6dlD4ZZjfz2dqGEq4vRNCPLP6eXsB94KllPFg==} + /msw@2.4.8(typescript@5.5.3): + resolution: {integrity: sha512-a+FUW1m5yT8cV9GBy0L/cbNg0EA4//SKEzgu3qFrpITrWYeZmqfo7dqtM74T2lAl69jjUjjCaEhZKaxG2Ns8DA==} engines: {node: '>=18'} hasBin: true requiresBuild: true peerDependencies: - graphql: '>= 16.8.x' - typescript: '>= 4.7.x' + typescript: '>= 4.8.x' peerDependenciesMeta: - graphql: - optional: true typescript: optional: true dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 3.1.22 - '@mswjs/interceptors': 0.29.1 + '@inquirer/confirm': 3.2.0 + '@mswjs/interceptors': 0.35.6 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 '@types/statuses': 2.0.5 chalk: 4.1.2 + graphql: 16.9.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 - path-to-regexp: 6.2.2 + path-to-regexp: 6.3.0 strict-event-emitter: 0.5.1 - type-fest: 4.26.0 + type-fest: 4.26.1 typescript: 5.5.3 yargs: 17.7.2 dev: false @@ -19866,7 +19917,7 @@ packages: '@next/env': 14.1.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001655 + caniuse-lite: 1.0.30001660 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -19906,7 +19957,7 @@ packages: '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001655 + caniuse-lite: 1.0.30001660 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -19947,7 +19998,7 @@ packages: '@next/env': 14.2.3 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001655 + caniuse-lite: 1.0.30001660 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -19990,7 +20041,7 @@ packages: '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001655 + caniuse-lite: 1.0.30001660 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -20020,7 +20071,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.7.0 + tslib: 2.4.1 dev: false /node-addon-api@7.1.1: @@ -20241,7 +20292,7 @@ packages: /number-allocator@1.0.14: resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==} dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) js-sdsl: 4.3.0 transitivePeerDependencies: - supports-color @@ -20343,6 +20394,12 @@ packages: mimic-function: 5.0.1 dev: true + /oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + dependencies: + regex: 4.3.2 + dev: false + /open@8.4.0: resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} engines: {node: '>=12'} @@ -20365,7 +20422,7 @@ packages: resolution: {integrity: sha512-kv2hevAWZZ3I/vd2t8znGO2rd8wkowncsfcYpo8i+wU9ML+JEcdqiViANXXjWWGjIhajFNixE6gOY1fEgqILAg==} hasBin: true dependencies: - '@types/node': 18.19.48 + '@types/node': 18.19.50 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -20396,7 +20453,7 @@ packages: /openapi3-ts@4.4.0: resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==} dependencies: - yaml: 2.5.0 + yaml: 2.5.1 dev: false /opener@1.5.2: @@ -20711,18 +20768,18 @@ packages: engines: {node: '>=16 || 14 >=14.18'} dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 6.0.2 - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + /path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} dev: true /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false - /path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + /path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -20752,7 +20809,7 @@ packages: /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 3.0.3 is-reference: 3.0.2 @@ -20760,8 +20817,8 @@ packages: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + /picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -20879,7 +20936,7 @@ packages: lilconfig: 3.1.2 postcss: 8.4.38 ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3) - yaml: 2.5.0 + yaml: 2.5.1 /postcss-nested@6.2.0(postcss@8.4.38): resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} @@ -20912,15 +20969,15 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 /postcss@8.4.35: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.1.0 source-map-js: 1.0.2 dev: false @@ -20929,22 +20986,22 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 - /postcss@8.4.44: - resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} + /postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 /posthog-js@1.130.1: resolution: {integrity: sha512-BC283kxeJnVIeAxn7ZPHf5sCTA6oXs4uvo9fdGAsbKwwfmF9g09rnJOOaoF95J/auf8HT4YB6Vt2KytqtJD44w==} dependencies: fflate: 0.4.8 - preact: 10.23.2 + preact: 10.24.0 dev: false /posthog-node@3.6.3: @@ -20957,8 +21014,8 @@ packages: - debug dev: true - /preact@10.23.2: - resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} + /preact@10.24.0: + resolution: {integrity: sha512-aK8Cf+jkfyuZ0ZZRG9FbYqwmEiGQ4y/PUO4SuTWoyWL244nZZh7bd5h2APd4rSNDYTBNghg1L+5iJN3Skxtbsw==} dev: false /preferred-pm@3.1.4: @@ -21141,8 +21198,8 @@ packages: is-ip: 3.1.0 dev: true - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + /pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -21210,19 +21267,11 @@ packages: engines: {node: '>=6.0.0'} dev: false - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: true - /qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.6 - dev: false /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -21292,7 +21341,7 @@ packages: dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - ua-parser-js: 0.7.38 + ua-parser-js: 0.7.39 dev: false /react-dom@18.2.0(react@18.2.0): @@ -21326,22 +21375,22 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: true - /react-email@2.1.1(@babel/core@7.25.2)(eslint@9.9.1)(ts-node@10.9.2): + /react-email@2.1.1(@babel/core@7.25.2)(eslint@9.10.0)(ts-node@10.9.2): resolution: {integrity: sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==} engines: {node: '>=18.0.0'} hasBin: true dependencies: '@babel/parser': 7.24.1 '@radix-ui/colors': 1.0.1 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.5)(react@18.3.1) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-tooltip': 1.0.6(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1)(react@18.3.1) - '@react-email/components': 0.0.16(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': 1.0.6(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1)(react@18.3.1) + '@react-email/components': 0.0.16(@types/react@18.3.7)(react@18.3.1) '@react-email/render': 0.0.12 '@swc/core': 1.3.101 - '@types/react': 18.3.5 + '@types/react': 18.3.7 '@types/react-dom': 18.3.0 '@types/webpack': 5.28.5(@swc/core@1.3.101)(esbuild@0.19.11) autoprefixer: 10.4.14(postcss@8.4.35) @@ -21352,8 +21401,8 @@ packages: commander: 11.1.0 debounce: 2.0.0 esbuild: 0.19.11 - eslint-config-prettier: 9.0.0(eslint@9.9.1) - eslint-config-turbo: 1.10.12(eslint@9.9.1) + eslint-config-prettier: 9.0.0(eslint@9.10.0) + eslint-config-turbo: 1.10.12(eslint@9.10.0) framer-motion: 10.17.4(react-dom@18.3.1)(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 @@ -21411,7 +21460,7 @@ packages: react: '>=16' dependencies: '@types/hast': 2.3.10 - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 '@types/react': 18.2.79 '@types/unist': 2.0.11 comma-separated-tokens: 2.0.3 @@ -21464,7 +21513,7 @@ packages: tslib: 2.7.0 dev: false - /react-remove-scroll-bar@2.3.6(@types/react@18.3.5)(react@18.3.1): + /react-remove-scroll-bar@2.3.6(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: @@ -21474,9 +21523,9 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) tslib: 2.7.0 dev: false @@ -21491,29 +21540,10 @@ packages: optional: true dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) tslib: 2.7.0 dev: true - /react-remove-scroll@2.5.10(@types/react@18.2.79)(react@18.3.1): - resolution: {integrity: sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.79 - react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.2.79)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.3.1) - tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.2.79)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) - dev: false - /react-remove-scroll@2.5.4(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} engines: {node: '>=10'} @@ -21545,10 +21575,10 @@ packages: dependencies: react: 18.3.1 react-remove-scroll-bar: 2.3.6(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.5)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.5)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.7)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.7)(react@18.3.1) dev: true /react-remove-scroll@2.5.5(@types/react@18.2.79)(react@18.3.1): @@ -21570,7 +21600,7 @@ packages: use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) dev: false - /react-remove-scroll@2.5.5(@types/react@18.3.5)(react@18.3.1): + /react-remove-scroll@2.5.5(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -21580,13 +21610,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.5)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.7)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.5)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.5)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.7)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.7)(react@18.3.1) dev: false /react-remove-scroll@2.5.7(@types/react@18.2.79)(react@18.3.1): @@ -21620,12 +21650,31 @@ packages: dependencies: react: 18.3.1 react-remove-scroll-bar: 2.3.6(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.5)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.5)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.7)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.7)(react@18.3.1) dev: true + /react-remove-scroll@2.6.0(@types/react@18.2.79)(react@18.3.1): + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.79 + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.2.79)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.3.1) + tslib: 2.7.0 + use-callback-ref: 1.3.2(@types/react@18.2.79)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) + dev: false + /react-style-singleton@2.2.1(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -21643,7 +21692,7 @@ packages: tslib: 2.7.0 dev: false - /react-style-singleton@2.2.1(@types/react@18.3.5)(react@18.3.1): + /react-style-singleton@2.2.1(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -21653,7 +21702,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 @@ -21858,6 +21907,10 @@ packages: /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + /regex@4.3.2: + resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} + dev: false + /regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -21906,7 +21959,7 @@ packages: resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} dependencies: '@types/hast': 3.0.4 - hast-util-from-html: 2.0.2 + hast-util-from-html: 2.0.3 unified: 11.0.5 dev: false @@ -22007,7 +22060,7 @@ packages: estree-util-value-to-estree: 3.1.2 toml: 3.0.0 unified: 11.0.5 - yaml: 2.5.0 + yaml: 2.5.1 dev: true /remark-mdx@2.3.0: @@ -22128,7 +22181,7 @@ packages: resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} engines: {node: '>=8.6.0'} dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: @@ -22311,29 +22364,29 @@ packages: source-map-support: 0.3.3 dev: false - /rollup@4.21.2: - resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} + /rollup@4.21.3: + resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.2 - '@rollup/rollup-android-arm64': 4.21.2 - '@rollup/rollup-darwin-arm64': 4.21.2 - '@rollup/rollup-darwin-x64': 4.21.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 - '@rollup/rollup-linux-arm-musleabihf': 4.21.2 - '@rollup/rollup-linux-arm64-gnu': 4.21.2 - '@rollup/rollup-linux-arm64-musl': 4.21.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 - '@rollup/rollup-linux-riscv64-gnu': 4.21.2 - '@rollup/rollup-linux-s390x-gnu': 4.21.2 - '@rollup/rollup-linux-x64-gnu': 4.21.2 - '@rollup/rollup-linux-x64-musl': 4.21.2 - '@rollup/rollup-win32-arm64-msvc': 4.21.2 - '@rollup/rollup-win32-ia32-msvc': 4.21.2 - '@rollup/rollup-win32-x64-msvc': 4.21.2 + '@rollup/rollup-android-arm-eabi': 4.21.3 + '@rollup/rollup-android-arm64': 4.21.3 + '@rollup/rollup-darwin-arm64': 4.21.3 + '@rollup/rollup-darwin-x64': 4.21.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 + '@rollup/rollup-linux-arm-musleabihf': 4.21.3 + '@rollup/rollup-linux-arm64-gnu': 4.21.3 + '@rollup/rollup-linux-arm64-musl': 4.21.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 + '@rollup/rollup-linux-riscv64-gnu': 4.21.3 + '@rollup/rollup-linux-s390x-gnu': 4.21.3 + '@rollup/rollup-linux-x64-gnu': 4.21.3 + '@rollup/rollup-linux-x64-musl': 4.21.3 + '@rollup/rollup-win32-arm64-msvc': 4.21.3 + '@rollup/rollup-win32-ia32-msvc': 4.21.3 + '@rollup/rollup-win32-x64-msvc': 4.21.3 fsevents: 2.3.3 dev: true @@ -22476,8 +22529,8 @@ packages: engines: {node: '>=10'} hasBin: true - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + /send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} dependencies: debug: 2.6.9 @@ -22519,14 +22572,14 @@ packages: engines: {node: '>=10'} dev: false - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + /serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color dev: true @@ -22675,11 +22728,14 @@ packages: '@types/hast': 3.0.4 dev: false - /shiki@1.16.1: - resolution: {integrity: sha512-tCJIMaxDVB1mEIJ5TvfZU7kCPB5eo9fli5+21Olc/bmyv+w8kye3JOp+LZRmGkAyT71hrkefQhTiY+o9mBikRQ==} + /shiki@1.17.7: + resolution: {integrity: sha512-Zf6hNtWhFyF4XP5OOsXkBTEx9JFPiN0TQx4wSe+Vqeuczewgk2vT4IZhF4gka55uelm052BD5BaHavNqUNZd+A==} dependencies: - '@shikijs/core': 1.16.1 - '@shikijs/vscode-textmate': 9.2.0 + '@shikijs/core': 1.17.7 + '@shikijs/engine-javascript': 1.17.7 + '@shikijs/engine-oniguruma': 1.17.7 + '@shikijs/types': 1.17.7 + '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 dev: false @@ -22728,7 +22784,7 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} dependencies: - '@polka/url': 1.0.0-next.25 + '@polka/url': 1.0.0-next.27 mrmime: 2.0.0 totalist: 3.0.1 @@ -22786,7 +22842,7 @@ packages: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.4.1 dev: false /snakecase-keys@3.2.1: @@ -22809,7 +22865,7 @@ packages: /socket.io-adapter@2.5.5: resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} dependencies: - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) ws: 8.17.1 transitivePeerDependencies: - bufferutil @@ -22821,7 +22877,7 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) engine.io-client: 6.5.4 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -22835,7 +22891,7 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) engine.io-client: 6.5.4 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -22849,7 +22905,7 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -22860,7 +22916,7 @@ packages: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) engine.io: 6.5.5 socket.io-adapter: 2.5.5 socket.io-parser: 4.2.4 @@ -22877,7 +22933,7 @@ packages: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) engine.io: 6.5.5 socket.io-adapter: 2.5.5 socket.io-parser: 4.2.4 @@ -22931,8 +22987,8 @@ packages: engines: {node: '>=0.10.0'} dev: false - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} /source-map-support@0.3.3: @@ -23190,7 +23246,7 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 /strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} @@ -23257,10 +23313,10 @@ packages: dependencies: inline-style-parser: 0.1.1 - /style-to-object@1.0.7: - resolution: {integrity: sha512-uSjr59G5u6fbxUfKbb8GcqMGT3Xs9v5IbPkjb0S16GyOeBLAzSRK0CixBv5YrYvzO6TDLzIS6QCn78tkqWngPw==} + /style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} dependencies: - inline-style-parser: 0.2.3 + inline-style-parser: 0.2.4 dev: true /styled-components@6.1.13(react-dom@18.3.1)(react@18.3.1): @@ -23374,9 +23430,9 @@ packages: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 acorn: 8.12.1 - aria-query: 5.3.0 + aria-query: 5.3.1 axobject-query: 4.1.0 code-red: 1.0.4 css-tree: 2.3.1 @@ -23438,12 +23494,12 @@ packages: resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} dev: false - /swrv@1.0.4(vue@3.4.38): + /swrv@1.0.4(vue@3.5.6): resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} peerDependencies: vue: '>=3.2.26 < 4' dependencies: - vue: 3.4.38(typescript@5.5.3) + vue: 3.5.6(typescript@5.5.3) dev: false /tailwind-merge@2.2.0: @@ -23493,7 +23549,7 @@ packages: micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) @@ -23524,7 +23580,7 @@ packages: micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) @@ -23568,7 +23624,7 @@ packages: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.0 + pump: 3.0.2 tar-stream: 2.2.0 dev: true @@ -23630,12 +23686,12 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.31.6 + terser: 5.33.0 webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.11) dev: false - /terser@5.31.6: - resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} + /terser@5.33.0: + resolution: {integrity: sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==} engines: {node: '>=10'} hasBin: true dependencies: @@ -23836,7 +23892,7 @@ packages: '@tsconfig/node16': 1.0.4 '@types/node': 20.14.9 acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -23867,7 +23923,7 @@ packages: '@tsconfig/node16': 1.0.4 '@types/node': 20.14.9 acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -23922,14 +23978,14 @@ packages: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2) resolve-from: 5.0.0 - rollup: 4.21.2 + rollup: 4.21.3 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 @@ -23945,7 +24001,7 @@ packages: hasBin: true dependencies: esbuild: 0.21.5 - get-tsconfig: 4.8.0 + get-tsconfig: 4.8.1 optionalDependencies: fsevents: 2.3.3 dev: true @@ -24084,8 +24140,8 @@ packages: engines: {node: '>=12.20'} dev: false - /type-fest@4.26.0: - resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} + /type-fest@4.26.1: + resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} engines: {node: '>=16'} /type-is@1.6.18: @@ -24151,8 +24207,9 @@ packages: engines: {node: '>=14.17'} hasBin: true - /ua-parser-js@0.7.38: - resolution: {integrity: sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==} + /ua-parser-js@0.7.39: + resolution: {integrity: sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==} + hasBin: true dev: false /ufo@1.5.4: @@ -24417,12 +24474,16 @@ packages: engines: {node: '>= 0.8'} dev: true - /unplugin@1.12.3: - resolution: {integrity: sha512-my8DH0/T/Kx33KO+6QXAqdeMYgyy0GktlOpdQjpagfHKw5DrD0ctPr7SHUyOT3g4ZVpzCQGt/qcpuoKJ/pniHA==} + /unplugin@1.14.1: + resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==} engines: {node: '>=14.0.0'} + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true dependencies: acorn: 8.12.1 - webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.2 dev: true @@ -24434,7 +24495,7 @@ packages: dependencies: browserslist: 4.23.3 escalade: 3.2.0 - picocolors: 1.0.1 + picocolors: 1.1.0 /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -24464,7 +24525,7 @@ packages: tslib: 2.7.0 dev: false - /use-callback-ref@1.3.2(@types/react@18.3.5)(react@18.3.1): + /use-callback-ref@1.3.2(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} peerDependencies: @@ -24474,7 +24535,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 react: 18.3.1 tslib: 2.7.0 @@ -24494,7 +24555,7 @@ packages: tslib: 2.7.0 dev: false - /use-sidecar@1.1.2(@types/react@18.3.5)(react@18.3.1): + /use-sidecar@1.1.2(@types/react@18.3.7)(react@18.3.1): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -24504,7 +24565,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.5 + '@types/react': 18.3.7 detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 @@ -24653,10 +24714,10 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.4.2(@types/node@20.14.9) + picocolors: 1.1.0 + vite: 5.4.6(@types/node@20.14.9) transitivePeerDependencies: - '@types/node' - less @@ -24675,10 +24736,10 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.4.2(@types/node@20.14.9) + picocolors: 1.1.0 + vite: 5.4.6(@types/node@20.14.9) transitivePeerDependencies: - '@types/node' - less @@ -24697,10 +24758,10 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.4.2(@types/node@20.14.9) + picocolors: 1.1.0 + vite: 5.4.6(@types/node@20.14.9) transitivePeerDependencies: - '@types/node' - less @@ -24713,8 +24774,8 @@ packages: - terser dev: true - /vite@5.4.2(@types/node@20.14.9): - resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} + /vite@5.4.6(@types/node@20.14.9): + resolution: {integrity: sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -24746,8 +24807,8 @@ packages: dependencies: '@types/node': 20.14.9 esbuild: 0.21.5 - postcss: 8.4.44 - rollup: 4.21.2 + postcss: 8.4.47 + rollup: 4.21.3 optionalDependencies: fsevents: 2.3.3 dev: true @@ -24784,19 +24845,19 @@ packages: '@vitest/spy': 1.3.0 '@vitest/ui': 1.6.0(vitest@1.6.0) '@vitest/utils': 1.3.0 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 chai: 4.5.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.11 pathe: 1.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 std-env: 3.7.0 strip-literal: 2.1.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.2(@types/node@20.14.9) + vite: 5.4.6(@types/node@20.14.9) vite-node: 1.3.0(@types/node@20.14.9) why-is-node-running: 2.3.0 transitivePeerDependencies: @@ -24842,19 +24903,19 @@ packages: '@vitest/spy': 1.5.0 '@vitest/ui': 1.6.0(vitest@1.6.0) '@vitest/utils': 1.5.0 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 chai: 4.5.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.11 pathe: 1.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 std-env: 3.7.0 strip-literal: 2.1.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.2(@types/node@20.14.9) + vite: 5.4.6(@types/node@20.14.9) vite-node: 1.5.0(@types/node@20.14.9) why-is-node-running: 2.3.0 transitivePeerDependencies: @@ -24900,19 +24961,19 @@ packages: '@vitest/spy': 1.6.0 '@vitest/ui': 1.6.0(vitest@1.6.0) '@vitest/utils': 1.6.0 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 chai: 4.5.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.11 pathe: 1.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 std-env: 3.7.0 strip-literal: 2.1.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.2(@types/node@20.14.9) + vite: 5.4.6(@types/node@20.14.9) vite-node: 1.6.0(@types/node@20.14.9) why-is-node-running: 2.3.0 transitivePeerDependencies: @@ -24938,19 +24999,19 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: false - /vue@3.4.38(typescript@5.5.3): - resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==} + /vue@3.5.6(typescript@5.5.3): + resolution: {integrity: sha512-zv+20E2VIYbcJOzJPUWp03NOGFhMmpCKOfSxVTmCYyYFFko48H9tmuQFzYj7tu4qX1AeXlp9DmhIP89/sSxxhw==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.4.38 - '@vue/compiler-sfc': 3.4.38 - '@vue/runtime-dom': 3.4.38 - '@vue/server-renderer': 3.4.38(vue@3.4.38) - '@vue/shared': 3.4.38 + '@vue/compiler-dom': 3.5.6 + '@vue/compiler-sfc': 3.5.6 + '@vue/runtime-dom': 3.5.6 + '@vue/server-renderer': 3.5.6(vue@3.5.6) + '@vue/shared': 3.5.6 typescript: 5.5.3 dev: false @@ -25003,7 +25064,7 @@ packages: dependencies: '@discoveryjs/json-ext': 0.5.7 acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 commander: 7.2.0 debounce: 1.2.1 escape-string-regexp: 4.0.0 @@ -25011,7 +25072,7 @@ packages: html-escaper: 2.0.2 is-plain-object: 5.0.0 opener: 1.5.2 - picocolors: 1.0.1 + picocolors: 1.1.0 sirv: 2.0.4 ws: 7.5.10 transitivePeerDependencies: @@ -25022,6 +25083,7 @@ packages: /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} + dev: false /webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -25037,7 +25099,7 @@ packages: webpack-cli: optional: true dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 @@ -25215,7 +25277,7 @@ packages: esbuild: 0.17.19 miniflare: 3.20240610.0 nanoid: 3.3.7 - path-to-regexp: 6.2.2 + path-to-regexp: 6.3.0 resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 @@ -25250,7 +25312,7 @@ packages: esbuild: 0.17.19 miniflare: 3.20240620.0 nanoid: 3.3.7 - path-to-regexp: 6.2.2 + path-to-regexp: 6.3.0 resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 @@ -25417,8 +25479,8 @@ packages: engines: {node: '>= 14'} dev: true - /yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + /yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true @@ -25547,8 +25609,8 @@ packages: zod: 3.23.8 dev: false - /zod-to-json-schema@3.23.2(zod@3.23.8): - resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} + /zod-to-json-schema@3.23.3(zod@3.23.8): + resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} peerDependencies: zod: ^3.23.3 dependencies: @@ -25564,8 +25626,8 @@ packages: zod: 3.22.3 dev: false - /zod-validation-error@3.3.1(zod@3.23.8): - resolution: {integrity: sha512-uFzCZz7FQis256dqw4AhPQgD6f3pzNca/Zh62RNELavlumQB3nDIUFbF5JQfFLcMbO1s02Q7Xg/gpcOBlEnYZA==} + /zod-validation-error@3.4.0(zod@3.23.8): + resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} engines: {node: '>=18.0.0'} peerDependencies: zod: ^3.18.0 From bdbae75447862e2019885db83285fa7fc4d384b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:18:30 +0200 Subject: [PATCH 3/7] chore(deps): bump fumadocs-core from 12.5.4 to 13.4.10 (#2104) Bumps [fumadocs-core](https://github.com/fuma-nama/fumadocs) from 12.5.4 to 13.4.10. - [Release notes](https://github.com/fuma-nama/fumadocs/releases) - [Commits](https://github.com/fuma-nama/fumadocs/compare/fumadocs-core@12.5.4...fumadocs-core@13.4.10) --- updated-dependencies: - dependency-name: fumadocs-core dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/www/package.json | 2 +- pnpm-lock.yaml | 31 +++++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/apps/www/package.json b/apps/www/package.json index 04b333641..a5037c695 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -36,7 +36,7 @@ "drizzle-orm": "generated", "framer-motion": "11.0.23", "fslightbox-react": "^1.7.6", - "fumadocs-core": "^12.5.4", + "fumadocs-core": "^13.4.10", "geist": "^1.3.0", "github-slugger": "^2.0.0", "lucide-react": "^0.378.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72872e685..88fa18e10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1088,8 +1088,8 @@ importers: specifier: ^1.7.6 version: 1.7.6(prop-types@15.8.1)(react-dom@18.3.1)(react@18.3.1) fumadocs-core: - specifier: ^12.5.4 - version: 12.5.4(@types/react@18.2.79)(next@14.2.5)(react-dom@18.3.1)(react@18.3.1) + specifier: ^13.4.10 + version: 13.4.10(@types/react@18.2.79)(next@14.2.5)(react-dom@18.3.1)(react@18.3.1) geist: specifier: ^1.3.0 version: 1.3.0(next@14.2.5) @@ -16136,8 +16136,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /fumadocs-core@12.5.4(@types/react@18.2.79)(next@14.2.5)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-KE6vWCSijo2xYEq+xvebNcNrPK9gcIbigMoZn20AIoOVg7aKGkkshTjwR6M2lXdq9PyV/BdgAO5u+sWlTMebeQ==} + /fumadocs-core@13.4.10(@types/react@18.2.79)(next@14.2.5)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ygLVuWyeD2xTm//wPy5mAEDq+eiLc2mCyOSY7kwRYh2+ZfLruI8Sb7Hy7HfdYuzSaVYpAZ0mD+NGQSBunUiS7Q==} peerDependencies: next: '>= 14.1.0' react: '>= 18' @@ -16148,9 +16148,10 @@ packages: '@shikijs/transformers': 1.17.7 flexsearch: 0.7.21 github-slugger: 2.0.0 + image-size: 1.1.1 negotiator: 0.6.3 next: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) - npm-to-yarn: 2.2.1 + npm-to-yarn: 3.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.6.0(@types/react@18.2.79)(react@18.3.1) @@ -16158,7 +16159,7 @@ packages: remark-gfm: 4.0.0 remark-mdx: 3.0.1 scroll-into-view-if-needed: 3.1.0 - shiki: 1.12.0 + shiki: 1.17.7 swr: 2.2.5(react@18.3.1) unist-util-visit: 5.0.0 transitivePeerDependencies: @@ -17100,6 +17101,14 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + /image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + dependencies: + queue: 6.0.2 + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -20197,8 +20206,8 @@ packages: dependencies: path-key: 4.0.0 - /npm-to-yarn@2.2.1: - resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} + /npm-to-yarn@3.0.0: + resolution: {integrity: sha512-76YnmsbfrYp0tMsWxM0RNX0Vs+x8JxpJGu6B/jDn4lW8+laiTcKmKi9MeMh4UikO4RkJ1oqURoDy9bXJmMXS6A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false @@ -21280,6 +21289,12 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + dev: false + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} From ad1e37520f64beed1d3c744be02d36a5d27a4e1d Mon Sep 17 00:00:00 2001 From: MichaelUnkey <148160799+MichaelUnkey@users.noreply.github.com> Date: Thu, 19 Sep 2024 03:18:42 -0400 Subject: [PATCH 4/7] feat: added Ratelimit to dashboard (#2076) * added ratelimit to dashboard * [autofix.ci] apply automated fixes * consolidate ratelimit for dashboard * [autofix.ci] apply automated fixes * updated import path * [autofix.ci] apply automated fixes * fixed with no root key * [autofix.ci] apply automated fixes * remove extra data returned * [autofix.ci] apply automated fixes * docs: explain permissions and use of key --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: chronark --- apps/dashboard/lib/env.ts | 6 +++ apps/dashboard/lib/trpc/ratelimitProcedure.ts | 48 +++++++++++++++++++ apps/dashboard/lib/trpc/routers/api/create.ts | 7 ++- apps/dashboard/lib/trpc/routers/api/delete.ts | 5 +- .../routers/api/updateDeleteProtection.ts | 5 +- .../lib/trpc/routers/api/updateIpWhitelist.ts | 5 +- .../lib/trpc/routers/api/updateName.ts | 6 +-- .../lib/trpc/routers/gateway/create.ts | 5 +- apps/dashboard/lib/trpc/routers/key/create.ts | 5 +- .../lib/trpc/routers/key/createRootKey.ts | 6 +-- apps/dashboard/lib/trpc/routers/key/delete.ts | 5 +- .../lib/trpc/routers/key/deleteRootKey.ts | 7 ++- .../lib/trpc/routers/key/updateEnabled.ts | 5 +- .../lib/trpc/routers/key/updateExpiration.ts | 5 +- .../lib/trpc/routers/key/updateMetadata.ts | 5 +- .../lib/trpc/routers/key/updateName.ts | 3 +- .../lib/trpc/routers/key/updateOwnerId.ts | 4 +- .../lib/trpc/routers/key/updateRatelimit.ts | 5 +- .../lib/trpc/routers/key/updateRemaining.ts | 5 +- .../lib/trpc/routers/llmGateway/create.ts | 5 +- .../lib/trpc/routers/llmGateway/delete.ts | 5 +- .../routers/monitor/verification/create.ts | 5 +- apps/dashboard/lib/trpc/routers/plain.ts | 5 +- .../trpc/routers/ratelimit/createNamespace.ts | 5 +- .../trpc/routers/ratelimit/createOverride.ts | 5 +- .../trpc/routers/ratelimit/deleteNamespace.ts | 5 +- .../trpc/routers/ratelimit/deleteOverride.ts | 5 +- .../routers/ratelimit/updateNamespaceName.ts | 5 +- .../trpc/routers/ratelimit/updateOverride.ts | 5 +- apps/dashboard/lib/trpc/routers/rbac.ts | 40 ++++++---------- .../routers/rbac/addPermissionToRootKey.ts | 5 +- .../routers/rbac/connectPermissionToRole.ts | 5 +- .../lib/trpc/routers/rbac/connectRoleToKey.ts | 5 +- .../lib/trpc/routers/rbac/createPermission.ts | 5 +- .../lib/trpc/routers/rbac/createRole.ts | 5 +- .../lib/trpc/routers/rbac/deletePermission.ts | 5 +- .../lib/trpc/routers/rbac/deleteRole.ts | 5 +- .../rbac/disconnectPermissionFromRole.ts | 5 +- .../routers/rbac/disconnectRoleFromKey.ts | 5 +- .../rbac/removePermissionFromRootKey.ts | 5 +- .../lib/trpc/routers/rbac/updatePermission.ts | 5 +- .../lib/trpc/routers/rbac/updateRole.ts | 5 +- .../lib/trpc/routers/secrets/create.ts | 5 +- .../lib/trpc/routers/secrets/decrypt.ts | 5 +- .../lib/trpc/routers/secrets/update.ts | 5 +- .../lib/trpc/routers/webhook/create.ts | 5 +- .../lib/trpc/routers/webhook/delete.ts | 5 +- .../lib/trpc/routers/webhook/toggle.ts | 5 +- .../lib/trpc/routers/workspace/changeName.ts | 5 +- .../lib/trpc/routers/workspace/changePlan.ts | 5 +- .../lib/trpc/routers/workspace/create.ts | 5 +- .../lib/trpc/routers/workspace/optIntoBeta.ts | 5 +- apps/dashboard/lib/trpc/trpc.ts | 4 ++ 53 files changed, 174 insertions(+), 172 deletions(-) create mode 100644 apps/dashboard/lib/trpc/ratelimitProcedure.ts diff --git a/apps/dashboard/lib/env.ts b/apps/dashboard/lib/env.ts index 235e0f75f..259f629e5 100644 --- a/apps/dashboard/lib/env.ts +++ b/apps/dashboard/lib/env.ts @@ -31,6 +31,12 @@ export const env = () => AGENT_TOKEN: z.string(), GITHUB_KEYS_URI: z.string().optional(), + + // This key is used for ratelimiting our trpc procedures + // It requires the following permissions: + // - `ratelimit.*.create_namespace` + // - `ratelimit.*.limit` + UNKEY_ROOT_KEY: z.string().optional(), }) .parse(process.env); diff --git a/apps/dashboard/lib/trpc/ratelimitProcedure.ts b/apps/dashboard/lib/trpc/ratelimitProcedure.ts new file mode 100644 index 000000000..ae822ace2 --- /dev/null +++ b/apps/dashboard/lib/trpc/ratelimitProcedure.ts @@ -0,0 +1,48 @@ +import { TRPCError } from "@trpc/server"; +import { Ratelimit } from "@unkey/ratelimit"; +import { env } from "../env"; +// Values for route types +import { auth, protectedProcedure } from "./trpc"; + +export const ratelimit = env().UNKEY_ROOT_KEY + ? { + create: new Ratelimit({ + rootKey: env().UNKEY_ROOT_KEY ?? "", + namespace: "trpc_create", + limit: 5, + duration: "3s", + }), + + update: new Ratelimit({ + rootKey: env().UNKEY_ROOT_KEY ?? "", + namespace: "trpc_update", + limit: 25, + duration: "5s", + }), + delete: new Ratelimit({ + rootKey: env().UNKEY_ROOT_KEY ?? "", + namespace: "trpc_delete", + limit: 5, + duration: "5s", + }), + } + : {}; +export const rateLimitedProcedure = (ratelimit: Ratelimit | undefined) => + ratelimit + ? protectedProcedure.use(async (opts) => { + const response = await ratelimit.limit(opts.ctx.user.id); + + if (!response.success) { + throw new TRPCError({ + code: "TOO_MANY_REQUESTS", + message: "Too many requests in the allowed duration. Please try again", + }); + } + + return opts.next({ + ctx: { + ...opts.ctx, + }, + }); + }) + : protectedProcedure; diff --git a/apps/dashboard/lib/trpc/routers/api/create.ts b/apps/dashboard/lib/trpc/routers/api/create.ts index b14ba004c..6748756dd 100644 --- a/apps/dashboard/lib/trpc/routers/api/create.ts +++ b/apps/dashboard/lib/trpc/routers/api/create.ts @@ -3,16 +3,15 @@ import { z } from "zod"; import { db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { newId } from "@unkey/id"; -import { auth, t } from "../../trpc"; -export const createApi = t.procedure - .use(auth) +export const createApi = rateLimitedProcedure(ratelimit.create) .input( z.object({ name: z .string() - .min(1, "workspace names must contain at least 3 characters") + .min(3, "workspace names must contain at least 3 characters") .max(50, "workspace names must contain at most 50 characters"), }), ) diff --git a/apps/dashboard/lib/trpc/routers/api/delete.ts b/apps/dashboard/lib/trpc/routers/api/delete.ts index dd325e15e..93f0d4ac0 100644 --- a/apps/dashboard/lib/trpc/routers/api/delete.ts +++ b/apps/dashboard/lib/trpc/routers/api/delete.ts @@ -3,10 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const deleteApi = t.procedure - .use(auth) +export const deleteApi = rateLimitedProcedure(ratelimit.delete) .input( z.object({ apiId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/api/updateDeleteProtection.ts b/apps/dashboard/lib/trpc/routers/api/updateDeleteProtection.ts index 12781ce71..e3f48f50f 100644 --- a/apps/dashboard/lib/trpc/routers/api/updateDeleteProtection.ts +++ b/apps/dashboard/lib/trpc/routers/api/updateDeleteProtection.ts @@ -3,10 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const updateAPIDeleteProtection = t.procedure - .use(auth) +export const updateAPIDeleteProtection = rateLimitedProcedure(ratelimit.update) .input( z.object({ apiId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/api/updateIpWhitelist.ts b/apps/dashboard/lib/trpc/routers/api/updateIpWhitelist.ts index 1c679ba2e..ad746d178 100644 --- a/apps/dashboard/lib/trpc/routers/api/updateIpWhitelist.ts +++ b/apps/dashboard/lib/trpc/routers/api/updateIpWhitelist.ts @@ -3,10 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const updateApiIpWhitelist = t.procedure - .use(auth) +export const updateApiIpWhitelist = rateLimitedProcedure(ratelimit.update) .input( z.object({ ipWhitelist: z diff --git a/apps/dashboard/lib/trpc/routers/api/updateName.ts b/apps/dashboard/lib/trpc/routers/api/updateName.ts index 37352acb2..7d6c85ba9 100644 --- a/apps/dashboard/lib/trpc/routers/api/updateName.ts +++ b/apps/dashboard/lib/trpc/routers/api/updateName.ts @@ -3,11 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { th } from "@faker-js/faker"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const updateApiName = t.procedure - .use(auth) +export const updateApiName = rateLimitedProcedure(ratelimit.update) .input( z.object({ name: z.string().min(3, "API names must contain at least 3 characters"), diff --git a/apps/dashboard/lib/trpc/routers/gateway/create.ts b/apps/dashboard/lib/trpc/routers/gateway/create.ts index 6a4bb304e..f714ff15e 100644 --- a/apps/dashboard/lib/trpc/routers/gateway/create.ts +++ b/apps/dashboard/lib/trpc/routers/gateway/create.ts @@ -1,11 +1,10 @@ import { db } from "@/lib/db"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { newId } from "@unkey/id"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const createGateway = t.procedure - .use(auth) +export const createGateway = rateLimitedProcedure(ratelimit.create) .input( z.object({ subdomain: z diff --git a/apps/dashboard/lib/trpc/routers/key/create.ts b/apps/dashboard/lib/trpc/routers/key/create.ts index fd1b4b0be..5c5c34a66 100644 --- a/apps/dashboard/lib/trpc/routers/key/create.ts +++ b/apps/dashboard/lib/trpc/routers/key/create.ts @@ -1,13 +1,12 @@ import { db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { newId } from "@unkey/id"; import { newKey } from "@unkey/keys"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const createKey = t.procedure - .use(auth) +export const createKey = rateLimitedProcedure(ratelimit.create) .input( z.object({ prefix: z.string().optional(), diff --git a/apps/dashboard/lib/trpc/routers/key/createRootKey.ts b/apps/dashboard/lib/trpc/routers/key/createRootKey.ts index f6aaa08a9..4f23f3dbc 100644 --- a/apps/dashboard/lib/trpc/routers/key/createRootKey.ts +++ b/apps/dashboard/lib/trpc/routers/key/createRootKey.ts @@ -1,16 +1,16 @@ import { type Permission, db, eq, schema } from "@/lib/db"; import { env } from "@/lib/env"; import { type UnkeyAuditLog, ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { newId } from "@unkey/id"; import { newKey } from "@unkey/keys"; import { unkeyPermissionValidation } from "@unkey/rbac"; import { z } from "zod"; -import { auth, t } from "../../trpc"; + import { upsertPermissions } from "../rbac"; -export const createRootKey = t.procedure - .use(auth) +export const createRootKey = rateLimitedProcedure(ratelimit.create) .input( z.object({ name: z.string().optional(), diff --git a/apps/dashboard/lib/trpc/routers/key/delete.ts b/apps/dashboard/lib/trpc/routers/key/delete.ts index 716e41525..51348260d 100644 --- a/apps/dashboard/lib/trpc/routers/key/delete.ts +++ b/apps/dashboard/lib/trpc/routers/key/delete.ts @@ -1,11 +1,10 @@ import { and, db, eq, inArray, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const deleteKeys = t.procedure - .use(auth) +export const deleteKeys = rateLimitedProcedure(ratelimit.delete) .input( z.object({ keyIds: z.array(z.string()), diff --git a/apps/dashboard/lib/trpc/routers/key/deleteRootKey.ts b/apps/dashboard/lib/trpc/routers/key/deleteRootKey.ts index b8317c20a..1c08336b1 100644 --- a/apps/dashboard/lib/trpc/routers/key/deleteRootKey.ts +++ b/apps/dashboard/lib/trpc/routers/key/deleteRootKey.ts @@ -1,12 +1,11 @@ -import { and, db, eq, inArray, isNotNull, schema } from "@/lib/db"; +import { db, inArray, schema } from "@/lib/db"; import { env } from "@/lib/env"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const deleteRootKeys = t.procedure - .use(auth) +export const deleteRootKeys = rateLimitedProcedure(ratelimit.delete) .input( z.object({ keyIds: z.array(z.string()), diff --git a/apps/dashboard/lib/trpc/routers/key/updateEnabled.ts b/apps/dashboard/lib/trpc/routers/key/updateEnabled.ts index d5b002920..b14bfe94c 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateEnabled.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateEnabled.ts @@ -1,11 +1,10 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const updateKeyEnabled = t.procedure - .use(auth) +export const updateKeyEnabled = rateLimitedProcedure(ratelimit.update) .input( z.object({ keyId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/key/updateExpiration.ts b/apps/dashboard/lib/trpc/routers/key/updateExpiration.ts index 507a68c5b..7886b4731 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateExpiration.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateExpiration.ts @@ -1,11 +1,10 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const updateKeyExpiration = t.procedure - .use(auth) +export const updateKeyExpiration = rateLimitedProcedure(ratelimit.update) .input( z.object({ keyId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/key/updateMetadata.ts b/apps/dashboard/lib/trpc/routers/key/updateMetadata.ts index 9edee16c9..4bc208d5f 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateMetadata.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateMetadata.ts @@ -1,11 +1,10 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const updateKeyMetadata = t.procedure - .use(auth) +export const updateKeyMetadata = rateLimitedProcedure(ratelimit.update) .input( z.object({ keyId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/key/updateName.ts b/apps/dashboard/lib/trpc/routers/key/updateName.ts index 9fc6b1141..0929d7d8d 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateName.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateName.ts @@ -1,10 +1,11 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; import { auth, t } from "../../trpc"; -export const updateKeyName = t.procedure +export const updateKeyName = rateLimitedProcedure(ratelimit.update) .use(auth) .input( z.object({ diff --git a/apps/dashboard/lib/trpc/routers/key/updateOwnerId.ts b/apps/dashboard/lib/trpc/routers/key/updateOwnerId.ts index 8d78aa50f..2745763dc 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateOwnerId.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateOwnerId.ts @@ -1,11 +1,11 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; import { auth, t } from "../../trpc"; -export const updateKeyOwnerId = t.procedure - .use(auth) +export const updateKeyOwnerId = rateLimitedProcedure(ratelimit.update) .input( z.object({ keyId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/key/updateRatelimit.ts b/apps/dashboard/lib/trpc/routers/key/updateRatelimit.ts index e409a247c..b02b61d59 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateRatelimit.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateRatelimit.ts @@ -1,11 +1,10 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const updateKeyRatelimit = t.procedure - .use(auth) +export const updateKeyRatelimit = rateLimitedProcedure(ratelimit.update) .input( z.object({ keyId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/key/updateRemaining.ts b/apps/dashboard/lib/trpc/routers/key/updateRemaining.ts index 53dd7dec1..6aecf1365 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateRemaining.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateRemaining.ts @@ -1,11 +1,10 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const updateKeyRemaining = t.procedure - .use(auth) +export const updateKeyRemaining = rateLimitedProcedure(ratelimit.update) .input( z.object({ keyId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/llmGateway/create.ts b/apps/dashboard/lib/trpc/routers/llmGateway/create.ts index 5ce844376..eb2ee39c8 100644 --- a/apps/dashboard/lib/trpc/routers/llmGateway/create.ts +++ b/apps/dashboard/lib/trpc/routers/llmGateway/create.ts @@ -1,13 +1,12 @@ import { db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { DatabaseError } from "@planetscale/database"; import { TRPCError } from "@trpc/server"; import { newId } from "@unkey/id"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const createLlmGateway = t.procedure - .use(auth) +export const createLlmGateway = rateLimitedProcedure(ratelimit.create) .input( z.object({ subdomain: z.string().min(1).max(50), diff --git a/apps/dashboard/lib/trpc/routers/llmGateway/delete.ts b/apps/dashboard/lib/trpc/routers/llmGateway/delete.ts index 0a64a2b2a..3a1fec218 100644 --- a/apps/dashboard/lib/trpc/routers/llmGateway/delete.ts +++ b/apps/dashboard/lib/trpc/routers/llmGateway/delete.ts @@ -3,10 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const deleteLlmGateway = t.procedure - .use(auth) +export const deleteLlmGateway = rateLimitedProcedure(ratelimit.delete) .input(z.object({ gatewayId: z.string() })) .mutation(async ({ ctx, input }) => { const llmGateway = await db.query.llmGateways.findFirst({ diff --git a/apps/dashboard/lib/trpc/routers/monitor/verification/create.ts b/apps/dashboard/lib/trpc/routers/monitor/verification/create.ts index 6d8fe8572..b66754a1e 100644 --- a/apps/dashboard/lib/trpc/routers/monitor/verification/create.ts +++ b/apps/dashboard/lib/trpc/routers/monitor/verification/create.ts @@ -1,13 +1,12 @@ import { type Webhook, db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError, createCallerFactory } from "@trpc/server"; import { newId } from "@unkey/id"; import { z } from "zod"; import { router } from "../.."; -import { auth, t } from "../../../trpc"; -export const createVerificationMonitor = t.procedure - .use(auth) +export const createVerificationMonitor = rateLimitedProcedure(ratelimit.create) .input( z.object({ interval: z diff --git a/apps/dashboard/lib/trpc/routers/plain.ts b/apps/dashboard/lib/trpc/routers/plain.ts index 6604d1905..d98f4c846 100644 --- a/apps/dashboard/lib/trpc/routers/plain.ts +++ b/apps/dashboard/lib/trpc/routers/plain.ts @@ -1,14 +1,13 @@ import { env } from "@/lib/env"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { clerkClient } from "@clerk/nextjs"; import { PlainClient, uiComponent } from "@team-plain/typescript-sdk"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../trpc"; const issueType = z.enum(["bug", "feature", "security", "question", "payment"]); const severity = z.enum(["p0", "p1", "p2", "p3"]); -export const createPlainIssue = t.procedure - .use(auth) +export const createPlainIssue = rateLimitedProcedure(ratelimit.create) .input( z.object({ issueType, diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts b/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts index c6d0107e3..6438b49a1 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts @@ -3,12 +3,11 @@ import { z } from "zod"; import { db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { DatabaseError } from "@planetscale/database"; import { newId } from "@unkey/id"; -import { auth, t } from "../../trpc"; -export const createNamespace = t.procedure - .use(auth) +export const createNamespace = rateLimitedProcedure(ratelimit.create) .input( z.object({ name: z.string().min(1).max(50), diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts b/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts index c9435743d..69ce306c6 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts @@ -3,11 +3,10 @@ import { z } from "zod"; import { and, db, eq, isNull, schema, sql } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { newId } from "@unkey/id"; -import { auth, t } from "../../trpc"; -export const createOverride = t.procedure - .use(auth) +export const createOverride = rateLimitedProcedure(ratelimit.create) .input( z.object({ namespaceId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/deleteNamespace.ts b/apps/dashboard/lib/trpc/routers/ratelimit/deleteNamespace.ts index 8fe135ce4..8c939c034 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/deleteNamespace.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/deleteNamespace.ts @@ -3,10 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const deleteNamespace = t.procedure - .use(auth) +export const deleteNamespace = rateLimitedProcedure(ratelimit.delete) .input( z.object({ namespaceId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/deleteOverride.ts b/apps/dashboard/lib/trpc/routers/ratelimit/deleteOverride.ts index 15aeb8a83..1698fdc2a 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/deleteOverride.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/deleteOverride.ts @@ -3,10 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const deleteOverride = t.procedure - .use(auth) +export const deleteOverride = rateLimitedProcedure(ratelimit.create) .input( z.object({ id: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/updateNamespaceName.ts b/apps/dashboard/lib/trpc/routers/ratelimit/updateNamespaceName.ts index 6573fdad6..703a09085 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/updateNamespaceName.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/updateNamespaceName.ts @@ -3,10 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const updateNamespaceName = t.procedure - .use(auth) +export const updateNamespaceName = rateLimitedProcedure(ratelimit.update) .input( z.object({ name: z.string().min(3, "namespace names must contain at least 3 characters"), diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts b/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts index 03cc5b8cb..c2f3f23cd 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts @@ -3,10 +3,9 @@ import { z } from "zod"; import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; -import { auth, t } from "../../trpc"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; -export const updateOverride = t.procedure - .use(auth) +export const updateOverride = rateLimitedProcedure(ratelimit.update) .input( z.object({ id: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac.ts b/apps/dashboard/lib/trpc/routers/rbac.ts index e34303147..6e6b1980c 100644 --- a/apps/dashboard/lib/trpc/routers/rbac.ts +++ b/apps/dashboard/lib/trpc/routers/rbac.ts @@ -1,11 +1,13 @@ import { type Permission, and, db, eq, schema } from "@/lib/db"; + import { type UnkeyAuditLog, ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { newId } from "@unkey/id"; import { unkeyPermissionValidation } from "@unkey/rbac"; import { z } from "zod"; import type { Context } from "../context"; -import { auth, t } from "../trpc"; +import { t } from "../trpc"; const nameSchema = z .string() @@ -16,8 +18,7 @@ const nameSchema = z }); export const rbacRouter = t.router({ - addPermissionToRootKey: t.procedure - .use(auth) + addPermissionToRootKey: rateLimitedProcedure(ratelimit.update) .input( z.object({ rootKeyId: z.string(), @@ -75,8 +76,7 @@ export const rbacRouter = t.router({ .onDuplicateKeyUpdate({ set: { permissionId: permissions[0].id } }); await ingestAuditLogs(auditLogs); }), - removePermissionFromRootKey: t.procedure - .use(auth) + removePermissionFromRootKey: rateLimitedProcedure(ratelimit.update) .input( z.object({ rootKeyId: z.string(), @@ -133,8 +133,7 @@ export const rbacRouter = t.router({ ), ); }), - connectPermissionToRole: t.procedure - .use(auth) + connectPermissionToRole: rateLimitedProcedure(ratelimit.update) .input( z.object({ roleId: z.string(), @@ -187,8 +186,7 @@ export const rbacRouter = t.router({ set: { ...tuple, updatedAt: new Date() }, }); }), - disconnectPermissionToRole: t.procedure - .use(auth) + disconnectPermissionToRole: rateLimitedProcedure(ratelimit.update) .input( z.object({ roleId: z.string(), @@ -216,8 +214,7 @@ export const rbacRouter = t.router({ ), ); }), - connectRoleToKey: t.procedure - .use(auth) + connectRoleToKey: rateLimitedProcedure(ratelimit.update) .input( z.object({ roleId: z.string(), @@ -270,8 +267,7 @@ export const rbacRouter = t.router({ set: { ...tuple, updatedAt: new Date() }, }); }), - disconnectRoleFromKey: t.procedure - .use(auth) + disconnectRoleFromKey: rateLimitedProcedure(ratelimit.update) .input( z.object({ roleId: z.string(), @@ -299,8 +295,7 @@ export const rbacRouter = t.router({ ), ); }), - createRole: t.procedure - .use(auth) + createRole: rateLimitedProcedure(ratelimit.create) .input( z.object({ name: nameSchema, @@ -382,8 +377,7 @@ export const rbacRouter = t.router({ } return { roleId }; }), - updateRole: t.procedure - .use(auth) + updateRole: rateLimitedProcedure(ratelimit.update) .input( z.object({ id: z.string(), @@ -416,8 +410,7 @@ export const rbacRouter = t.router({ } await db.update(schema.roles).set(input).where(eq(schema.roles.id, input.id)); }), - deleteRole: t.procedure - .use(auth) + deleteRole: rateLimitedProcedure(ratelimit.delete) .input( z.object({ roleId: z.string(), @@ -450,8 +443,7 @@ export const rbacRouter = t.router({ .delete(schema.roles) .where(and(eq(schema.roles.id, input.roleId), eq(schema.roles.workspaceId, workspace.id))); }), - createPermission: t.procedure - .use(auth) + createPermission: rateLimitedProcedure(ratelimit.create) .input( z.object({ name: nameSchema, @@ -500,8 +492,7 @@ export const rbacRouter = t.router({ return { permissionId }; }), - updatePermission: t.procedure - .use(auth) + updatePermission: rateLimitedProcedure(ratelimit.update) .input( z.object({ id: z.string(), @@ -541,8 +532,7 @@ export const rbacRouter = t.router({ }) .where(eq(schema.permissions.id, input.id)); }), - deletePermission: t.procedure - .use(auth) + deletePermission: rateLimitedProcedure(ratelimit.delete) .input( z.object({ permissionId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/addPermissionToRootKey.ts b/apps/dashboard/lib/trpc/routers/rbac/addPermissionToRootKey.ts index 2ff9505a4..f08810b0f 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/addPermissionToRootKey.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/addPermissionToRootKey.ts @@ -1,13 +1,12 @@ import { db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { unkeyPermissionValidation } from "@unkey/rbac"; import { z } from "zod"; -import { auth, t } from "../../trpc"; import { upsertPermissions } from "../rbac"; -export const addPermissionToRootKey = t.procedure - .use(auth) +export const addPermissionToRootKey = rateLimitedProcedure(ratelimit.create) .input( z.object({ rootKeyId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/connectPermissionToRole.ts b/apps/dashboard/lib/trpc/routers/rbac/connectPermissionToRole.ts index 5aaee899c..abad5c9dc 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/connectPermissionToRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/connectPermissionToRole.ts @@ -1,10 +1,9 @@ import { db, schema } from "@/lib/db"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const connectPermissionToRole = t.procedure - .use(auth) +export const connectPermissionToRole = rateLimitedProcedure(ratelimit.update) .input( z.object({ roleId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/connectRoleToKey.ts b/apps/dashboard/lib/trpc/routers/rbac/connectRoleToKey.ts index b73ad212c..a7997ac33 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/connectRoleToKey.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/connectRoleToKey.ts @@ -1,11 +1,10 @@ import { db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const connectRoleToKey = t.procedure - .use(auth) +export const connectRoleToKey = rateLimitedProcedure(ratelimit.update) .input( z.object({ roleId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/createPermission.ts b/apps/dashboard/lib/trpc/routers/rbac/createPermission.ts index 712296712..809f35d96 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/createPermission.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/createPermission.ts @@ -1,9 +1,9 @@ import { db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { newId } from "@unkey/id"; import { z } from "zod"; -import { auth, t } from "../../trpc"; const nameSchema = z .string() @@ -13,8 +13,7 @@ const nameSchema = z "Must be at least 3 characters long and only contain alphanumeric, colons, periods, dashes and underscores", }); -export const createPermission = t.procedure - .use(auth) +export const createPermission = rateLimitedProcedure(ratelimit.create) .input( z.object({ name: nameSchema, diff --git a/apps/dashboard/lib/trpc/routers/rbac/createRole.ts b/apps/dashboard/lib/trpc/routers/rbac/createRole.ts index 58641c741..e30504ea8 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/createRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/createRole.ts @@ -1,9 +1,9 @@ import { db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { newId } from "@unkey/id"; import { z } from "zod"; -import { auth, t } from "../../trpc"; const nameSchema = z .string() @@ -13,8 +13,7 @@ const nameSchema = z "Must be at least 3 characters long and only contain alphanumeric, colons, periods, dashes and underscores", }); -export const createRole = t.procedure - .use(auth) +export const createRole = rateLimitedProcedure(ratelimit.create) .input( z.object({ name: nameSchema, diff --git a/apps/dashboard/lib/trpc/routers/rbac/deletePermission.ts b/apps/dashboard/lib/trpc/routers/rbac/deletePermission.ts index 3d5630cd9..b3293c7d3 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/deletePermission.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/deletePermission.ts @@ -1,11 +1,10 @@ import { and, db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const deletePermission = t.procedure - .use(auth) +export const deletePermission = rateLimitedProcedure(ratelimit.delete) .input( z.object({ permissionId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/deleteRole.ts b/apps/dashboard/lib/trpc/routers/rbac/deleteRole.ts index 76f683076..ec4023640 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/deleteRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/deleteRole.ts @@ -1,11 +1,10 @@ import { and, db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const deleteRole = t.procedure - .use(auth) +export const deleteRole = rateLimitedProcedure(ratelimit.delete) .input( z.object({ roleId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/disconnectPermissionFromRole.ts b/apps/dashboard/lib/trpc/routers/rbac/disconnectPermissionFromRole.ts index d9e1156ad..259611143 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/disconnectPermissionFromRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/disconnectPermissionFromRole.ts @@ -1,11 +1,10 @@ import { and, db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const disconnectPermissionFromRole = t.procedure - .use(auth) +export const disconnectPermissionFromRole = rateLimitedProcedure(ratelimit.update) .input( z.object({ roleId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/disconnectRoleFromKey.ts b/apps/dashboard/lib/trpc/routers/rbac/disconnectRoleFromKey.ts index 36ec64055..1d27092af 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/disconnectRoleFromKey.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/disconnectRoleFromKey.ts @@ -1,11 +1,10 @@ import { and, db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const disconnectRoleFromKey = t.procedure - .use(auth) +export const disconnectRoleFromKey = rateLimitedProcedure(ratelimit.update) .input( z.object({ roleId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/removePermissionFromRootKey.ts b/apps/dashboard/lib/trpc/routers/rbac/removePermissionFromRootKey.ts index 467ddc673..6628d1daf 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/removePermissionFromRootKey.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/removePermissionFromRootKey.ts @@ -1,11 +1,10 @@ import { and, db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const removePermissionFromRootKey = t.procedure - .use(auth) +export const removePermissionFromRootKey = rateLimitedProcedure(ratelimit.update) .input( z.object({ rootKeyId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/updatePermission.ts b/apps/dashboard/lib/trpc/routers/rbac/updatePermission.ts index 79c807749..db19d599d 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/updatePermission.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/updatePermission.ts @@ -1,8 +1,8 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; const nameSchema = z .string() @@ -12,8 +12,7 @@ const nameSchema = z "Must be at least 3 characters long and only contain alphanumeric, colons, periods, dashes and underscores", }); -export const updatePermission = t.procedure - .use(auth) +export const updatePermission = rateLimitedProcedure(ratelimit.update) .input( z.object({ id: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/rbac/updateRole.ts b/apps/dashboard/lib/trpc/routers/rbac/updateRole.ts index 95fb7ac02..89fc88014 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/updateRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/updateRole.ts @@ -1,8 +1,8 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; const nameSchema = z .string() @@ -12,8 +12,7 @@ const nameSchema = z "Must be at least 3 characters long and only contain alphanumeric, colons, periods, dashes and underscores", }); -export const updateRole = t.procedure - .use(auth) +export const updateRole = rateLimitedProcedure(ratelimit.update) .input( z.object({ id: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/secrets/create.ts b/apps/dashboard/lib/trpc/routers/secrets/create.ts index b818e319b..750fd1fc1 100644 --- a/apps/dashboard/lib/trpc/routers/secrets/create.ts +++ b/apps/dashboard/lib/trpc/routers/secrets/create.ts @@ -1,15 +1,14 @@ import { db, schema } from "@/lib/db"; import { env } from "@/lib/env"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { DatabaseError } from "@planetscale/database"; import { TRPCError } from "@trpc/server"; import { AesGCM } from "@unkey/encryption"; import { newId } from "@unkey/id"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const createSecret = t.procedure - .use(auth) +export const createSecret = rateLimitedProcedure(ratelimit.create) .input( z.object({ name: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/secrets/decrypt.ts b/apps/dashboard/lib/trpc/routers/secrets/decrypt.ts index 90f726cec..d50861674 100644 --- a/apps/dashboard/lib/trpc/routers/secrets/decrypt.ts +++ b/apps/dashboard/lib/trpc/routers/secrets/decrypt.ts @@ -1,11 +1,10 @@ import { db } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const decryptSecret = t.procedure - .use(auth) +export const decryptSecret = rateLimitedProcedure(ratelimit.update) .input( z.object({ secretId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/secrets/update.ts b/apps/dashboard/lib/trpc/routers/secrets/update.ts index d0bf065a6..f93d89993 100644 --- a/apps/dashboard/lib/trpc/routers/secrets/update.ts +++ b/apps/dashboard/lib/trpc/routers/secrets/update.ts @@ -1,12 +1,11 @@ import { type Secret, db, eq, schema } from "@/lib/db"; import { env } from "@/lib/env"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const updateSecret = t.procedure - .use(auth) +export const updateSecret = rateLimitedProcedure(ratelimit.update) .input( z.object({ secretId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/webhook/create.ts b/apps/dashboard/lib/trpc/routers/webhook/create.ts index 97a5569a0..50b59f757 100644 --- a/apps/dashboard/lib/trpc/routers/webhook/create.ts +++ b/apps/dashboard/lib/trpc/routers/webhook/create.ts @@ -1,16 +1,15 @@ import { db, schema } from "@/lib/db"; import { env } from "@/lib/env"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { AesGCM } from "@unkey/encryption"; import { sha256 } from "@unkey/hash"; import { newId } from "@unkey/id"; import { KeyV1, newKey } from "@unkey/keys"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const createWebhook = t.procedure - .use(auth) +export const createWebhook = rateLimitedProcedure(ratelimit.create) .input( z.object({ destination: z.string().url(), diff --git a/apps/dashboard/lib/trpc/routers/webhook/delete.ts b/apps/dashboard/lib/trpc/routers/webhook/delete.ts index 6bb16353c..3f9c303d4 100644 --- a/apps/dashboard/lib/trpc/routers/webhook/delete.ts +++ b/apps/dashboard/lib/trpc/routers/webhook/delete.ts @@ -1,11 +1,10 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const deleteWebhook = t.procedure - .use(auth) +export const deleteWebhook = rateLimitedProcedure(ratelimit.delete) .input( z.object({ webhookId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/webhook/toggle.ts b/apps/dashboard/lib/trpc/routers/webhook/toggle.ts index e17eedf0d..164bb288a 100644 --- a/apps/dashboard/lib/trpc/routers/webhook/toggle.ts +++ b/apps/dashboard/lib/trpc/routers/webhook/toggle.ts @@ -1,11 +1,10 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const toggleWebhook = t.procedure - .use(auth) +export const toggleWebhook = rateLimitedProcedure(ratelimit.update) .input( z.object({ webhookId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/workspace/changeName.ts b/apps/dashboard/lib/trpc/routers/workspace/changeName.ts index 2b2806f2d..577762c25 100644 --- a/apps/dashboard/lib/trpc/routers/workspace/changeName.ts +++ b/apps/dashboard/lib/trpc/routers/workspace/changeName.ts @@ -1,12 +1,11 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { clerkClient } from "@clerk/nextjs"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const changeWorkspaceName = t.procedure - .use(auth) +export const changeWorkspaceName = rateLimitedProcedure(ratelimit.update) .input( z.object({ name: z.string().min(3, "workspace names must contain at least 3 characters"), diff --git a/apps/dashboard/lib/trpc/routers/workspace/changePlan.ts b/apps/dashboard/lib/trpc/routers/workspace/changePlan.ts index 2ecc60250..2f6303e46 100644 --- a/apps/dashboard/lib/trpc/routers/workspace/changePlan.ts +++ b/apps/dashboard/lib/trpc/routers/workspace/changePlan.ts @@ -1,14 +1,13 @@ import { db, eq, schema } from "@/lib/db"; import { stripeEnv } from "@/lib/env"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { defaultProSubscriptions } from "@unkey/billing"; import Stripe from "stripe"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const changeWorkspacePlan = t.procedure - .use(auth) +export const changeWorkspacePlan = rateLimitedProcedure(ratelimit.update) .input( z.object({ workspaceId: z.string(), diff --git a/apps/dashboard/lib/trpc/routers/workspace/create.ts b/apps/dashboard/lib/trpc/routers/workspace/create.ts index 741a402e6..f12562fed 100644 --- a/apps/dashboard/lib/trpc/routers/workspace/create.ts +++ b/apps/dashboard/lib/trpc/routers/workspace/create.ts @@ -1,14 +1,13 @@ import { type Workspace, db, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { clerkClient } from "@clerk/nextjs"; import { TRPCError } from "@trpc/server"; import { defaultProSubscriptions } from "@unkey/billing"; import { newId } from "@unkey/id"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const createWorkspace = t.procedure - .use(auth) +export const createWorkspace = rateLimitedProcedure(ratelimit.create) .input( z.object({ name: z.string().min(1).max(50), diff --git a/apps/dashboard/lib/trpc/routers/workspace/optIntoBeta.ts b/apps/dashboard/lib/trpc/routers/workspace/optIntoBeta.ts index 19296d7d2..7ffa2b6ae 100644 --- a/apps/dashboard/lib/trpc/routers/workspace/optIntoBeta.ts +++ b/apps/dashboard/lib/trpc/routers/workspace/optIntoBeta.ts @@ -1,11 +1,10 @@ import { db, eq, schema } from "@/lib/db"; import { ingestAuditLogs } from "@/lib/tinybird"; +import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { auth, t } from "../../trpc"; -export const optWorkspaceIntoBeta = t.procedure - .use(auth) +export const optWorkspaceIntoBeta = rateLimitedProcedure(ratelimit.update) .input( z.object({ feature: z.enum(["rbac", "ratelimit", "identities"]), diff --git a/apps/dashboard/lib/trpc/trpc.ts b/apps/dashboard/lib/trpc/trpc.ts index 33a4eefac..2191cdd76 100644 --- a/apps/dashboard/lib/trpc/trpc.ts +++ b/apps/dashboard/lib/trpc/trpc.ts @@ -1,6 +1,8 @@ import { TRPCError, initTRPC } from "@trpc/server"; import superjson from "superjson"; +import { Ratelimit } from "@unkey/ratelimit"; +import { env } from "../env"; import type { Context } from "./context"; export const t = initTRPC.context().create({ transformer: superjson }); @@ -17,3 +19,5 @@ export const auth = t.middleware(({ next, ctx }) => { }, }); }); + +export const protectedProcedure = t.procedure.use(auth); From 071f46133dff3faa1eb11e1ab8d07c9794069c70 Mon Sep 17 00:00:00 2001 From: Andreas Thomas Date: Thu, 19 Sep 2024 09:19:24 +0200 Subject: [PATCH 5/7] chore: lint issues (#2093) --- apps/agent/.golangci.yaml | 140 +++++++++--------- apps/agent/Taskfile.yml | 2 +- apps/agent/cmd/agent/agent.go | 36 +++-- .../update_identity_with_many_keys_test.go | 14 +- apps/agent/pkg/api/agent_auth.go | 15 +- apps/agent/pkg/api/ctxutil/context.go | 6 +- apps/agent/pkg/api/routes/openapi/handler.go | 6 +- apps/agent/pkg/api/routes/sender.go | 16 +- apps/agent/pkg/api/validation/validator.go | 14 -- apps/agent/pkg/circuitbreaker/lib_test.go | 3 +- apps/agent/pkg/clickhouse/flush.go | 2 +- apps/agent/pkg/clickhouse/noop.go | 4 +- apps/agent/pkg/config/json.go | 6 +- apps/agent/pkg/logging/logger.go | 4 +- apps/agent/pkg/metrics/interface.go | 6 +- apps/agent/pkg/util/retry.go | 5 +- apps/agent/services/eventrouter/service.go | 42 ++++-- apps/agent/services/ratelimit/ratelimit.go | 7 +- .../ratelimit/ratelimit_mitigation_test.go | 12 +- .../services/ratelimit/ratelimit_test.go | 12 +- .../vault/integration/migrate_deks_test.go | 10 +- 21 files changed, 193 insertions(+), 169 deletions(-) diff --git a/apps/agent/.golangci.yaml b/apps/agent/.golangci.yaml index 8f2000f33..06811743b 100644 --- a/apps/agent/.golangci.yaml +++ b/apps/agent/.golangci.yaml @@ -213,79 +213,78 @@ linters-settings: linters: disable-all: true enable: - ## enabled by default - errcheck # checking for unchecked errors, these unchecked errors can be critical bugs in some cases - gosimple # specializes in simplifying a code - govet # reports suspicious constructs, such as Printf calls whose arguments do not align with the format string - - ineffassign # detects when assignments to existing variables are not used - - staticcheck # is a go vet on steroids, applying a ton of static analysis checks - - typecheck # like the front-end of a Go compiler, parses and type-checks Go code - - unused # checks for unused constants, variables, functions and types - ## disabled by default - - asasalint # checks for pass []any as any in variadic func(...any) - - asciicheck # checks that your code does not contain non-ASCII identifiers - - bidichk # checks for dangerous unicode character sequences - - bodyclose # checks whether HTTP response body is closed successfully - - canonicalheader # checks whether net/http.Header uses canonical header - - copyloopvar # detects places where loop variables are copied - - cyclop # checks function and package cyclomatic complexity - - dupl # tool for code clone detection - - durationcheck # checks for two durations multiplied together - - errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error - - errorlint # finds code that will cause problems with the error wrapping scheme introduced in Go 1.13 - - exhaustive # checks exhaustiveness of enum switch statements - - exportloopref # checks for pointers to enclosing loop variables - - fatcontext # detects nested contexts in loops - # - forbidigo # forbids identifiers - - funlen # tool for detection of long functions - - gocheckcompilerdirectives # validates go compiler directive comments (//go:) - - gochecknoglobals # checks that no global variables exist - - gochecknoinits # checks that no init functions are present in Go code - - gochecksumtype # checks exhaustiveness on Go "sum types" - - gocognit # computes and checks the cognitive complexity of functions - - goconst # finds repeated strings that could be replaced by a constant - - gocritic # provides diagnostics that check for bugs, performance and style issues - - gocyclo # computes and checks the cyclomatic complexity of functions - - godot # checks if comments end in a period - - goimports # in addition to fixing imports, goimports also formats your code in the same style as gofmt - - gomoddirectives # manages the use of 'replace', 'retract', and 'excludes' directives in go.mod - - gomodguard # allow and block lists linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations - - goprintffuncname # checks that printf-like functions are named with f at the end - - gosec # inspects source code for security problems - - intrange # finds places where for loops could make use of an integer range - - lll # reports long lines - - loggercheck # checks key value pairs for common logger libraries (kitlog,klog,logr,zap) - - makezero # finds slice declarations with non-zero initial length - - mirror # reports wrong mirror patterns of bytes/strings usage - - mnd # detects magic numbers - - musttag # enforces field tags in (un)marshaled structs - - nakedret # finds naked returns in functions greater than a specified function length - - nestif # reports deeply nested if statements - - nilerr # finds the code that returns nil even if it checks that the error is not nil - - nilnil # checks that there is no simultaneous return of nil error and an invalid value - - noctx # finds sending http request without context.Context - - nolintlint # reports ill-formed or insufficient nolint directives - - nosprintfhostport # checks for misuse of Sprintf to construct a host with port in a URL - - perfsprint # checks that fmt.Sprintf can be replaced with a faster alternative - - predeclared # finds code that shadows one of Go's predeclared identifiers - - promlinter # checks Prometheus metrics naming via promlint - - protogetter # reports direct reads from proto message fields when getters should be used - - reassign # checks that package variables are not reassigned - - revive # fast, configurable, extensible, flexible, and beautiful linter for Go, drop-in replacement of golint - - rowserrcheck # checks whether Err of rows is checked successfully - - sloglint # ensure consistent code style when using log/slog - - spancheck # checks for mistakes with OpenTelemetry/Census spans - - sqlclosecheck # checks that sql.Rows and sql.Stmt are closed - - stylecheck # is a replacement for golint - - tenv # detects using os.Setenv instead of t.Setenv since Go1.17 - - testableexamples # checks if examples are testable (have an expected output) - - testifylint # checks usage of github.com/stretchr/testify - - tparallel # detects inappropriate usage of t.Parallel() method in your Go test codes - - unconvert # removes unnecessary type conversions - - unparam # reports unused function parameters - - usestdlibvars # detects the possibility to use variables/constants from the Go standard library - - wastedassign # finds wasted assignment statements - - whitespace # detects leading and trailing whitespace + # - ineffassign # detects when assignments to existing variables are not used + # - staticcheck # is a go vet on steroids, applying a ton of static analysis checks + # - typecheck # like the front-end of a Go compiler, parses and type-checks Go code + # - unused # checks for unused constants, variables, functions and types + # - bodyclose # checks whether HTTP response body is closed successfully + # + # - asasalint # checks for pass []any as any in variadic func(...any) + # - asciicheck # checks that your code does not contain non-ASCII identifiers + # - bidichk # checks for dangerous unicode character sequences + # - canonicalheader # checks whether net/http.Header uses canonical header + # - copyloopvar # detects places where loop variables are copied + # - cyclop # checks function and package cyclomatic complexity + # - dupl # tool for code clone detection + # - durationcheck # checks for two durations multiplied together + # - errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error + # - errorlint # finds code that will cause problems with the error wrapping scheme introduced in Go 1.13 + # - exhaustive # checks exhaustiveness of enum switch statements + # - exportloopref # checks for pointers to enclosing loop variables + # - fatcontext # detects nested contexts in loops + # # - forbidigo # forbids identifiers + # - funlen # tool for detection of long functions + # - gocheckcompilerdirectives # validates go compiler directive comments (//go:) + # - gochecknoglobals # checks that no global variables exist + # # - gochecknoinits # checks that no init functions are present in Go code + # - gochecksumtype # checks exhaustiveness on Go "sum types" + # - gocognit # computes and checks the cognitive complexity of functions + # - goconst # finds repeated strings that could be replaced by a constant + # - gocritic # provides diagnostics that check for bugs, performance and style issues + # - gocyclo # computes and checks the cyclomatic complexity of functions + # - godot # checks if comments end in a period + # - goimports # in addition to fixing imports, goimports also formats your code in the same style as gofmt + # - gomoddirectives # manages the use of 'replace', 'retract', and 'excludes' directives in go.mod + # - gomodguard # allow and block lists linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations + # - goprintffuncname # checks that printf-like functions are named with f at the end + # - gosec # inspects source code for security problems + # - intrange # finds places where for loops could make use of an integer range + # - lll # reports long lines + # - loggercheck # checks key value pairs for common logger libraries (kitlog,klog,logr,zap) + # - makezero # finds slice declarations with non-zero initial length + # - mirror # reports wrong mirror patterns of bytes/strings usage + # - mnd # detects magic numbers + # - musttag # enforces field tags in (un)marshaled structs + # - nakedret # finds naked returns in functions greater than a specified function length + # - nestif # reports deeply nested if statements + # - nilerr # finds the code that returns nil even if it checks that the error is not nil + # - nilnil # checks that there is no simultaneous return of nil error and an invalid value + # - noctx # finds sending http request without context.Context + # - nolintlint # reports ill-formed or insufficient nolint directives + # - nosprintfhostport # checks for misuse of Sprintf to construct a host with port in a URL + # - perfsprint # checks that fmt.Sprintf can be replaced with a faster alternative + # - predeclared # finds code that shadows one of Go's predeclared identifiers + # - promlinter # checks Prometheus metrics naming via promlint + # - protogetter # reports direct reads from proto message fields when getters should be used + # - reassign # checks that package variables are not reassigned + # - revive # fast, configurable, extensible, flexible, and beautiful linter for Go, drop-in replacement of golint + # - rowserrcheck # checks whether Err of rows is checked successfully + # - sloglint # ensure consistent code style when using log/slog + # - spancheck # checks for mistakes with OpenTelemetry/Census spans + # - sqlclosecheck # checks that sql.Rows and sql.Stmt are closed + # - stylecheck # is a replacement for golint + # - tenv # detects using os.Setenv instead of t.Setenv since Go1.17 + # - testableexamples # checks if examples are testable (have an expected output) + # - testifylint # checks usage of github.com/stretchr/testify + # - tparallel # detects inappropriate usage of t.Parallel() method in your Go test codes + # - unconvert # removes unnecessary type conversions + # - unparam # reports unused function parameters + # - usestdlibvars # detects the possibility to use variables/constants from the Go standard library + # - wastedassign # finds wasted assignment statements + # - whitespace # detects leading and trailing whitespace ## you may want to enable #- decorder # checks declaration order and count of types, constants, variables and functions @@ -347,3 +346,4 @@ issues: - gosec - noctx - wrapcheck + - errcheck diff --git a/apps/agent/Taskfile.yml b/apps/agent/Taskfile.yml index efe4fe537..d39febc2a 100644 --- a/apps/agent/Taskfile.yml +++ b/apps/agent/Taskfile.yml @@ -7,7 +7,7 @@ tasks: fmt: cmds: - go fmt ./... - - go vet ./... + - task: lint test: cmds: - go test -cover -json -failfast ./... | tparse -all -progress diff --git a/apps/agent/cmd/agent/agent.go b/apps/agent/cmd/agent/agent.go index c7cc8e0b3..8b2780c77 100644 --- a/apps/agent/cmd/agent/agent.go +++ b/apps/agent/cmd/agent/agent.go @@ -87,7 +87,8 @@ func run(c *cli.Context) error { { if cfg.Tracing != nil && cfg.Tracing.Axiom != nil { - closeTracer, err := tracing.Init(context.Background(), tracing.Config{ + var closeTracer tracing.Closer + closeTracer, err = tracing.Init(context.Background(), tracing.Config{ Dataset: cfg.Tracing.Axiom.Dataset, Application: "agent", Version: "1.0.0", @@ -108,7 +109,7 @@ func run(c *cli.Context) error { m := metrics.NewNoop() if cfg.Metrics != nil && cfg.Metrics.Axiom != nil { - realMetrics, err := metrics.New(metrics.Config{ + m, err = metrics.New(metrics.Config{ Token: cfg.Metrics.Axiom.Token, Dataset: cfg.Metrics.Axiom.Dataset, Logger: logger.With().Str("pkg", "metrics").Logger(), @@ -118,7 +119,6 @@ func run(c *cli.Context) error { if err != nil { logger.Fatal().Err(err).Msg("unable to start metrics") } - m = realMetrics } defer m.Close() @@ -167,21 +167,21 @@ func run(c *cli.Context) error { if cfg.Cluster != nil { - memb, err := membership.New(membership.Config{ + memb, membershipErr := membership.New(membership.Config{ NodeId: cfg.NodeId, RpcAddr: cfg.Cluster.RpcAddr, SerfAddr: cfg.Cluster.SerfAddr, Logger: logger, }) - if err != nil { - return fmt.Errorf("failed to create membership: %w", err) + if membershipErr != nil { + return fmt.Errorf("failed to create membership: %w", membershipErr) } var join []string if cfg.Cluster.Join.Dns != nil { - addrs, err := net.LookupHost(cfg.Cluster.Join.Dns.AAAA) - if err != nil { - return fmt.Errorf("failed to lookup dns: %w", err) + addrs, lookupErr := net.LookupHost(cfg.Cluster.Join.Dns.AAAA) + if lookupErr != nil { + return fmt.Errorf("failed to lookup dns: %w", lookupErr) } logger.Info().Strs("addrs", addrs).Msg("found dns records") join = addrs @@ -214,9 +214,9 @@ func run(c *cli.Context) error { return fmt.Errorf("failed to create cluster: %w", err) } defer func() { - err := clus.Shutdown() - if err != nil { - logger.Error().Err(err).Msg("failed to shutdown cluster") + shutdownErr := clus.Shutdown() + if shutdownErr != nil { + logger.Error().Err(shutdownErr).Msg("failed to shutdown cluster") } }() @@ -245,7 +245,8 @@ func run(c *cli.Context) error { } if cfg.Services.EventRouter != nil { - er, err := eventrouter.New(eventrouter.Config{ + var er *eventrouter.Service + er, err = eventrouter.New(eventrouter.Config{ Logger: logger, Metrics: m, BatchSize: cfg.Services.EventRouter.Tinybird.BatchSize, @@ -259,10 +260,7 @@ func run(c *cli.Context) error { return err } srv.WithEventRouter(er) - if err != nil { - return fmt.Errorf("failed to add event router service: %w", err) - } } connectSrv, err := connect.New(connect.Config{Logger: logger, Image: cfg.Image, Metrics: m}) @@ -282,7 +280,7 @@ func run(c *cli.Context) error { logger.Info().Msg("started ratelimit service") go func() { - err := connectSrv.Listen(fmt.Sprintf(":%s", cfg.RpcPort)) + err = connectSrv.Listen(fmt.Sprintf(":%s", cfg.RpcPort)) if err != nil { logger.Fatal().Err(err).Msg("failed to start connect service") } @@ -290,7 +288,7 @@ func run(c *cli.Context) error { go func() { logger.Info().Msgf("listening on port %s", cfg.Port) - err := srv.Listen(fmt.Sprintf(":%s", cfg.Port)) + err = srv.Listen(fmt.Sprintf(":%s", cfg.Port)) if err != nil { logger.Fatal().Err(err).Msg("failed to start service") } @@ -298,7 +296,7 @@ func run(c *cli.Context) error { if cfg.Prometheus != nil { go func() { - err := prometheus.Listen(cfg.Prometheus.Path, cfg.Prometheus.Port) + err = prometheus.Listen(cfg.Prometheus.Path, cfg.Prometheus.Port) if err != nil { logger.Fatal().Err(err).Msg("failed to start prometheus") } diff --git a/apps/agent/integration/identities/update_identity_with_many_keys_test.go b/apps/agent/integration/identities/update_identity_with_many_keys_test.go index ee0b41c97..f2555d5de 100644 --- a/apps/agent/integration/identities/update_identity_with_many_keys_test.go +++ b/apps/agent/integration/identities/update_identity_with_many_keys_test.go @@ -41,13 +41,13 @@ func TestUpdateAutomaticallyCreatedIdentityWithManyKeys(t *testing.T) { require.NoError(t, err) t.Cleanup(func() { - _, err := sdk.Apis.DeleteAPI(ctx, operations.DeleteAPIRequestBody{ + _, err = sdk.Apis.DeleteAPI(ctx, operations.DeleteAPIRequestBody{ APIID: api.Object.APIID, }) require.NoError(t, err) }) - externalId := uid.New("testuser") + externalID := uid.New("testuser") keys := make([]*operations.CreateKeyResponseBody, 1000) concurrency := make(chan struct{}, 32) @@ -58,11 +58,11 @@ func TestUpdateAutomaticallyCreatedIdentityWithManyKeys(t *testing.T) { concurrency <- struct{}{} - key, err := sdk.Keys.CreateKey(ctx, operations.CreateKeyRequestBody{ + key, createErr := sdk.Keys.CreateKey(ctx, operations.CreateKeyRequestBody{ APIID: api.Object.APIID, - OwnerID: unkey.String(externalId), + OwnerID: unkey.String(externalID), }) - require.NoError(t, err) + require.NoError(t, createErr) keys[i] = key.Object @@ -95,7 +95,7 @@ func TestUpdateAutomaticallyCreatedIdentityWithManyKeys(t *testing.T) { }) _, err = sdk.Identities.UpdateIdentity(ctx, operations.UpdateIdentityRequestBody{ - ExternalID: unkey.String(externalId), + ExternalID: unkey.String(externalID), Meta: map[string]any{ "hello": "world", }, @@ -116,7 +116,7 @@ func TestUpdateAutomaticallyCreatedIdentityWithManyKeys(t *testing.T) { require.True(t, verifyRes.V1KeysVerifyKeyResponse.Valid) require.NotNil(t, verifyRes.V1KeysVerifyKeyResponse.Identity) - require.Equal(t, externalId, verifyRes.V1KeysVerifyKeyResponse.Identity.ExternalID) + require.Equal(t, externalID, verifyRes.V1KeysVerifyKeyResponse.Identity.ExternalID) meta, err := json.Marshal(verifyRes.V1KeysVerifyKeyResponse.Identity.Meta) require.NoError(t, err) diff --git a/apps/agent/pkg/api/agent_auth.go b/apps/agent/pkg/api/agent_auth.go index d3f1e8c7c..da34fac7b 100644 --- a/apps/agent/pkg/api/agent_auth.go +++ b/apps/agent/pkg/api/agent_auth.go @@ -17,21 +17,30 @@ func newBearerAuthMiddleware(secret string) routes.Middeware { authorizationHeader := r.Header.Get("Authorization") if authorizationHeader == "" { w.WriteHeader(401) - w.Write([]byte("Authorization header is required")) + _, err := w.Write([]byte("Authorization header is required")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } token := strings.TrimPrefix(authorizationHeader, "Bearer ") if token == "" { w.WriteHeader(401) - w.Write([]byte("Bearer token is required")) + _, err := w.Write([]byte("Bearer token is required")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } if subtle.ConstantTimeCompare([]byte(token), secretB) != 1 { w.WriteHeader(401) - w.Write([]byte("Bearer token is invalid")) + _, err := w.Write([]byte("Bearer token is invalid")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } diff --git a/apps/agent/pkg/api/ctxutil/context.go b/apps/agent/pkg/api/ctxutil/context.go index a0deb97f2..468369728 100644 --- a/apps/agent/pkg/api/ctxutil/context.go +++ b/apps/agent/pkg/api/ctxutil/context.go @@ -2,12 +2,14 @@ package ctxutil import "context" +type contextKey string + const ( - request_id string = "request_id" + request_id contextKey = "request_id" ) // getValue returns the value for the given key from the context or its zero value if it doesn't exist. -func getValue[T any](ctx context.Context, key string) T { +func getValue[T any](ctx context.Context, key contextKey) T { val, ok := ctx.Value(key).(T) if !ok { var t T diff --git a/apps/agent/pkg/api/routes/openapi/handler.go b/apps/agent/pkg/api/routes/openapi/handler.go index 223f914eb..3f42adcd6 100644 --- a/apps/agent/pkg/api/routes/openapi/handler.go +++ b/apps/agent/pkg/api/routes/openapi/handler.go @@ -14,8 +14,10 @@ func New(svc routes.Services) *routes.Route { w.WriteHeader(200) w.Header().Set("Content-Type", "application/json") - w.Write(openapi.Spec) - + _, err := w.Write(openapi.Spec) + if err != nil { + http.Error(w, "failed to write response", http.StatusInternalServerError) + } }, ) } diff --git a/apps/agent/pkg/api/routes/sender.go b/apps/agent/pkg/api/routes/sender.go index ae7fa9f1c..ed53bc376 100644 --- a/apps/agent/pkg/api/routes/sender.go +++ b/apps/agent/pkg/api/routes/sender.go @@ -48,15 +48,23 @@ func (r *JsonSender) Send(ctx context.Context, w http.ResponseWriter, status int b, err = json.Marshal(error) if err != nil { - w.Write([]byte("failed to marshal response body")) + _, err = w.Write([]byte("failed to marshal response body")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } - w.Write(b) + _, err = w.Write(b) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) - w.Write(b) - + _, err = w.Write(b) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } } diff --git a/apps/agent/pkg/api/validation/validator.go b/apps/agent/pkg/api/validation/validator.go index 38eb17755..c91f00838 100644 --- a/apps/agent/pkg/api/validation/validator.go +++ b/apps/agent/pkg/api/validation/validator.go @@ -67,20 +67,6 @@ func (v *Validator) Body(r *http.Request, dest any) (openapi.ValidationError, bo } r.Body = io.NopCloser(bytes.NewReader(bodyBytes)) - if err != nil { - return openapi.ValidationError{ - Title: "Bad Request", - Detail: "Failed to create new request", - Errors: []openapi.ValidationErrorDetail{{ - Location: "body", - Message: err.Error(), - }}, - Instance: "https://errors.unkey.com/todo", - Status: http.StatusBadRequest, - RequestId: ctxutil.GetRequestId(r.Context()), - }, false - } - valid, errors := v.validator.ValidateHttpRequest(r) if !valid { valErr := openapi.ValidationError{ diff --git a/apps/agent/pkg/circuitbreaker/lib_test.go b/apps/agent/pkg/circuitbreaker/lib_test.go index f99ad5c4c..b4ea0f526 100644 --- a/apps/agent/pkg/circuitbreaker/lib_test.go +++ b/apps/agent/pkg/circuitbreaker/lib_test.go @@ -50,9 +50,10 @@ func TestCircuitBreakerReset(t *testing.T) { // Trigger circuit breaker to open for i := 0; i < 3; i++ { - cb.Do(context.Background(), func(ctx context.Context) (int, error) { + _, err := cb.Do(context.Background(), func(ctx context.Context) (int, error) { return 0, errTestDownstream }) + require.ErrorIs(t, err, errTestDownstream) } require.Equal(t, Open, cb.state) diff --git a/apps/agent/pkg/clickhouse/flush.go b/apps/agent/pkg/clickhouse/flush.go index f0d3e3016..06d6e2b47 100644 --- a/apps/agent/pkg/clickhouse/flush.go +++ b/apps/agent/pkg/clickhouse/flush.go @@ -16,7 +16,7 @@ func flush[T any](ctx context.Context, conn ch.Conn, table string, rows []T) err } for _, row := range rows { fmt.Printf("row: %+v\n", row) - err := batch.AppendStruct(&row) + err = batch.AppendStruct(&row) if err != nil { return fault.Wrap(err, fmsg.With("appending struct to batch failed")) } diff --git a/apps/agent/pkg/clickhouse/noop.go b/apps/agent/pkg/clickhouse/noop.go index 805bc59f1..276b86140 100644 --- a/apps/agent/pkg/clickhouse/noop.go +++ b/apps/agent/pkg/clickhouse/noop.go @@ -9,10 +9,10 @@ type noop struct{} var _ Bufferer = &noop{} func (n *noop) BufferApiRequest(schema.ApiRequestV1) { - return + } func (n *noop) BufferKeyVerification(schema.KeyVerificationRequestV1) { - return + } func NewNoop() *noop { diff --git a/apps/agent/pkg/config/json.go b/apps/agent/pkg/config/json.go index f1ed1c5ad..2598cb54b 100644 --- a/apps/agent/pkg/config/json.go +++ b/apps/agent/pkg/config/json.go @@ -8,6 +8,8 @@ import ( "os" + "github.com/Southclaws/fault" + "github.com/Southclaws/fault/fmsg" "github.com/danielgtaylor/huma/schema" "github.com/xeipuuv/gojsonschema" ) @@ -42,12 +44,12 @@ func LoadFile[C any](config *C, path string) (err error) { lines = append(lines, "") lines = append(lines, "Configuration received:") lines = append(lines, expanded) - return fmt.Errorf(strings.Join(lines, "\n")) + return fault.New(strings.Join(lines, "\n")) } err = json.Unmarshal([]byte(expanded), config) if err != nil { - return fmt.Errorf("Failed to unmarshal configuration: %s", err) + return fault.Wrap(err, fmsg.WithDesc("bad_config", "Failed to unmarshal configuration")) } return nil diff --git a/apps/agent/pkg/logging/logger.go b/apps/agent/pkg/logging/logger.go index 2d509b886..f0594800a 100644 --- a/apps/agent/pkg/logging/logger.go +++ b/apps/agent/pkg/logging/logger.go @@ -21,7 +21,9 @@ type Config struct { func init() { zerolog.CallerMarshalFunc = func(pc uintptr, file string, line int) string { - return fmt.Sprintf("%s:%s", strings.TrimPrefix(file, "/go/src/github.com/unkeyed/unkey/apps/agent/"), strconv.Itoa(line)) + return fmt.Sprintf("%s:%s", + strings.TrimPrefix(file, "/go/src/github.com/unkeyed/unkey/apps/agent/"), + strconv.Itoa(line)) } } diff --git a/apps/agent/pkg/metrics/interface.go b/apps/agent/pkg/metrics/interface.go index 5a492558b..82aa29380 100644 --- a/apps/agent/pkg/metrics/interface.go +++ b/apps/agent/pkg/metrics/interface.go @@ -5,10 +5,12 @@ type Metrics interface { Close() } -// Metric is the interface that all metrics must implement to be recorded by the metrics package +// Metric is the interface that all metrics must implement to be recorded by +// the metrics package // // A metric must have a name that is unique within the system -// The remaining public fields are up to the caller and will be serialized to JSON when recorded +// The remaining public fields are up to the caller and will be serialized to +// JSON when recorded. type Metric interface { // The name of the metric // e.g. "metric.cache.hit" diff --git a/apps/agent/pkg/util/retry.go b/apps/agent/pkg/util/retry.go index 3ecd98418..97cb03274 100644 --- a/apps/agent/pkg/util/retry.go +++ b/apps/agent/pkg/util/retry.go @@ -6,15 +6,16 @@ import ( ) // Retry retries the given function until it succeeds or all retries are exhausted -func Retry(fn func() error, attempts int, backoff func(n int) time.Duration) (err error) { +func Retry(fn func() error, attempts int, backoff func(n int) time.Duration) error { if attempts < 1 { return fmt.Errorf("attempts must be greater than 0") } + var err error for i := 0; i < attempts; i++ { err = fn() if err == nil { - return + return nil } time.Sleep(backoff(i)) } diff --git a/apps/agent/services/eventrouter/service.go b/apps/agent/services/eventrouter/service.go index afd8c0fb3..a186a121d 100644 --- a/apps/agent/services/eventrouter/service.go +++ b/apps/agent/services/eventrouter/service.go @@ -149,25 +149,34 @@ func (s *Service) CreateHandler() (string, http.HandlerFunc) { if err != nil { s.logger.Warn().Err(err).Msg("failed to authorize request") w.WriteHeader(403) - w.Write([]byte("Unauthorized")) + _, err = w.Write([]byte("Unauthorized")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } datasource := r.URL.Query().Get("name") if datasource == "" { w.WriteHeader(400) - w.Write([]byte("missing ?name= parameter")) + _, err = w.Write([]byte("missing ?name= parameter")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } successfulRows := 0 switch datasource { case "key_verifications__v2": - events, err := decode[tinybirdKeyVerification](r.Body) - if err != nil { - s.logger.Err(err).Msg("Error decoding request") + events, decodeErr := decode[tinybirdKeyVerification](r.Body) + if decodeErr != nil { + s.logger.Err(decodeErr).Msg("Error decoding request") w.WriteHeader(400) - w.Write([]byte("Error decoding request")) + _, err = w.Write([]byte("Error decoding request")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } for _, e := range events { @@ -175,11 +184,14 @@ func (s *Service) CreateHandler() (string, http.HandlerFunc) { } successfulRows = len(events) default: - events, err := decode[any](r.Body) - if err != nil { - s.logger.Err(err).Msg("Error decoding request") + events, decodeErr := decode[any](r.Body) + if decodeErr != nil { + s.logger.Err(decodeErr).Msg("Error decoding request") w.WriteHeader(400) - w.Write([]byte("Error decoding request")) + _, err = w.Write([]byte("Error decoding request")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } for _, e := range events { @@ -197,11 +209,17 @@ func (s *Service) CreateHandler() (string, http.HandlerFunc) { if err != nil { s.logger.Err(err).Msg("Error marshalling response") w.WriteHeader(500) - w.Write([]byte("Error marshalling response")) + _, err = w.Write([]byte("Error marshalling response")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } return } w.Header().Add("Content-Type", "application/json") - w.Write(b) + _, err = w.Write(b) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } } } diff --git a/apps/agent/services/ratelimit/ratelimit.go b/apps/agent/services/ratelimit/ratelimit.go index d8a020d75..da8b89c74 100644 --- a/apps/agent/services/ratelimit/ratelimit.go +++ b/apps/agent/services/ratelimit/ratelimit.go @@ -124,7 +124,7 @@ func (s *service) ratelimitOrigin(ctx context.Context, req *ratelimitv1.Ratelimi } duration := time.Duration(req.Duration) * time.Millisecond - s.SetCounter(ctx, + err = s.SetCounter(ctx, setCounterRequest{ Identifier: req.Identifier, Limit: req.Limit, @@ -142,6 +142,11 @@ func (s *service) ratelimitOrigin(ctx context.Context, req *ratelimitv1.Ratelimi Time: time.UnixMilli(req.GetTime()), }, ) + if err != nil { + tracing.RecordError(span, err) + s.logger.Err(err).Msg("failed to set counter") + return nil, err + } return res.Msg.Response, nil } diff --git a/apps/agent/services/ratelimit/ratelimit_mitigation_test.go b/apps/agent/services/ratelimit/ratelimit_mitigation_test.go index 0c89e2896..b517591d5 100644 --- a/apps/agent/services/ratelimit/ratelimit_mitigation_test.go +++ b/apps/agent/services/ratelimit/ratelimit_mitigation_test.go @@ -54,15 +54,9 @@ func TestExceedingTheLimitShouldNotifyAllNodes(t *testing.T) { require.NoError(t, err) require.NoError(t, err) - go func() { - t.Logf("rpcAddr: %s", rpcAddr) - u, err := url.Parse(rpcAddr) - require.NoError(t, err) - - err = srv.Listen(u.Host) - require.NoError(t, err) - - }() + u, err := url.Parse(rpcAddr) + require.NoError(t, err) + go srv.Listen(u.Host) require.Eventually(t, func() bool { diff --git a/apps/agent/services/ratelimit/ratelimit_test.go b/apps/agent/services/ratelimit/ratelimit_test.go index 47f4a8d59..8d8edc01f 100644 --- a/apps/agent/services/ratelimit/ratelimit_test.go +++ b/apps/agent/services/ratelimit/ratelimit_test.go @@ -58,15 +58,9 @@ func TestAccuracy_fixed_time(t *testing.T) { require.NoError(t, err) require.NoError(t, err) - go func() { - t.Logf("rpcAddr: %s", rpcAddr) - u, err := url.Parse(rpcAddr) - require.NoError(t, err) - - err = srv.Listen(u.Host) - require.NoError(t, err) - - }() + u, err := url.Parse(rpcAddr) + require.NoError(t, err) + go srv.Listen(u.Host) require.Eventually(t, func() bool { client := ratelimitv1connect.NewRatelimitServiceClient(http.DefaultClient, rpcAddr) diff --git a/apps/agent/services/vault/integration/migrate_deks_test.go b/apps/agent/services/vault/integration/migrate_deks_test.go index e3e2a85df..f16f79d2d 100644 --- a/apps/agent/services/vault/integration/migrate_deks_test.go +++ b/apps/agent/services/vault/integration/migrate_deks_test.go @@ -47,7 +47,7 @@ func TestMigrateDeks(t *testing.T) { // Seed some DEKs for range 10 { - _, err := v.CreateDEK(ctx, &vaultv1.CreateDEKRequest{ + _, err = v.CreateDEK(ctx, &vaultv1.CreateDEKRequest{ Keyring: "keyring", }) require.NoError(t, err) @@ -56,11 +56,11 @@ func TestMigrateDeks(t *testing.T) { _, err = rand.Read(buf) d := string(buf) require.NoError(t, err) - res, err := v.Encrypt(ctx, &vaultv1.EncryptRequest{ + res, encryptErr := v.Encrypt(ctx, &vaultv1.EncryptRequest{ Keyring: "keyring", Data: string(d), }) - require.NoError(t, err) + require.NoError(t, encryptErr) data[d] = res.Encrypted } @@ -81,11 +81,11 @@ func TestMigrateDeks(t *testing.T) { // Check each piece of data can be decrypted for d, e := range data { - res, err := v.Decrypt(ctx, &vaultv1.DecryptRequest{ + res, decryptErr := v.Decrypt(ctx, &vaultv1.DecryptRequest{ Keyring: "keyring", Encrypted: e, }) - require.NoError(t, err) + require.NoError(t, decryptErr) require.Equal(t, d, res.Plaintext) } // Simulate another restart, removing the old master key From fe03252d600adbf36d388bc9787fd1c8018c5261 Mon Sep 17 00:00:00 2001 From: Andreas Thomas Date: Thu, 19 Sep 2024 15:58:03 +0200 Subject: [PATCH 6/7] fix: cf cache ratelimits (#2112) * fix: default ratelimits * revert * fix: cache ratelimits on cloudflare correctly * chore: remove logs * chore: remove log * perf: remove unnecessary switch * fix: track isolate start time * test: tighten lower ratelimit threshold * fix: only cache ratelimit blocks * chore: sync lockfile * test: improve accuracy of lower limit calculation in rate limit tests * fix: address rabbit suggestions --- .../identities_ratelimits_accuracy_test.go | 150 ++++++++++++++++++ .../identities/token_ratelimits_test.go | 12 +- .../agent/integration/keys/ratelimits_test.go | 125 +++++++++++++++ apps/agent/pkg/circuitbreaker/lib.go | 2 +- apps/agent/pkg/clickhouse/flush.go | 1 - apps/agent/pkg/testutil/attack.go | 69 ++++++++ apps/agent/services/eventrouter/service.go | 2 - apps/api/src/pkg/middleware/init.ts | 7 +- apps/api/src/pkg/middleware/metrics.ts | 9 +- apps/api/src/pkg/ratelimit/client.ts | 31 ++-- ..._keys_verifyKey.ratelimit_accuracy.test.ts | 2 +- .../v1_ratelimit_limit.accuracy.test.ts | 2 +- pnpm-lock.yaml | 122 +++++++------- 13 files changed, 428 insertions(+), 106 deletions(-) create mode 100644 apps/agent/integration/identities/identities_ratelimits_accuracy_test.go create mode 100644 apps/agent/integration/keys/ratelimits_test.go create mode 100644 apps/agent/pkg/testutil/attack.go diff --git a/apps/agent/integration/identities/identities_ratelimits_accuracy_test.go b/apps/agent/integration/identities/identities_ratelimits_accuracy_test.go new file mode 100644 index 000000000..bdd0b6d9c --- /dev/null +++ b/apps/agent/integration/identities/identities_ratelimits_accuracy_test.go @@ -0,0 +1,150 @@ +package identities + +import ( + "context" + "fmt" + "os" + "testing" + "time" + + "github.com/stretchr/testify/require" + unkey "github.com/unkeyed/unkey-go" + "github.com/unkeyed/unkey-go/models/components" + "github.com/unkeyed/unkey-go/models/operations" + attack "github.com/unkeyed/unkey/apps/agent/pkg/testutil" + "github.com/unkeyed/unkey/apps/agent/pkg/uid" + "github.com/unkeyed/unkey/apps/agent/pkg/util" +) + +func TestIdentitiesRatelimitAccuracy(t *testing.T) { + // Step 1 -------------------------------------------------------------------- + // Setup the sdk, create an API and an identity + // --------------------------------------------------------------------------- + + ctx := context.Background() + rootKey := os.Getenv("INTEGRATION_TEST_ROOT_KEY") + require.NotEmpty(t, rootKey, "INTEGRATION_TEST_ROOT_KEY must be set") + baseURL := os.Getenv("UNKEY_BASE_URL") + require.NotEmpty(t, baseURL, "UNKEY_BASE_URL must be set") + + sdk := unkey.New( + unkey.WithServerURL(baseURL), + unkey.WithSecurity(rootKey), + ) + + for _, nKeys := range []int{1} { //, 3, 10, 1000} { + t.Run(fmt.Sprintf("with %d keys", nKeys), func(t *testing.T) { + + for _, tc := range []struct { + rate attack.Rate + testDuration time.Duration + }{ + { + rate: attack.Rate{Freq: 20, Per: time.Second}, + testDuration: 1 * time.Minute, + }, + { + rate: attack.Rate{Freq: 100, Per: time.Second}, + testDuration: 5 * time.Minute, + }, + } { + t.Run(fmt.Sprintf("[%s] over %s", tc.rate.String(), tc.testDuration), func(t *testing.T) { + api, err := sdk.Apis.CreateAPI(ctx, operations.CreateAPIRequestBody{ + Name: uid.New("testapi"), + }) + require.NoError(t, err) + + externalId := uid.New("testuser") + + _, err = sdk.Identities.CreateIdentity(ctx, operations.CreateIdentityRequestBody{ + ExternalID: externalId, + Meta: map[string]any{ + "email": "test@test.com", + }, + }) + require.NoError(t, err) + + // Step 2 -------------------------------------------------------------------- + // Update the identity with ratelimits + // --------------------------------------------------------------------------- + + inferenceLimit := operations.UpdateIdentityRatelimits{ + Name: "inferenceLimit", + Limit: 100, + Duration: time.Minute.Milliseconds(), + } + + _, err = sdk.Identities.UpdateIdentity(ctx, operations.UpdateIdentityRequestBody{ + ExternalID: unkey.String(externalId), + Ratelimits: []operations.UpdateIdentityRatelimits{inferenceLimit}, + }) + require.NoError(t, err) + + // Step 4 -------------------------------------------------------------------- + // Create keys that share the same identity and therefore the same ratelimits + // --------------------------------------------------------------------------- + + keys := make([]operations.CreateKeyResponseBody, nKeys) + for i := 0; i < len(keys); i++ { + key, err := sdk.Keys.CreateKey(ctx, operations.CreateKeyRequestBody{ + APIID: api.Object.APIID, + ExternalID: unkey.String(externalId), + Environment: unkey.String("integration_test"), + }) + require.NoError(t, err) + keys[i] = *key.Object + } + + // Step 5 -------------------------------------------------------------------- + // Test ratelimits + // --------------------------------------------------------------------------- + + total := 0 + passed := 0 + + results := attack.Attack(t, tc.rate, tc.testDuration, func() bool { + + // Each request uses one of the keys randomly + key := util.RandomElement(keys).Key + + res, err := sdk.Keys.VerifyKey(context.Background(), components.V1KeysVerifyKeyRequest{ + APIID: unkey.String(api.Object.APIID), + Key: key, + Ratelimits: []components.Ratelimits{ + {Name: inferenceLimit.Name}, + }, + }) + require.NoError(t, err) + + return res.V1KeysVerifyKeyResponse.Valid + + }) + + for valid := range results { + total++ + if valid { + passed++ + } + + } + + // Step 6 -------------------------------------------------------------------- + // Assert ratelimits worked + // --------------------------------------------------------------------------- + + exactLimit := int(inferenceLimit.Limit) * int(tc.testDuration/(time.Duration(inferenceLimit.Duration)*time.Millisecond)) + upperLimit := int(1.2 * float64(exactLimit)) + lowerLimit := exactLimit + if total < lowerLimit { + lowerLimit = total + } + t.Logf("Total: %d, Passed: %d, lowerLimit: %d, exactLimit: %d, upperLimit: %d", total, passed, lowerLimit, exactLimit, upperLimit) + + // check requests::api is not exceeded + require.GreaterOrEqual(t, passed, lowerLimit) + require.LessOrEqual(t, passed, upperLimit) + }) + } + }) + } +} diff --git a/apps/agent/integration/identities/token_ratelimits_test.go b/apps/agent/integration/identities/token_ratelimits_test.go index 2a2247c17..f0be78ccd 100644 --- a/apps/agent/integration/identities/token_ratelimits_test.go +++ b/apps/agent/integration/identities/token_ratelimits_test.go @@ -28,14 +28,10 @@ func TestClusterRatelimitAccuracy(t *testing.T) { baseURL := os.Getenv("UNKEY_BASE_URL") require.NotEmpty(t, baseURL, "UNKEY_BASE_URL must be set") - options := []unkey.SDKOption{ + sdk := unkey.New( + unkey.WithServerURL(baseURL), unkey.WithSecurity(rootKey), - } - - if baseURL != "" { - options = append(options, unkey.WithServerURL(baseURL)) - } - sdk := unkey.New(options...) + ) api, err := sdk.Apis.CreateAPI(ctx, operations.CreateAPIRequestBody{ Name: uid.New("testapi"), @@ -47,7 +43,7 @@ func TestClusterRatelimitAccuracy(t *testing.T) { _, err = sdk.Identities.CreateIdentity(ctx, operations.CreateIdentityRequestBody{ ExternalID: externalId, Meta: map[string]any{ - "email": "andreas@unkey.dev", + "email": "test@test.com", }, }) require.NoError(t, err) diff --git a/apps/agent/integration/keys/ratelimits_test.go b/apps/agent/integration/keys/ratelimits_test.go new file mode 100644 index 000000000..93ebdaeba --- /dev/null +++ b/apps/agent/integration/keys/ratelimits_test.go @@ -0,0 +1,125 @@ +package keys_test + +import ( + "context" + "fmt" + "os" + "testing" + "time" + + "github.com/stretchr/testify/require" + unkey "github.com/unkeyed/unkey-go" + "github.com/unkeyed/unkey-go/models/components" + "github.com/unkeyed/unkey-go/models/operations" + attack "github.com/unkeyed/unkey/apps/agent/pkg/testutil" + "github.com/unkeyed/unkey/apps/agent/pkg/uid" + "github.com/unkeyed/unkey/apps/agent/pkg/util" +) + +func TestDefaultRatelimitAccuracy(t *testing.T) { + // Step 1 -------------------------------------------------------------------- + // Setup the sdk, create an API and a key + // --------------------------------------------------------------------------- + + ctx := context.Background() + rootKey := os.Getenv("INTEGRATION_TEST_ROOT_KEY") + require.NotEmpty(t, rootKey, "INTEGRATION_TEST_ROOT_KEY must be set") + baseURL := os.Getenv("UNKEY_BASE_URL") + require.NotEmpty(t, baseURL, "UNKEY_BASE_URL must be set") + + options := []unkey.SDKOption{ + unkey.WithSecurity(rootKey), + } + + if baseURL != "" { + options = append(options, unkey.WithServerURL(baseURL)) + } + sdk := unkey.New(options...) + + for _, tc := range []struct { + rate attack.Rate + testDuration time.Duration + }{ + { + rate: attack.Rate{Freq: 20, Per: time.Second}, + testDuration: 1 * time.Minute, + }, + { + rate: attack.Rate{Freq: 100, Per: time.Second}, + testDuration: 5 * time.Minute, + }, + } { + t.Run(fmt.Sprintf("[%s] over %s", tc.rate.String(), tc.testDuration), func(t *testing.T) { + api, err := sdk.Apis.CreateAPI(ctx, operations.CreateAPIRequestBody{ + Name: uid.New("testapi"), + }) + require.NoError(t, err) + + // Step 2 -------------------------------------------------------------------- + // Update the identity with ratelimits + // --------------------------------------------------------------------------- + + // Step 3 -------------------------------------------------------------------- + // Create keys that share the same identity and therefore the same ratelimits + // --------------------------------------------------------------------------- + + ratelimit := operations.Ratelimit{ + Limit: 100, + Duration: util.Pointer(time.Minute.Milliseconds()), + } + + key, err := sdk.Keys.CreateKey(ctx, operations.CreateKeyRequestBody{ + APIID: api.Object.APIID, + Ratelimit: &ratelimit, + }) + require.NoError(t, err) + + // Step 5 -------------------------------------------------------------------- + // Test ratelimits + // --------------------------------------------------------------------------- + + total := 0 + passed := 0 + + results := attack.Attack(t, tc.rate, tc.testDuration, func() bool { + + res, err := sdk.Keys.VerifyKey(context.Background(), components.V1KeysVerifyKeyRequest{ + APIID: unkey.String(api.Object.APIID), + Key: key.Object.Key, + Ratelimits: []components.Ratelimits{ + {Name: "default"}, + }, + }) + require.NoError(t, err) + + return res.V1KeysVerifyKeyResponse.Valid + + }) + + for valid := range results { + total++ + if valid { + passed++ + } + + } + + // Step 6 -------------------------------------------------------------------- + // Assert ratelimits worked + // --------------------------------------------------------------------------- + + exactLimit := int(ratelimit.Limit) * int(tc.testDuration/(time.Duration(*ratelimit.Duration)*time.Millisecond)) + upperLimit := int(1.2 * float64(exactLimit)) + lowerLimit := exactLimit + if total < lowerLimit { + lowerLimit = total + } + t.Logf("Total: %d, Passed: %d, lowerLimit: %d, exactLimit: %d, upperLimit: %d", total, passed, lowerLimit, exactLimit, upperLimit) + + // check requests::api is not exceeded + require.GreaterOrEqual(t, passed, lowerLimit) + require.LessOrEqual(t, passed, upperLimit) + }) + + } +} diff --git a/apps/agent/pkg/circuitbreaker/lib.go b/apps/agent/pkg/circuitbreaker/lib.go index 5f63307a4..04ff5fc0a 100644 --- a/apps/agent/pkg/circuitbreaker/lib.go +++ b/apps/agent/pkg/circuitbreaker/lib.go @@ -188,7 +188,7 @@ func (cb *CB[Res]) preflight(ctx context.Context) error { return ErrTripped } - cb.logger.Info().Str("state", string(cb.state)).Int("requests", cb.requests).Int("maxRequests", cb.config.maxRequests).Msg("circuit breaker state") + cb.logger.Debug().Str("state", string(cb.state)).Int("requests", cb.requests).Int("maxRequests", cb.config.maxRequests).Msg("circuit breaker state") if cb.state == HalfOpen && cb.requests >= cb.config.maxRequests { return ErrTooManyRequests } diff --git a/apps/agent/pkg/clickhouse/flush.go b/apps/agent/pkg/clickhouse/flush.go index 06d6e2b47..12778c141 100644 --- a/apps/agent/pkg/clickhouse/flush.go +++ b/apps/agent/pkg/clickhouse/flush.go @@ -15,7 +15,6 @@ func flush[T any](ctx context.Context, conn ch.Conn, table string, rows []T) err return fault.Wrap(err, fmsg.With("preparing batch failed")) } for _, row := range rows { - fmt.Printf("row: %+v\n", row) err = batch.AppendStruct(&row) if err != nil { return fault.Wrap(err, fmsg.With("appending struct to batch failed")) diff --git a/apps/agent/pkg/testutil/attack.go b/apps/agent/pkg/testutil/attack.go new file mode 100644 index 000000000..5b872c5c0 --- /dev/null +++ b/apps/agent/pkg/testutil/attack.go @@ -0,0 +1,69 @@ +package attack + +import ( + "fmt" + "sync" + "testing" + "time" +) + +type Rate struct { + Freq int + Per time.Duration +} + +func (r Rate) String() string { + return fmt.Sprintf("%d per %s", r.Freq, r.Per) +} + +// Attack executes the given function at the given rate for the given duration +// and returns a channel on which the results are sent. +// +// The caller must process the results as they arrive on the channel to avoid +// blocking the worker goroutines. +func Attack[Response any](t *testing.T, rate Rate, duration time.Duration, fn func() Response) <-chan Response { + t.Log("attacking") + wg := sync.WaitGroup{} + workers := 256 + + ticks := make(chan struct{}) + responses := make(chan Response) + + totalRequests := rate.Freq * int(duration/rate.Per) + dt := rate.Per / time.Duration(rate.Freq) + + wg.Add(totalRequests) + + go func() { + for i := 0; i < totalRequests; i++ { + ticks <- struct{}{} + time.Sleep(dt) + } + }() + + for i := 0; i < workers; i++ { + go func() { + for range ticks { + responses <- fn() + wg.Done() + + } + }() + } + + go func() { + wg.Wait() + t.Log("attack done, waiting for responses to be processed") + + close(ticks) + pending := len(responses) + for pending > 0 { + t.Logf("waiting for responses to be processed: %d", pending) + time.Sleep(100 * time.Millisecond) + } + close(responses) + + }() + + return responses +} diff --git a/apps/agent/services/eventrouter/service.go b/apps/agent/services/eventrouter/service.go index a186a121d..d8cd4bf88 100644 --- a/apps/agent/services/eventrouter/service.go +++ b/apps/agent/services/eventrouter/service.go @@ -77,7 +77,6 @@ func New(config Config) (*Service, error) { config.Logger.Error().Str("e", fmt.Sprintf("%T: %+v", row, row)).Msg("Error casting key verification") continue } - config.Logger.Info().Interface("e", e).Msg("Key verification event") // dual write to clickhouse outcome := "VALID" if e.DeniedReason != "" { @@ -94,7 +93,6 @@ func New(config Config) (*Service, error) { IdentityID: e.OwnerId, }) } - } } diff --git a/apps/api/src/pkg/middleware/init.ts b/apps/api/src/pkg/middleware/init.ts index 4bf8b2d78..d78a0dea7 100644 --- a/apps/api/src/pkg/middleware/init.ts +++ b/apps/api/src/pkg/middleware/init.ts @@ -26,7 +26,7 @@ const rlMap = new Map(); * subsequent requests will use the same workerId and coldStartAt */ let isolateId: string | undefined = undefined; - +let isolateCreatedAt: number | undefined = undefined; /** * Initialize all services. * @@ -37,8 +37,11 @@ export function init(): MiddlewareHandler { if (!isolateId) { isolateId = crypto.randomUUID(); } + if (!isolateCreatedAt) { + isolateCreatedAt = Date.now(); + } c.set("isolateId", isolateId); - c.set("isolateCreatedAt", Date.now()); + c.set("isolateCreatedAt", isolateCreatedAt); const requestId = newId("request"); c.set("requestId", requestId); diff --git a/apps/api/src/pkg/middleware/metrics.ts b/apps/api/src/pkg/middleware/metrics.ts index 0e9bb6ff3..72d37be3c 100644 --- a/apps/api/src/pkg/middleware/metrics.ts +++ b/apps/api/src/pkg/middleware/metrics.ts @@ -7,16 +7,11 @@ type DiscriminateMetric = M extends { metric: T } ? M : never; export function metrics(): MiddlewareHandler { return async (c, next) => { const { metrics, analytics, logger } = c.get("services"); - // logger.info("request", { - // method: c.req.method, - // path: c.req.path, - // }); - // + const start = performance.now(); - const isolateCreatedAt = c.get("isolateCreatedAt"); const m = { isolateId: c.get("isolateId"), - isolateLifetime: isolateCreatedAt ? Date.now() - isolateCreatedAt : 0, + isolateLifetime: Date.now() - c.get("isolateCreatedAt"), metric: "metric.http.request", path: c.req.path, host: new URL(c.req.url).host, diff --git a/apps/api/src/pkg/ratelimit/client.ts b/apps/api/src/pkg/ratelimit/client.ts index 40d8b91ba..39317fc2e 100644 --- a/apps/api/src/pkg/ratelimit/client.ts +++ b/apps/api/src/pkg/ratelimit/client.ts @@ -14,13 +14,13 @@ import { export class AgentRatelimiter implements RateLimiter { private readonly logger: Logger; private readonly metrics: Metrics; - private readonly cache: Map; + private readonly cache: Map; private readonly agent: Agent; constructor(opts: { agent: { url: string; token: string }; logger: Logger; metrics: Metrics; - cache: Map; + cache: Map; }) { this.logger = opts.logger; this.metrics = opts.metrics; @@ -35,7 +35,7 @@ export class AgentRatelimiter implements RateLimiter { return [req.identifier, window, req.shard].join("::"); } - private setCacheMax(id: string, current: number, reset: number): number { + private setCache(id: string, current: number, reset: number, blocked: boolean) { const maxEntries = 10_000; this.metrics.emit({ metric: "metric.cache.size", @@ -54,13 +54,7 @@ export class AgentRatelimiter implements RateLimiter { } } } - - const cached = this.cache.get(id) ?? { reset: 0, current: 0 }; - if (current > cached.current) { - this.cache.set(id, { reset, current }); - return current; - } - return cached.current; + this.cache.set(id, { reset, current, blocked }); } public async limit( @@ -128,8 +122,8 @@ export class AgentRatelimiter implements RateLimiter { * This might not happen too often, but in extreme cases the cache should hit and we can skip * the request to the durable object entirely, which speeds everything up and is cheaper for us */ - const cached = this.cache.get(id) ?? { current: 0, reset: 0 }; - if (cached.current >= req.limit) { + const cached = this.cache.get(id) ?? { current: 0, reset: 0, blocked: false }; + if (cached.blocked) { return Ok({ pass: false, current: cached.current, @@ -172,17 +166,10 @@ export class AgentRatelimiter implements RateLimiter { const shouldSyncOnNoData = isOlderThan60s && Math.random() < c.env.SYNC_RATELIMIT_ON_NO_DATA; const cacheHit = this.cache.has(id); const sync = !req.async || (!cacheHit && shouldSyncOnNoData); - this.logger.info("sync rate limiting", { - id, - shouldSyncOnNoData, - sync, - cacheHit, - async: req.async, - }); if (sync) { const res = await p; if (res.val) { - this.setCacheMax(id, res.val.current, res.val.reset); + this.setCache(id, res.val.current, res.val.reset, !res.val.pass); } return res; } @@ -193,7 +180,7 @@ export class AgentRatelimiter implements RateLimiter { this.logger.error(res.err.message); return; } - this.setCacheMax(id, res.val.current, res.val.reset); + this.setCache(id, res.val.current, res.val.reset, !res.val.pass); this.metrics.emit({ workspaceId: req.workspaceId, @@ -216,7 +203,7 @@ export class AgentRatelimiter implements RateLimiter { }); } cached.current += cost; - this.setCacheMax(id, cached.current, reset); + this.setCache(id, cached.current, reset, false); return Ok({ pass: true, diff --git a/apps/api/src/routes/v1_keys_verifyKey.ratelimit_accuracy.test.ts b/apps/api/src/routes/v1_keys_verifyKey.ratelimit_accuracy.test.ts index f4f4f6ec9..bed2efaf9 100644 --- a/apps/api/src/routes/v1_keys_verifyKey.ratelimit_accuracy.test.ts +++ b/apps/api/src/routes/v1_keys_verifyKey.ratelimit_accuracy.test.ts @@ -94,7 +94,7 @@ for (const { limit, duration, rps, seconds } of testCases) { const exactLimit = Math.min(results.length, (limit / (duration / 1000)) * seconds); const upperLimit = Math.round(exactLimit * 2.5); - const lowerLimit = Math.round(exactLimit * 0.75); + const lowerLimit = Math.round(exactLimit * 0.95); console.info({ name, passed, exactLimit, upperLimit, lowerLimit }); t.expect(passed).toBeGreaterThanOrEqual(lowerLimit); t.expect(passed).toBeLessThanOrEqual(upperLimit); diff --git a/apps/api/src/routes/v1_ratelimit_limit.accuracy.test.ts b/apps/api/src/routes/v1_ratelimit_limit.accuracy.test.ts index 89bdc55ab..762450975 100644 --- a/apps/api/src/routes/v1_ratelimit_limit.accuracy.test.ts +++ b/apps/api/src/routes/v1_ratelimit_limit.accuracy.test.ts @@ -97,7 +97,7 @@ for (const { limit, duration, rps, seconds } of testCases) { const exactLimit = Math.min(results.length, (limit / (duration / 1000)) * seconds); const upperLimit = Math.round(exactLimit * 1.5); - const lowerLimit = Math.round(exactLimit * 0.75); + const lowerLimit = Math.round(exactLimit * 0.95); console.info({ name, passed, exactLimit, upperLimit, lowerLimit }); t.expect(passed).toBeGreaterThanOrEqual(lowerLimit); t.expect(passed).toBeLessThanOrEqual(upperLimit); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88fa18e10..bfae0b7ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10411,128 +10411,128 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/rollup-android-arm-eabi@4.21.3: - resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} + /@rollup/rollup-android-arm-eabi@4.22.0: + resolution: {integrity: sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.21.3: - resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + /@rollup/rollup-android-arm64@4.22.0: + resolution: {integrity: sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.21.3: - resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} + /@rollup/rollup-darwin-arm64@4.22.0: + resolution: {integrity: sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.21.3: - resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} + /@rollup/rollup-darwin-x64@4.22.0: + resolution: {integrity: sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.21.3: - resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} + /@rollup/rollup-linux-arm-gnueabihf@4.22.0: + resolution: {integrity: sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-musleabihf@4.21.3: - resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} + /@rollup/rollup-linux-arm-musleabihf@4.22.0: + resolution: {integrity: sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.21.3: - resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} + /@rollup/rollup-linux-arm64-gnu@4.22.0: + resolution: {integrity: sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.21.3: - resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} + /@rollup/rollup-linux-arm64-musl@4.22.0: + resolution: {integrity: sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.21.3: - resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} + /@rollup/rollup-linux-powerpc64le-gnu@4.22.0: + resolution: {integrity: sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.21.3: - resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} + /@rollup/rollup-linux-riscv64-gnu@4.22.0: + resolution: {integrity: sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.21.3: - resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} + /@rollup/rollup-linux-s390x-gnu@4.22.0: + resolution: {integrity: sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.21.3: - resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} + /@rollup/rollup-linux-x64-gnu@4.22.0: + resolution: {integrity: sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.21.3: - resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} + /@rollup/rollup-linux-x64-musl@4.22.0: + resolution: {integrity: sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.21.3: - resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} + /@rollup/rollup-win32-arm64-msvc@4.22.0: + resolution: {integrity: sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.21.3: - resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} + /@rollup/rollup-win32-ia32-msvc@4.22.0: + resolution: {integrity: sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.21.3: - resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} + /@rollup/rollup-win32-x64-msvc@4.22.0: + resolution: {integrity: sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA==} cpu: [x64] os: [win32] requiresBuild: true @@ -12759,7 +12759,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001660 + caniuse-lite: 1.0.30001662 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 @@ -12775,7 +12775,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001660 + caniuse-lite: 1.0.30001662 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 @@ -12943,7 +12943,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001660 + caniuse-lite: 1.0.30001662 electron-to-chromium: 1.5.25 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -13075,8 +13075,8 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false - /caniuse-lite@1.0.30001660: - resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} + /caniuse-lite@1.0.30001662: + resolution: {integrity: sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==} /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -19926,7 +19926,7 @@ packages: '@next/env': 14.1.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001660 + caniuse-lite: 1.0.30001662 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -19966,7 +19966,7 @@ packages: '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001660 + caniuse-lite: 1.0.30001662 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -20007,7 +20007,7 @@ packages: '@next/env': 14.2.3 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001660 + caniuse-lite: 1.0.30001662 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -20050,7 +20050,7 @@ packages: '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001660 + caniuse-lite: 1.0.30001662 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -22379,29 +22379,29 @@ packages: source-map-support: 0.3.3 dev: false - /rollup@4.21.3: - resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} + /rollup@4.22.0: + resolution: {integrity: sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.3 - '@rollup/rollup-android-arm64': 4.21.3 - '@rollup/rollup-darwin-arm64': 4.21.3 - '@rollup/rollup-darwin-x64': 4.21.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 - '@rollup/rollup-linux-arm-musleabihf': 4.21.3 - '@rollup/rollup-linux-arm64-gnu': 4.21.3 - '@rollup/rollup-linux-arm64-musl': 4.21.3 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 - '@rollup/rollup-linux-riscv64-gnu': 4.21.3 - '@rollup/rollup-linux-s390x-gnu': 4.21.3 - '@rollup/rollup-linux-x64-gnu': 4.21.3 - '@rollup/rollup-linux-x64-musl': 4.21.3 - '@rollup/rollup-win32-arm64-msvc': 4.21.3 - '@rollup/rollup-win32-ia32-msvc': 4.21.3 - '@rollup/rollup-win32-x64-msvc': 4.21.3 + '@rollup/rollup-android-arm-eabi': 4.22.0 + '@rollup/rollup-android-arm64': 4.22.0 + '@rollup/rollup-darwin-arm64': 4.22.0 + '@rollup/rollup-darwin-x64': 4.22.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.22.0 + '@rollup/rollup-linux-arm-musleabihf': 4.22.0 + '@rollup/rollup-linux-arm64-gnu': 4.22.0 + '@rollup/rollup-linux-arm64-musl': 4.22.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.22.0 + '@rollup/rollup-linux-riscv64-gnu': 4.22.0 + '@rollup/rollup-linux-s390x-gnu': 4.22.0 + '@rollup/rollup-linux-x64-gnu': 4.22.0 + '@rollup/rollup-linux-x64-musl': 4.22.0 + '@rollup/rollup-win32-arm64-msvc': 4.22.0 + '@rollup/rollup-win32-ia32-msvc': 4.22.0 + '@rollup/rollup-win32-x64-msvc': 4.22.0 fsevents: 2.3.3 dev: true @@ -24000,7 +24000,7 @@ packages: joycon: 3.1.1 postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2) resolve-from: 5.0.0 - rollup: 4.21.3 + rollup: 4.22.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 @@ -24823,7 +24823,7 @@ packages: '@types/node': 20.14.9 esbuild: 0.21.5 postcss: 8.4.47 - rollup: 4.21.3 + rollup: 4.22.0 optionalDependencies: fsevents: 2.3.3 dev: true From cc0eeddc9b7e6c9c514d5350dd6559c28573db5b Mon Sep 17 00:00:00 2001 From: James P Date: Thu, 19 Sep 2024 12:48:31 -0400 Subject: [PATCH 7/7] fix: Improve errors and remove parser to get accurate toasts (#2115) * remove trpcError parser Update errors to handle DB fails which will give a user a good error if a DB operation fails * Fix root key to actually error * [autofix.ci] apply automated fixes * Update apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-name.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update apps/dashboard/app/(app)/settings/root-keys/[keyId]/update-root-key-name.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update update-key-name.tsx * [autofix.ci] apply automated fixes * Update update-root-key-name.tsx * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../keys/[keyAuthId]/[keyId]/role-toggle.tsx | 11 +-- .../[keyId]/settings/delete-key.tsx | 4 +- .../[keyId]/settings/update-key-enabled.tsx | 4 +- .../settings/update-key-expiration.tsx | 5 +- .../[keyId]/settings/update-key-metadata.tsx | 4 +- .../[keyId]/settings/update-key-name.tsx | 5 +- .../[keyId]/settings/update-key-owner-id.tsx | 5 +- .../[keyId]/settings/update-key-ratelimit.tsx | 5 +- .../[keyId]/settings/update-key-remaining.tsx | 9 +- .../[apiId]/keys/[keyAuthId]/new/client.tsx | 4 +- .../apis/[apiId]/settings/delete-api.tsx | 5 +- .../[apiId]/settings/delete-protection.tsx | 10 +- .../apis/[apiId]/settings/update-api-name.tsx | 4 +- .../[apiId]/settings/update-ip-whitelist.tsx | 5 +- .../app/(app)/apis/create-api-button.tsx | 6 +- .../permissions/[permissionId]/client.tsx | 6 -- .../[permissionId]/delete-permission.tsx | 6 -- .../permissions/create-new-permission.tsx | 6 -- .../roles/[roleId]/delete-role.tsx | 6 -- .../roles/[roleId]/permission-toggle.tsx | 11 +-- .../roles/[roleId]/update-role.tsx | 6 -- .../authorization/roles/create-new-role.tsx | 13 ++- .../dashboard/app/(app)/gateways/new/form.tsx | 16 +-- .../verifications/create-new-button.tsx | 6 -- .../overrides/[overrideId]/settings.tsx | 11 --- .../overrides/create-new-override.tsx | 6 -- .../settings/delete-namespace.tsx | 7 -- .../settings/update-namespace-name.tsx | 6 -- .../ratelimits/create-namespace-button.tsx | 6 -- apps/dashboard/app/(app)/secrets/new/form.tsx | 6 -- apps/dashboard/app/(app)/secrets/secrets.tsx | 12 +-- .../[gatewayId]/settings/delete-gateway.tsx | 6 +- .../app/(app)/semantic-cache/form.tsx | 6 -- .../(app)/settings/billing/plans/button.tsx | 6 +- .../general/update-workspace-name.tsx | 6 -- .../root-keys/[keyId]/permissions/legacy.tsx | 6 +- .../[keyId]/permissions/permission_toggle.tsx | 16 +-- .../[keyId]/update-root-key-name.tsx | 6 +- .../(app)/settings/root-keys/new/client.tsx | 4 +- .../app/(app)/settings/vercel/client.tsx | 23 +++-- .../[webhookId]/toggle-webhook-button.tsx | 6 -- .../webhooks/create-webhook-button.tsx | 6 -- .../integrations/vercel/callback/client.tsx | 11 ++- apps/dashboard/app/new/create-api.tsx | 6 -- .../app/new/create-semantic-cache.tsx | 6 -- apps/dashboard/app/new/create-workspace.tsx | 6 -- apps/dashboard/app/new/keys.tsx | 11 --- .../components/dashboard/command-menu.tsx | 6 +- apps/dashboard/lib/trpc/routers/api/create.ts | 15 ++- apps/dashboard/lib/trpc/routers/api/delete.ts | 22 +++-- .../routers/api/updateDeleteProtection.ts | 22 +++-- .../lib/trpc/routers/api/updateIpWhitelist.ts | 22 +++-- .../lib/trpc/routers/api/updateName.ts | 22 +++-- .../lib/trpc/routers/gateway/create.ts | 16 ++- apps/dashboard/lib/trpc/routers/key/create.ts | 36 +++++-- .../lib/trpc/routers/key/createRootKey.ts | 36 +++++-- apps/dashboard/lib/trpc/routers/key/delete.ts | 30 +++--- .../lib/trpc/routers/key/deleteRootKey.ts | 18 +++- .../lib/trpc/routers/key/updateEnabled.ts | 22 +++-- .../lib/trpc/routers/key/updateExpiration.ts | 22 +++-- .../lib/trpc/routers/key/updateMetadata.ts | 22 +++-- .../lib/trpc/routers/key/updateName.ts | 22 +++-- .../lib/trpc/routers/key/updateOwnerId.ts | 22 +++-- .../lib/trpc/routers/key/updateRatelimit.ts | 22 +++-- .../lib/trpc/routers/key/updateRemaining.ts | 22 +++-- .../lib/trpc/routers/key/updateRootKeyName.ts | 18 +++- .../lib/trpc/routers/llmGateway/create.ts | 21 +++- .../lib/trpc/routers/llmGateway/delete.ts | 26 +++-- .../routers/monitor/verification/create.ts | 28 ++++-- .../trpc/routers/ratelimit/createNamespace.ts | 21 +++- .../trpc/routers/ratelimit/createOverride.ts | 30 +++--- .../trpc/routers/ratelimit/deleteNamespace.ts | 28 ++++-- .../trpc/routers/ratelimit/deleteOverride.ts | 36 ++++--- .../routers/ratelimit/updateNamespaceName.ts | 26 +++-- .../trpc/routers/ratelimit/updateOverride.ts | 36 ++++--- .../routers/rbac/addPermissionToRootKey.ts | 16 ++- .../routers/rbac/connectPermissionToRole.ts | 30 +++--- .../lib/trpc/routers/rbac/connectRoleToKey.ts | 30 +++--- .../lib/trpc/routers/rbac/createPermission.ts | 16 ++- .../lib/trpc/routers/rbac/createRole.ts | 15 ++- .../lib/trpc/routers/rbac/deletePermission.ts | 24 +++-- .../lib/trpc/routers/rbac/deleteRole.ts | 23 +++-- .../rbac/disconnectPermissionFromRole.ts | 16 ++- .../routers/rbac/disconnectRoleFromKey.ts | 16 ++- .../rbac/removePermissionFromRootKey.ts | 50 ++++++---- .../lib/trpc/routers/rbac/updatePermission.ts | 24 +++-- .../lib/trpc/routers/rbac/updateRole.ts | 24 +++-- .../lib/trpc/routers/rbac/upsertPermission.ts | 15 ++- .../lib/trpc/routers/secrets/create.ts | 15 ++- .../lib/trpc/routers/secrets/decrypt.ts | 24 +++-- .../lib/trpc/routers/secrets/update.ts | 28 ++++-- .../lib/trpc/routers/webhook/create.ts | 99 +++++++++++++------ .../lib/trpc/routers/webhook/delete.ts | 24 +++-- .../lib/trpc/routers/webhook/toggle.ts | 24 +++-- .../lib/trpc/routers/workspace/changeName.ts | 16 ++- .../lib/trpc/routers/workspace/changePlan.ts | 24 ++++- .../lib/trpc/routers/workspace/optIntoBeta.ts | 16 ++- apps/dashboard/lib/utils.ts | 5 - 98 files changed, 938 insertions(+), 652 deletions(-) diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/role-toggle.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/role-toggle.tsx index 7cd3f7568..f6c8a855d 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/role-toggle.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/role-toggle.tsx @@ -3,7 +3,6 @@ import { Checkbox } from "@/components/ui/checkbox"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { Loader2 } from "lucide-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; @@ -33,10 +32,9 @@ export const RoleToggle: React.FC = ({ roleId, keyId, checked }) => { }, }); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, onSettled: () => { router.refresh(); @@ -58,10 +56,9 @@ export const RoleToggle: React.FC = ({ roleId, keyId, checked }) => { }, }); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, onSettled: () => { router.refresh(); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/delete-key.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/delete-key.tsx index 18485bcbe..531ce15e4 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/delete-key.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/delete-key.tsx @@ -17,7 +17,6 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { useRouter } from "next/navigation"; type Props = { @@ -39,8 +38,7 @@ export const DeleteKey: React.FC = ({ apiKey, keyAuthId }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-enabled.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-enabled.tsx index be0fbb76f..24c1dcfe6 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-enabled.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-enabled.tsx @@ -13,7 +13,6 @@ import { Form, FormControl, FormField, FormItem, FormLabel } from "@/components/ import { Switch } from "@/components/ui/switch"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; @@ -52,8 +51,7 @@ export const UpdateKeyEnabled: React.FC = ({ apiKey }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-expiration.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-expiration.tsx index 794e17ac6..6e4a51f63 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-expiration.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-expiration.tsx @@ -22,7 +22,7 @@ import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { format } from "date-fns"; @@ -74,8 +74,7 @@ export const UpdateKeyExpiration: React.FC = ({ apiKey }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-metadata.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-metadata.tsx index 97ec9821f..37d06d77f 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-metadata.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-metadata.tsx @@ -14,7 +14,6 @@ import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; @@ -54,8 +53,7 @@ export const UpdateKeyMetadata: React.FC = ({ apiKey }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-name.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-name.tsx index fce5e20b6..7981ec5b8 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-name.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-name.tsx @@ -14,7 +14,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; @@ -56,8 +56,7 @@ export const UpdateKeyName: React.FC = ({ apiKey }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-owner-id.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-owner-id.tsx index b8b6e973a..bc471b242 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-owner-id.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-owner-id.tsx @@ -14,7 +14,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; @@ -57,8 +57,7 @@ export const UpdateKeyOwnerId: React.FC = ({ apiKey }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-ratelimit.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-ratelimit.tsx index cad71ef73..720816f16 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-ratelimit.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-ratelimit.tsx @@ -23,7 +23,7 @@ import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import type { Key } from "@unkey/db"; import { useRouter } from "next/navigation"; @@ -90,8 +90,7 @@ export const UpdateKeyRatelimit: React.FC = ({ apiKey }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-remaining.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-remaining.tsx index 8054500e0..5030b6308 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-remaining.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/settings/update-key-remaining.tsx @@ -30,7 +30,7 @@ import { import { Switch } from "@/components/ui/switch"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; @@ -95,14 +95,15 @@ export const UpdateKeyRemaining: React.FC = ({ apiKey }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); async function onSubmit(values: z.infer) { if (values.refill?.interval !== "none" && !values.refill?.amount) { - form.setError("refill.amount", { message: "Please enter the number of uses per interval" }); + form.setError("refill.amount", { + message: "Please enter the number of uses per interval", + }); return; } if (values.refill.interval !== "none" && values.remaining === undefined) { diff --git a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx index 99a264dcd..e8102431b 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/new/client.tsx @@ -30,7 +30,6 @@ import { Switch } from "@/components/ui/switch"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { AlertCircle } from "lucide-react"; import Link from "next/link"; @@ -176,8 +175,7 @@ export const CreateKey: React.FC = ({ apiId, keyAuthId }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/settings/delete-api.tsx b/apps/dashboard/app/(app)/apis/[apiId]/settings/delete-api.tsx index 8ae150c45..b4629fa8e 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/settings/delete-api.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/settings/delete-api.tsx @@ -31,7 +31,7 @@ import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { z } from "zod"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; import { revalidate } from "./actions"; type Props = { @@ -74,8 +74,7 @@ export const DeleteApi: React.FC = ({ api, keys }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/[apiId]/settings/delete-protection.tsx b/apps/dashboard/app/(app)/apis/[apiId]/settings/delete-protection.tsx index e186c0194..a7d3b8d7e 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/settings/delete-protection.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/settings/delete-protection.tsx @@ -29,8 +29,6 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { z } from "zod"; - -import { parseTrpcError } from "@/lib/utils"; import { revalidate } from "./actions"; type Props = { @@ -68,15 +66,17 @@ export const DeleteProtection: React.FC = ({ api }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); const isValid = form.watch("name") === api.name; async function onSubmit(_: z.infer) { - updateDeleteProtection.mutate({ apiId: api.id, enabled: !api.deleteProtection }); + updateDeleteProtection.mutate({ + apiId: api.id, + enabled: !api.deleteProtection, + }); } if (api.deleteProtection) { diff --git a/apps/dashboard/app/(app)/apis/[apiId]/settings/update-api-name.tsx b/apps/dashboard/app/(app)/apis/[apiId]/settings/update-api-name.tsx index 52a219811..bf3502aa0 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/settings/update-api-name.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/settings/update-api-name.tsx @@ -13,7 +13,6 @@ import { FormField } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; @@ -50,8 +49,7 @@ export const UpdateApiName: React.FC = ({ api }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/apis/[apiId]/settings/update-ip-whitelist.tsx b/apps/dashboard/app/(app)/apis/[apiId]/settings/update-ip-whitelist.tsx index e188e4e5b..4f1ca6437 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/settings/update-ip-whitelist.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/settings/update-ip-whitelist.tsx @@ -14,7 +14,7 @@ import { FormField } from "@/components/ui/form"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import type { Workspace } from "@unkey/db"; import Link from "next/link"; @@ -60,8 +60,7 @@ export const UpdateIpWhitelist: React.FC = ({ api, workspace }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/apis/create-api-button.tsx b/apps/dashboard/app/(app)/apis/create-api-button.tsx index 3cd3b862f..a53ab6de9 100644 --- a/apps/dashboard/app/(app)/apis/create-api-button.tsx +++ b/apps/dashboard/app/(app)/apis/create-api-button.tsx @@ -14,7 +14,6 @@ import { import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { Plus } from "lucide-react"; import { useRouter } from "next/navigation"; @@ -38,9 +37,8 @@ export const CreateApiButton = ({ ...rest }: React.ButtonHTMLAttributes) { diff --git a/apps/dashboard/app/(app)/authorization/permissions/[permissionId]/client.tsx b/apps/dashboard/app/(app)/authorization/permissions/[permissionId]/client.tsx index 949d27b51..725971d8e 100644 --- a/apps/dashboard/app/(app)/authorization/permissions/[permissionId]/client.tsx +++ b/apps/dashboard/app/(app)/authorization/permissions/[permissionId]/client.tsx @@ -17,7 +17,6 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import type { Permission } from "@unkey/db"; import { useRouter } from "next/navigation"; @@ -50,11 +49,6 @@ export const Client: React.FC = ({ permission }) => { toast.success("Permission updated"); router.refresh(); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/authorization/permissions/[permissionId]/delete-permission.tsx b/apps/dashboard/app/(app)/authorization/permissions/[permissionId]/delete-permission.tsx index f26f6db3e..691c130ac 100644 --- a/apps/dashboard/app/(app)/authorization/permissions/[permissionId]/delete-permission.tsx +++ b/apps/dashboard/app/(app)/authorization/permissions/[permissionId]/delete-permission.tsx @@ -23,7 +23,6 @@ import { import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { DialogTrigger } from "@radix-ui/react-dialog"; import { useRouter } from "next/navigation"; @@ -60,11 +59,6 @@ export const DeletePermission: React.FC = ({ trigger, permission }) => { revalidate("/authorization/permissions"); router.push("/authorization/permissions"); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit() { diff --git a/apps/dashboard/app/(app)/authorization/permissions/create-new-permission.tsx b/apps/dashboard/app/(app)/authorization/permissions/create-new-permission.tsx index e43a4317d..95865b7f5 100644 --- a/apps/dashboard/app/(app)/authorization/permissions/create-new-permission.tsx +++ b/apps/dashboard/app/(app)/authorization/permissions/create-new-permission.tsx @@ -25,7 +25,6 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { DialogTrigger } from "@radix-ui/react-dialog"; import { useRouter } from "next/navigation"; @@ -68,11 +67,6 @@ export const CreateNewPermission: React.FC = ({ trigger }) => { }); setOpen(false); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/authorization/roles/[roleId]/delete-role.tsx b/apps/dashboard/app/(app)/authorization/roles/[roleId]/delete-role.tsx index 96fe0ae77..a82b26581 100644 --- a/apps/dashboard/app/(app)/authorization/roles/[roleId]/delete-role.tsx +++ b/apps/dashboard/app/(app)/authorization/roles/[roleId]/delete-role.tsx @@ -22,7 +22,6 @@ import { import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { DialogTrigger } from "@radix-ui/react-dialog"; import { useRouter } from "next/navigation"; @@ -61,11 +60,6 @@ export const DeleteRole: React.FC = ({ trigger, role }) => { toast.success("Role deleted successfully"); router.push("/authorization/roles"); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit() { diff --git a/apps/dashboard/app/(app)/authorization/roles/[roleId]/permission-toggle.tsx b/apps/dashboard/app/(app)/authorization/roles/[roleId]/permission-toggle.tsx index 6d8d4c9ae..0e1e509ac 100644 --- a/apps/dashboard/app/(app)/authorization/roles/[roleId]/permission-toggle.tsx +++ b/apps/dashboard/app/(app)/authorization/roles/[roleId]/permission-toggle.tsx @@ -3,7 +3,6 @@ import { Checkbox } from "@/components/ui/checkbox"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { Loader2 } from "lucide-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; @@ -33,10 +32,9 @@ export const PermissionToggle: React.FC = ({ roleId, permissionId, checke }, }); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, onSettled: () => { router.refresh(); @@ -58,10 +56,9 @@ export const PermissionToggle: React.FC = ({ roleId, permissionId, checke }, }); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, onSettled: () => { router.refresh(); diff --git a/apps/dashboard/app/(app)/authorization/roles/[roleId]/update-role.tsx b/apps/dashboard/app/(app)/authorization/roles/[roleId]/update-role.tsx index e14f51a87..2ea3a2a6b 100644 --- a/apps/dashboard/app/(app)/authorization/roles/[roleId]/update-role.tsx +++ b/apps/dashboard/app/(app)/authorization/roles/[roleId]/update-role.tsx @@ -23,7 +23,6 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { DialogTrigger } from "@radix-ui/react-dialog"; import type { Role } from "@unkey/db"; @@ -63,11 +62,6 @@ export const UpdateRole: React.FC = ({ trigger, role }) => { router.refresh(); setOpen(false); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/authorization/roles/create-new-role.tsx b/apps/dashboard/app/(app)/authorization/roles/create-new-role.tsx index 279c7b9fb..c9840ee2d 100644 --- a/apps/dashboard/app/(app)/authorization/roles/create-new-role.tsx +++ b/apps/dashboard/app/(app)/authorization/roles/create-new-role.tsx @@ -26,7 +26,6 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { DialogTrigger } from "@radix-ui/react-dialog"; import type { Permission } from "@unkey/db"; @@ -81,11 +80,8 @@ export const CreateNewRole: React.FC = ({ trigger, permissions }) => { router.push(`/authorization/roles/${roleId}`); }, onError(err) { - console.error(err.message); - let temp = JSON.parse(err.message); - temp = temp.at(0).message; - const message = parseTrpcError(err); - toast.error(message); + console.error(err); + toast.error(err.message); }, }); @@ -161,7 +157,10 @@ export const CreateNewRole: React.FC = ({ trigger, permissions }) => { ({ label: p.name, value: p.id }))} + options={permissions.map((p) => ({ + label: p.name, + value: p.id, + }))} selected={field.value ?? []} setSelected={(cb) => { if (typeof cb === "function") { diff --git a/apps/dashboard/app/(app)/gateways/new/form.tsx b/apps/dashboard/app/(app)/gateways/new/form.tsx index fd2a525aa..50cd4f3f4 100644 --- a/apps/dashboard/app/(app)/gateways/new/form.tsx +++ b/apps/dashboard/app/(app)/gateways/new/form.tsx @@ -24,7 +24,6 @@ import { } from "@/components/ui/table"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import * as AccordionPrimitive from "@radix-ui/react-accordion"; import { ChevronDown, Eye, EyeOff, X } from "lucide-react"; @@ -52,7 +51,10 @@ export const CreateGatewayForm: React.FC = () => { shouldFocusError: true, }); - const fields = useFieldArray({ control: form.control, name: "headerRewrites" }); + const fields = useFieldArray({ + control: form.control, + name: "headerRewrites", + }); const create = trpc.gateway.create.useMutation({ onSuccess(_, variables) { toast.success("Gateway Created", { @@ -66,11 +68,6 @@ export const CreateGatewayForm: React.FC = () => { }, }); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { @@ -245,7 +242,10 @@ export const CreateGatewayForm: React.FC = () => { variant="secondary" size="icon" onClick={() => { - fields.update(index, { ...f, show: !f.show }); + fields.update(index, { + ...f, + show: !f.show, + }); }} > {f.show ? ( diff --git a/apps/dashboard/app/(app)/monitors/verifications/create-new-button.tsx b/apps/dashboard/app/(app)/monitors/verifications/create-new-button.tsx index 0fc22aef0..9ed8aeb53 100644 --- a/apps/dashboard/app/(app)/monitors/verifications/create-new-button.tsx +++ b/apps/dashboard/app/(app)/monitors/verifications/create-new-button.tsx @@ -21,7 +21,6 @@ import { } from "@/components/ui/select"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import type { Workspace } from "@unkey/db"; import { Plus } from "lucide-react"; @@ -60,11 +59,6 @@ export const CreateNewMonitorButton: React.FC = ({ workspace, keySpaces } router.refresh(); router.push("/webhooks"); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { create.mutate({ diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/[overrideId]/settings.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/[overrideId]/settings.tsx index 95e6cf1a8..fad55095a 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/[overrideId]/settings.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/[overrideId]/settings.tsx @@ -30,7 +30,6 @@ import { } from "@/components/ui/select"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import type React from "react"; @@ -80,11 +79,6 @@ export const UpdateCard: React.FC = ({ overrideId, defaultValues }) => { }); router.refresh(); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); const deleteOverride = trpc.ratelimit.override.delete.useMutation({ @@ -94,11 +88,6 @@ export const UpdateCard: React.FC = ({ overrideId, defaultValues }) => { }); router.push("/ratelimits/"); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/create-new-override.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/create-new-override.tsx index 00d16c58a..5d2151470 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/create-new-override.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/create-new-override.tsx @@ -21,7 +21,6 @@ import { } from "@/components/ui/select"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter, useSearchParams } from "next/navigation"; import type React from "react"; @@ -64,11 +63,6 @@ export const CreateNewOverride: React.FC = ({ namespaceId }) => { }); router.refresh(); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { create.mutate({ diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/delete-namespace.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/delete-namespace.tsx index 00f5bba45..b38cc7950 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/delete-namespace.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/delete-namespace.tsx @@ -30,8 +30,6 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { z } from "zod"; - -import { parseTrpcError } from "@/lib/utils"; import { revalidate } from "./actions"; type Props = { @@ -67,11 +65,6 @@ export const DeleteNamespace: React.FC = ({ namespace }) => { router.push("/ratelimits"); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); const isValid = form.watch("intent") === intent && form.watch("name") === namespace.name; diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/update-namespace-name.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/update-namespace-name.tsx index ff2aa9c23..abbdddc3b 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/update-namespace-name.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/update-namespace-name.tsx @@ -13,7 +13,6 @@ import { FormField } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; @@ -48,11 +47,6 @@ export const UpdateNamespaceName: React.FC = ({ namespace }) => { toast.success("Your namespace name has been renamed!"); router.refresh(); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { if (values.name === namespace.name || !values.name) { diff --git a/apps/dashboard/app/(app)/ratelimits/create-namespace-button.tsx b/apps/dashboard/app/(app)/ratelimits/create-namespace-button.tsx index 5b18d80d8..32b8367c5 100644 --- a/apps/dashboard/app/(app)/ratelimits/create-namespace-button.tsx +++ b/apps/dashboard/app/(app)/ratelimits/create-namespace-button.tsx @@ -14,7 +14,6 @@ import { import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { Plus } from "lucide-react"; import { useRouter } from "next/navigation"; @@ -39,11 +38,6 @@ export const CreateNamespaceButton = ({ router.refresh(); router.push(`/ratelimits/${res.id}`); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { create.mutate(values); diff --git a/apps/dashboard/app/(app)/secrets/new/form.tsx b/apps/dashboard/app/(app)/secrets/new/form.tsx index 8be5c86fe..17fd321ea 100644 --- a/apps/dashboard/app/(app)/secrets/new/form.tsx +++ b/apps/dashboard/app/(app)/secrets/new/form.tsx @@ -13,7 +13,6 @@ import { Input } from "@/components/ui/input"; import { Separator } from "@/components/ui/separator"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; @@ -38,11 +37,6 @@ export const CreateSecretForm: React.FC = () => { toast.success("Secret created"); router.refresh(); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/secrets/secrets.tsx b/apps/dashboard/app/(app)/secrets/secrets.tsx index 8aeac725f..a07af8b87 100644 --- a/apps/dashboard/app/(app)/secrets/secrets.tsx +++ b/apps/dashboard/app/(app)/secrets/secrets.tsx @@ -30,7 +30,7 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Separator } from "@/components/ui/separator"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; type Props = { secrets: Secret[]; @@ -93,11 +93,6 @@ const Row: React.FC<{ secret: Secret }> = ({ secret }) => { toast.success("Secret updated"); router.refresh(); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { @@ -229,10 +224,9 @@ const Row: React.FC<{ secret: Secret }> = ({ secret }) => { const Value: React.FC<{ secretId: string }> = ({ secretId }) => { const decrypt = trpc.secrets.decrypt.useMutation({ - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/semantic-cache/[gatewayId]/settings/delete-gateway.tsx b/apps/dashboard/app/(app)/semantic-cache/[gatewayId]/settings/delete-gateway.tsx index b71021751..9ec6c59c0 100644 --- a/apps/dashboard/app/(app)/semantic-cache/[gatewayId]/settings/delete-gateway.tsx +++ b/apps/dashboard/app/(app)/semantic-cache/[gatewayId]/settings/delete-gateway.tsx @@ -26,7 +26,6 @@ import { FormMessage, } from "@/components/ui/form"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { PostHogEvent } from "@/providers/PostHogProvider"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; @@ -71,10 +70,9 @@ export const DeleteGateway: React.FC = ({ gateway }) => { router.push("/semantic-cache"); }, - onError(err: { message: string }) { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/semantic-cache/form.tsx b/apps/dashboard/app/(app)/semantic-cache/form.tsx index e65c33e68..a2c2d46b3 100644 --- a/apps/dashboard/app/(app)/semantic-cache/form.tsx +++ b/apps/dashboard/app/(app)/semantic-cache/form.tsx @@ -12,7 +12,6 @@ import { } from "@/components/ui/form"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { PostHogEvent } from "@/providers/PostHogProvider"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; @@ -47,11 +46,6 @@ export const CreateLLMGatewayForm: React.FC = () => { }); router.push(`/semantic-cache/${res.id}/logs`); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/settings/billing/plans/button.tsx b/apps/dashboard/app/(app)/settings/billing/plans/button.tsx index 530033ad7..fa15a8a15 100644 --- a/apps/dashboard/app/(app)/settings/billing/plans/button.tsx +++ b/apps/dashboard/app/(app)/settings/billing/plans/button.tsx @@ -12,7 +12,6 @@ import { } from "@/components/ui/dialog"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { PostHogEvent } from "@/providers/PostHogProvider"; import type { Workspace } from "@unkey/db"; import { useRouter } from "next/navigation"; @@ -40,10 +39,9 @@ export const ChangePlanButton: React.FC = ({ workspace, newPlan, label }) setOpen(false); router.refresh(); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/settings/general/update-workspace-name.tsx b/apps/dashboard/app/(app)/settings/general/update-workspace-name.tsx index d7ed9a39c..a2a2b82f5 100644 --- a/apps/dashboard/app/(app)/settings/general/update-workspace-name.tsx +++ b/apps/dashboard/app/(app)/settings/general/update-workspace-name.tsx @@ -6,7 +6,6 @@ import { Form, FormControl, FormField, FormItem, FormMessage } from "@/component import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { useUser } from "@clerk/nextjs"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; @@ -46,11 +45,6 @@ export const UpdateWorkspaceName: React.FC = ({ workspace }) => { user?.reload(); router.refresh(); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onSubmit(values: z.infer) { diff --git a/apps/dashboard/app/(app)/settings/root-keys/[keyId]/permissions/legacy.tsx b/apps/dashboard/app/(app)/settings/root-keys/[keyId]/permissions/legacy.tsx index 25fe2f617..3198381f7 100644 --- a/apps/dashboard/app/(app)/settings/root-keys/[keyId]/permissions/legacy.tsx +++ b/apps/dashboard/app/(app)/settings/root-keys/[keyId]/permissions/legacy.tsx @@ -12,7 +12,6 @@ import { } from "@/components/ui/card"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import type { Permission } from "@unkey/db"; import { Loader2 } from "lucide-react"; import { useRouter } from "next/navigation"; @@ -31,10 +30,9 @@ export const Legacy: React.FC = ({ keyId, permissions }) => { }); router.refresh(); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, onSettled: () => {}, }); diff --git a/apps/dashboard/app/(app)/settings/root-keys/[keyId]/permissions/permission_toggle.tsx b/apps/dashboard/app/(app)/settings/root-keys/[keyId]/permissions/permission_toggle.tsx index f463f1305..c23c8322c 100644 --- a/apps/dashboard/app/(app)/settings/root-keys/[keyId]/permissions/permission_toggle.tsx +++ b/apps/dashboard/app/(app)/settings/root-keys/[keyId]/permissions/permission_toggle.tsx @@ -6,7 +6,6 @@ import { Label } from "@/components/ui/label"; import { toast } from "@/components/ui/toaster"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { Loader2 } from "lucide-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; @@ -41,10 +40,9 @@ export const PermissionToggle: React.FC = ({ description: "Changes may take up to 60 seconds to take effect.", }); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, onSettled: () => { router.refresh(); @@ -65,10 +63,9 @@ export const PermissionToggle: React.FC = ({ }, }); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, onSettled: () => { router.refresh(); @@ -98,7 +95,10 @@ export const PermissionToggle: React.FC = ({ } } else { if (!preventEnabling) { - addPermission.mutate({ rootKeyId, permission: permissionName }); + addPermission.mutate({ + rootKeyId, + permission: permissionName, + }); } } }} diff --git a/apps/dashboard/app/(app)/settings/root-keys/[keyId]/update-root-key-name.tsx b/apps/dashboard/app/(app)/settings/root-keys/[keyId]/update-root-key-name.tsx index aeb6d5c35..976d408dc 100644 --- a/apps/dashboard/app/(app)/settings/root-keys/[keyId]/update-root-key-name.tsx +++ b/apps/dashboard/app/(app)/settings/root-keys/[keyId]/update-root-key-name.tsx @@ -14,12 +14,11 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { cn, parseTrpcError } from "@/lib/utils"; +import { cn } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { z } from "zod"; - const formSchema = z.object({ keyId: z.string(), name: z @@ -55,8 +54,7 @@ export const UpdateRootKeyName: React.FC = ({ apiKey }) => { }, onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/settings/root-keys/new/client.tsx b/apps/dashboard/app/(app)/settings/root-keys/new/client.tsx index f5a879de9..80ebc511b 100644 --- a/apps/dashboard/app/(app)/settings/root-keys/new/client.tsx +++ b/apps/dashboard/app/(app)/settings/root-keys/new/client.tsx @@ -21,7 +21,6 @@ import { Label } from "@/components/ui/label"; import { toast } from "@/components/ui/toaster"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import type { UnkeyPermission } from "@unkey/rbac"; import { useRouter } from "next/navigation"; import { useState } from "react"; @@ -41,8 +40,7 @@ export const Client: React.FC = ({ apis }) => { const key = trpc.rootKey.create.useMutation({ onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/app/(app)/settings/vercel/client.tsx b/apps/dashboard/app/(app)/settings/vercel/client.tsx index c2850c9ca..29dc4eaa6 100644 --- a/apps/dashboard/app/(app)/settings/vercel/client.tsx +++ b/apps/dashboard/app/(app)/settings/vercel/client.tsx @@ -24,7 +24,6 @@ import { import { toast } from "@/components/ui/toaster"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { cn } from "@/lib/utils"; import type { Api, Key, VercelBinding } from "@unkey/db"; import { ExternalLink, Link2, MoreHorizontal, Plus, RefreshCw, Trash, Unlink2 } from "lucide-react"; @@ -214,10 +213,9 @@ const ConnectedResource: React.FC<{ router.refresh(); toast.success("Updated the environment variable in Vercel"); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); @@ -228,10 +226,9 @@ const ConnectedResource: React.FC<{ "Successfully rolled your root key and updated the environment variable in Vercel", ); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); const unbind = trpc.vercel.unbind.useMutation({ @@ -239,10 +236,9 @@ const ConnectedResource: React.FC<{ router.refresh(); toast.success(`Successfully unbound ${props.type} from Vercel`); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); @@ -300,8 +296,11 @@ const ConnectedResource: React.FC<{ <> - Edited {ms(Date.now() - props.binding?.updatedAt.getTime(), { long: true })} ago - by {props.binding?.updatedBy.name} + Edited{" "} + {ms(Date.now() - props.binding?.updatedAt.getTime(), { + long: true, + })}{" "} + ago by {props.binding?.updatedBy.name} = ({ webhook }) => { onSuccess() { router.refresh(); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function action(enabled: boolean) { diff --git a/apps/dashboard/app/(app)/settings/webhooks/create-webhook-button.tsx b/apps/dashboard/app/(app)/settings/webhooks/create-webhook-button.tsx index 2780a3d7b..4e2b68e24 100644 --- a/apps/dashboard/app/(app)/settings/webhooks/create-webhook-button.tsx +++ b/apps/dashboard/app/(app)/settings/webhooks/create-webhook-button.tsx @@ -15,7 +15,6 @@ import { Input } from "@/components/ui/input"; import { Select } from "@/components/ui/select"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { Plus } from "lucide-react"; import { useRouter } from "next/navigation"; @@ -41,11 +40,6 @@ export const CreateWebhookButton = ({ ...rest }: React.ButtonHTMLAttributes) { create.mutate(values); diff --git a/apps/dashboard/app/integrations/vercel/callback/client.tsx b/apps/dashboard/app/integrations/vercel/callback/client.tsx index ac3c72572..0a2840b62 100644 --- a/apps/dashboard/app/integrations/vercel/callback/client.tsx +++ b/apps/dashboard/app/integrations/vercel/callback/client.tsx @@ -13,7 +13,6 @@ import { } from "@/components/ui/select"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import type { Api, VercelBinding } from "@unkey/db"; import { X } from "lucide-react"; import { useRouter } from "next/navigation"; @@ -59,10 +58,9 @@ export const Client: React.FC = ({ toast("Redirecting back to Vercel"); router.push(returnUrl); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); @@ -138,7 +136,10 @@ export const Client: React.FC = ({ variant="ghost" size="icon" onClick={() => { - setSelectedApis({ ...selectedApis, [environment]: null }); + setSelectedApis({ + ...selectedApis, + [environment]: null, + }); }} > diff --git a/apps/dashboard/app/new/create-api.tsx b/apps/dashboard/app/new/create-api.tsx index aaabd300b..e1180af3a 100644 --- a/apps/dashboard/app/new/create-api.tsx +++ b/apps/dashboard/app/new/create-api.tsx @@ -14,7 +14,6 @@ import { import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { PostHogIdentify } from "@/providers/PostHogProvider"; import { useUser } from "@clerk/nextjs"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -49,11 +48,6 @@ export const CreateApi: React.FC = ({ workspace }) => { form.reset(); router.push(`/new?workspaceId=${workspace.id}&apiId=${apiId}`); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); function AsideContent() { return ( diff --git a/apps/dashboard/app/new/create-semantic-cache.tsx b/apps/dashboard/app/new/create-semantic-cache.tsx index 8278e8de9..76243f70a 100644 --- a/apps/dashboard/app/new/create-semantic-cache.tsx +++ b/apps/dashboard/app/new/create-semantic-cache.tsx @@ -3,7 +3,6 @@ import { Button } from "@/components/ui/button"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { PostHogEvent } from "@/providers/PostHogProvider"; import { useRouter } from "next/navigation"; import { generateSemanticCacheDefaultName } from "../(app)/semantic-cache/new/util/generate-semantic-cache-default-name"; @@ -23,11 +22,6 @@ export const CreateSemanticCacheButton: React.FC = () => { }); router.push(`/semantic-cache/${res.id}/settings`); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); async function onClick() { createGateway.mutate({ diff --git a/apps/dashboard/app/new/create-workspace.tsx b/apps/dashboard/app/new/create-workspace.tsx index 72ecff8d7..0c9f10cd6 100644 --- a/apps/dashboard/app/new/create-workspace.tsx +++ b/apps/dashboard/app/new/create-workspace.tsx @@ -15,7 +15,6 @@ import { import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { useOrganizationList } from "@clerk/nextjs"; import { zodResolver } from "@hookform/resolvers/zod"; import { Box } from "lucide-react"; @@ -43,11 +42,6 @@ export const CreateWorkspace: React.FC = () => { } router.push(`/new?workspaceId=${workspace.id}`); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); function AsideContent() { diff --git a/apps/dashboard/app/new/keys.tsx b/apps/dashboard/app/new/keys.tsx index b483e5820..29758c324 100644 --- a/apps/dashboard/app/new/keys.tsx +++ b/apps/dashboard/app/new/keys.tsx @@ -18,7 +18,6 @@ import { Code } from "@/components/ui/code"; import { Separator } from "@/components/ui/separator"; import { toast } from "@/components/ui/toaster"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { AlertCircle, KeyRound, Lock } from "lucide-react"; import Link from "next/link"; import { useState } from "react"; @@ -51,21 +50,11 @@ export const Keys: React.FC = ({ keyAuthId, apiId }) => { onSuccess(res) { setStep({ step: "CREATE_KEY", rootKey: res.key }); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); const key = trpc.key.create.useMutation({ onSuccess(res) { setStep({ step: "VERIFY_KEY", key: res.key }); }, - onError(err) { - console.error(err); - const message = parseTrpcError(err); - toast.error(message); - }, }); const [showKey, setShowKey] = useState(false); diff --git a/apps/dashboard/components/dashboard/command-menu.tsx b/apps/dashboard/components/dashboard/command-menu.tsx index 7beacaace..c30941e49 100644 --- a/apps/dashboard/components/dashboard/command-menu.tsx +++ b/apps/dashboard/components/dashboard/command-menu.tsx @@ -16,7 +16,6 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { trpc } from "@/lib/trpc/client"; -import { parseTrpcError } from "@/lib/utils"; import { zodResolver } from "@hookform/resolvers/zod"; import { BookOpen, type LucideIcon, MessagesSquare } from "lucide-react"; import { useRouter } from "next/navigation"; @@ -137,10 +136,9 @@ const Feedback: React.FC = () => { setOpen(false); toast.success("Your issue has been created, we'll get back to you as soon as possible"); }, - onError: (err) => { + onError(err) { console.error(err); - const message = parseTrpcError(err); - toast.error(message); + toast.error(err.message); }, }); diff --git a/apps/dashboard/lib/trpc/routers/api/create.ts b/apps/dashboard/lib/trpc/routers/api/create.ts index 6748756dd..5f18aaf05 100644 --- a/apps/dashboard/lib/trpc/routers/api/create.ts +++ b/apps/dashboard/lib/trpc/routers/api/create.ts @@ -16,10 +16,17 @@ export const createApi = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ input, ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "We are unable to create an API. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/api/delete.ts b/apps/dashboard/lib/trpc/routers/api/delete.ts index 93f0d4ac0..6d39f9735 100644 --- a/apps/dashboard/lib/trpc/routers/api/delete.ts +++ b/apps/dashboard/lib/trpc/routers/api/delete.ts @@ -12,13 +12,21 @@ export const deleteApi = rateLimitedProcedure(ratelimit.delete) }), ) .mutation(async ({ ctx, input }) => { - const api = await db.query.apis.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.apiId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const api = await db.query.apis + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.apiId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to delete this API. Please contact support using support@unkey.dev", + }); + }); if (!api || api.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/api/updateDeleteProtection.ts b/apps/dashboard/lib/trpc/routers/api/updateDeleteProtection.ts index e3f48f50f..d9ba23a64 100644 --- a/apps/dashboard/lib/trpc/routers/api/updateDeleteProtection.ts +++ b/apps/dashboard/lib/trpc/routers/api/updateDeleteProtection.ts @@ -13,13 +13,21 @@ export const updateAPIDeleteProtection = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ ctx, input }) => { - const api = await db.query.apis.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.apiId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const api = await db.query.apis + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.apiId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update the API. Please contact support using support@unkey.dev", + }); + }); if (!api || api.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/api/updateIpWhitelist.ts b/apps/dashboard/lib/trpc/routers/api/updateIpWhitelist.ts index ad746d178..028cb536c 100644 --- a/apps/dashboard/lib/trpc/routers/api/updateIpWhitelist.ts +++ b/apps/dashboard/lib/trpc/routers/api/updateIpWhitelist.ts @@ -28,13 +28,21 @@ export const updateApiIpWhitelist = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const api = await db.query.apis.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.apiId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const api = await db.query.apis + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.apiId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to update the API whitelist. Please contact support using support@unkey.dev", + }); + }); if (!api || api.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/api/updateName.ts b/apps/dashboard/lib/trpc/routers/api/updateName.ts index 7d6c85ba9..35ccb48c4 100644 --- a/apps/dashboard/lib/trpc/routers/api/updateName.ts +++ b/apps/dashboard/lib/trpc/routers/api/updateName.ts @@ -14,13 +14,21 @@ export const updateApiName = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ ctx, input }) => { - const api = await db.query.apis.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.apiId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const api = await db.query.apis + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.apiId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update the API name. Please contact support using support@unkey.dev.", + }); + }); if (!api || api.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/gateway/create.ts b/apps/dashboard/lib/trpc/routers/gateway/create.ts index f714ff15e..1d8e3659c 100644 --- a/apps/dashboard/lib/trpc/routers/gateway/create.ts +++ b/apps/dashboard/lib/trpc/routers/gateway/create.ts @@ -25,10 +25,18 @@ export const createGateway = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to create to create a gateway. Please contact support using support@unkey.dev.", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/key/create.ts b/apps/dashboard/lib/trpc/routers/key/create.ts index 5c5c34a66..864fffb8e 100644 --- a/apps/dashboard/lib/trpc/routers/key/create.ts +++ b/apps/dashboard/lib/trpc/routers/key/create.ts @@ -35,10 +35,18 @@ export const createKey = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to create a key for this API. Please contact support using support@unkey.dev.", + }); + }); if (!workspace) { throw new TRPCError({ code: "NOT_FOUND", @@ -47,12 +55,20 @@ export const createKey = rateLimitedProcedure(ratelimit.create) }); } - const keyAuth = await db.query.keyAuth.findFirst({ - where: (table, { eq }) => eq(table.id, input.keyAuthId), - with: { - api: true, - }, - }); + const keyAuth = await db.query.keyAuth + .findFirst({ + where: (table, { eq }) => eq(table.id, input.keyAuthId), + with: { + api: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to create a key for this API. Please contact support using support@unkey.dev.", + }); + }); if (!keyAuth || keyAuth.workspaceId !== workspace.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/key/createRootKey.ts b/apps/dashboard/lib/trpc/routers/key/createRootKey.ts index 4f23f3dbc..ad3ec4434 100644 --- a/apps/dashboard/lib/trpc/routers/key/createRootKey.ts +++ b/apps/dashboard/lib/trpc/routers/key/createRootKey.ts @@ -20,10 +20,18 @@ export const createRootKey = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ ctx, input }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to create a root key for this workspace. Please contact support using support@unkey.dev.", + }); + }); if (!workspace) { throw new TRPCError({ code: "NOT_FOUND", @@ -32,12 +40,20 @@ export const createRootKey = rateLimitedProcedure(ratelimit.create) }); } - const unkeyApi = await db.query.apis.findFirst({ - where: eq(schema.apis.id, env().UNKEY_API_ID), - with: { - workspace: true, - }, - }); + const unkeyApi = await db.query.apis + .findFirst({ + where: eq(schema.apis.id, env().UNKEY_API_ID), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to create a rootkey for this workspace. Please contact support using support@unkey.dev.", + }); + }); if (!unkeyApi) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/key/delete.ts b/apps/dashboard/lib/trpc/routers/key/delete.ts index 51348260d..edaca43a7 100644 --- a/apps/dashboard/lib/trpc/routers/key/delete.ts +++ b/apps/dashboard/lib/trpc/routers/key/delete.ts @@ -11,19 +11,27 @@ export const deleteKeys = rateLimitedProcedure(ratelimit.delete) }), ) .mutation(async ({ ctx, input }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - keys: { - where: (table, { and, inArray, isNull }) => - and(isNull(table.deletedAt), inArray(table.id, input.keyIds)), - columns: { - id: true, + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + keys: { + where: (table, { and, inArray, isNull }) => + and(isNull(table.deletedAt), inArray(table.id, input.keyIds)), + columns: { + id: true, + }, }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to delete this key. Please contact support using support@unkey.dev.", + }); + }); if (!workspace) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/key/deleteRootKey.ts b/apps/dashboard/lib/trpc/routers/key/deleteRootKey.ts index 1c08336b1..61a27cbf1 100644 --- a/apps/dashboard/lib/trpc/routers/key/deleteRootKey.ts +++ b/apps/dashboard/lib/trpc/routers/key/deleteRootKey.ts @@ -12,10 +12,18 @@ export const deleteRootKeys = rateLimitedProcedure(ratelimit.delete) }), ) .mutation(async ({ ctx, input }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to delete this root key. Please contact support using support@unkey.dev.", + }); + }); if (!workspace) { throw new TRPCError({ @@ -51,7 +59,7 @@ export const deleteRootKeys = rateLimitedProcedure(ratelimit.delete) throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: - "We are unable to delete the rootkey. Please contact support using support@unkey.dev", + "We are unable to delete the root key. Please contact support using support@unkey.dev", }); }); diff --git a/apps/dashboard/lib/trpc/routers/key/updateEnabled.ts b/apps/dashboard/lib/trpc/routers/key/updateEnabled.ts index b14bfe94c..e8c68d3c7 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateEnabled.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateEnabled.ts @@ -12,13 +12,21 @@ export const updateKeyEnabled = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const key = await db.query.keys.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.keyId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const key = await db.query.keys + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.keyId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update enabled on this key. Please contact support using support@unkey.dev", + }); + }); if (!key || key.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/key/updateExpiration.ts b/apps/dashboard/lib/trpc/routers/key/updateExpiration.ts index 7886b4731..76df73131 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateExpiration.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateExpiration.ts @@ -33,13 +33,21 @@ export const updateKeyExpiration = rateLimitedProcedure(ratelimit.update) } } - const key = await db.query.keys.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.keyId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const key = await db.query.keys + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.keyId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update expiration on this key. Please contact support using support@unkey.dev", + }); + }); if (!key || key.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ message: diff --git a/apps/dashboard/lib/trpc/routers/key/updateMetadata.ts b/apps/dashboard/lib/trpc/routers/key/updateMetadata.ts index 4bc208d5f..b2f8c316f 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateMetadata.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateMetadata.ts @@ -26,13 +26,21 @@ export const updateKeyMetadata = rateLimitedProcedure(ratelimit.update) }); } } - const key = await db.query.keys.findFirst({ - where: (table, { eq, isNull, and }) => - and(eq(table.id, input.keyId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const key = await db.query.keys + .findFirst({ + where: (table, { eq, isNull, and }) => + and(eq(table.id, input.keyId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update metadata on this key. Please contact support using support@unkey.dev", + }); + }); if (!key || key.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ message: diff --git a/apps/dashboard/lib/trpc/routers/key/updateName.ts b/apps/dashboard/lib/trpc/routers/key/updateName.ts index 0929d7d8d..33ef712e2 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateName.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateName.ts @@ -14,13 +14,21 @@ export const updateKeyName = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const key = await db.query.keys.findFirst({ - where: (table, { eq, isNull, and }) => - and(eq(table.id, input.keyId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const key = await db.query.keys + .findFirst({ + where: (table, { eq, isNull, and }) => + and(eq(table.id, input.keyId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update the name on this key. Please contact support using support@unkey.dev", + }); + }); if (!key || key.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ message: diff --git a/apps/dashboard/lib/trpc/routers/key/updateOwnerId.ts b/apps/dashboard/lib/trpc/routers/key/updateOwnerId.ts index 2745763dc..fa15f4fbc 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateOwnerId.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateOwnerId.ts @@ -13,13 +13,21 @@ export const updateKeyOwnerId = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const key = await db.query.keys.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.keyId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const key = await db.query.keys + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.keyId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update ownerId on this key. Please contact support using support@unkey.dev", + }); + }); if (!key || key.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ message: diff --git a/apps/dashboard/lib/trpc/routers/key/updateRatelimit.ts b/apps/dashboard/lib/trpc/routers/key/updateRatelimit.ts index b02b61d59..3d20ca933 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateRatelimit.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateRatelimit.ts @@ -16,13 +16,21 @@ export const updateKeyRatelimit = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const key = await db.query.keys.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.keyId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const key = await db.query.keys + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.keyId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update ratelimits on this key. Please contact support using support@unkey.dev", + }); + }); if (!key || key.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ message: diff --git a/apps/dashboard/lib/trpc/routers/key/updateRemaining.ts b/apps/dashboard/lib/trpc/routers/key/updateRemaining.ts index 6aecf1365..d0589f998 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateRemaining.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateRemaining.ts @@ -27,13 +27,21 @@ export const updateKeyRemaining = rateLimitedProcedure(ratelimit.update) input.refill = undefined; } - const key = await db.query.keys.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.keyId), isNull(table.deletedAt)), - with: { - workspace: true, - }, - }); + const key = await db.query.keys + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.keyId), isNull(table.deletedAt)), + with: { + workspace: true, + }, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update remaining limits on this key. Please contact support using support@unkey.dev", + }); + }); if (!key || key.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ message: diff --git a/apps/dashboard/lib/trpc/routers/key/updateRootKeyName.ts b/apps/dashboard/lib/trpc/routers/key/updateRootKeyName.ts index 6e8102a80..3d2db9049 100644 --- a/apps/dashboard/lib/trpc/routers/key/updateRootKeyName.ts +++ b/apps/dashboard/lib/trpc/routers/key/updateRootKeyName.ts @@ -19,10 +19,18 @@ export const updateRootKeyName = t.procedure and(eq(table.id, input.keyId), isNull(table.deletedAt)), }); - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to update root key name. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ @@ -50,7 +58,7 @@ export const updateRootKeyName = t.procedure throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: - "We are unable to update name on this key. Please contact support using support@unkey.dev", + "We are unable to update root key name. Please contact support using support@unkey.dev", }); }); diff --git a/apps/dashboard/lib/trpc/routers/llmGateway/create.ts b/apps/dashboard/lib/trpc/routers/llmGateway/create.ts index eb2ee39c8..b823a68fc 100644 --- a/apps/dashboard/lib/trpc/routers/llmGateway/create.ts +++ b/apps/dashboard/lib/trpc/routers/llmGateway/create.ts @@ -13,10 +13,18 @@ export const createLlmGateway = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ input, ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We were unable to create LLM gateway. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", @@ -43,7 +51,10 @@ export const createLlmGateway = rateLimitedProcedure(ratelimit.create) "Gateway subdomains must have unique names. Please try a different subdomain.
If you believe this is an error and the subdomain should not be in use already, please contact support at support@unkey.dev", }); } - throw err; + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Unable to create gateway, please contact support at support@unkey.dev", + }); }); await ingestAuditLogs({ diff --git a/apps/dashboard/lib/trpc/routers/llmGateway/delete.ts b/apps/dashboard/lib/trpc/routers/llmGateway/delete.ts index 3a1fec218..32d1752e8 100644 --- a/apps/dashboard/lib/trpc/routers/llmGateway/delete.ts +++ b/apps/dashboard/lib/trpc/routers/llmGateway/delete.ts @@ -8,17 +8,25 @@ import { rateLimitedProcedure, ratelimit } from "@/lib/trpc/ratelimitProcedure"; export const deleteLlmGateway = rateLimitedProcedure(ratelimit.delete) .input(z.object({ gatewayId: z.string() })) .mutation(async ({ ctx, input }) => { - const llmGateway = await db.query.llmGateways.findFirst({ - where: (table, { eq, and }) => and(eq(table.id, input.gatewayId)), - with: { - workspace: { - columns: { - id: true, - tenantId: true, + const llmGateway = await db.query.llmGateways + .findFirst({ + where: (table, { eq, and }) => and(eq(table.id, input.gatewayId)), + with: { + workspace: { + columns: { + id: true, + tenantId: true, + }, }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to delete LLM gateway. Please contact support using support@unkey.dev", + }); + }); if (!llmGateway || llmGateway.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/monitor/verification/create.ts b/apps/dashboard/lib/trpc/routers/monitor/verification/create.ts index b66754a1e..cd2a7e601 100644 --- a/apps/dashboard/lib/trpc/routers/monitor/verification/create.ts +++ b/apps/dashboard/lib/trpc/routers/monitor/verification/create.ts @@ -18,16 +18,26 @@ export const createVerificationMonitor = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ input, ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - keySpaces: { where: (table, { eq }) => eq(table.id, input.keySpaceId) }, - webhooks: { - where: (table, { eq }) => eq(table.destination, input.webhookUrl), + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + keySpaces: { + where: (table, { eq }) => eq(table.id, input.keySpaceId), + }, + webhooks: { + where: (table, { eq }) => eq(table.destination, input.webhookUrl), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create the reporter. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts b/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts index 6438b49a1..7850622b9 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts @@ -14,10 +14,18 @@ export const createNamespace = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ input, ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create a new namespace. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", @@ -42,7 +50,10 @@ export const createNamespace = rateLimitedProcedure(ratelimit.create) message: "duplicate namespace name. Please use a unique name for each namespace.", }); } - throw e; + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "We are unable to create namspace. Please contact support using support@unkey.dev", + }); } await ingestAuditLogs({ diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts b/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts index 69ce306c6..bf9bf1cf6 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts @@ -17,19 +17,27 @@ export const createOverride = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ input, ctx }) => { - const namespace = await db.query.ratelimitNamespaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.id, input.namespaceId), isNull(table.deletedAt)), - with: { - workspace: { - columns: { - id: true, - tenantId: true, - features: true, + const namespace = await db.query.ratelimitNamespaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.id, input.namespaceId), isNull(table.deletedAt)), + with: { + workspace: { + columns: { + id: true, + tenantId: true, + features: true, + }, }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create an override for this namespace. Please contact support using support@unkey.dev", + }); + }); if (!namespace || namespace.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/deleteNamespace.ts b/apps/dashboard/lib/trpc/routers/ratelimit/deleteNamespace.ts index 8c939c034..90b1a7d09 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/deleteNamespace.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/deleteNamespace.ts @@ -12,19 +12,27 @@ export const deleteNamespace = rateLimitedProcedure(ratelimit.delete) }), ) .mutation(async ({ ctx, input }) => { - const namespace = await db.query.ratelimitNamespaces.findFirst({ - where: (table, { eq, and, isNull }) => - and(eq(table.id, input.namespaceId), isNull(table.deletedAt)), + const namespace = await db.query.ratelimitNamespaces + .findFirst({ + where: (table, { eq, and, isNull }) => + and(eq(table.id, input.namespaceId), isNull(table.deletedAt)), - with: { - workspace: { - columns: { - id: true, - tenantId: true, + with: { + workspace: { + columns: { + id: true, + tenantId: true, + }, }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to delete namespace. Please contact support using support@unkey.dev", + }); + }); if (!namespace || namespace.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/deleteOverride.ts b/apps/dashboard/lib/trpc/routers/ratelimit/deleteOverride.ts index 1698fdc2a..625ddb4c2 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/deleteOverride.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/deleteOverride.ts @@ -12,24 +12,32 @@ export const deleteOverride = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ ctx, input }) => { - const override = await db.query.ratelimitOverrides.findFirst({ - where: (table, { and, eq, isNull }) => and(eq(table.id, input.id), isNull(table.deletedAt)), - with: { - namespace: { - columns: { - id: true, - }, - with: { - workspace: { - columns: { - id: true, - tenantId: true, + const override = await db.query.ratelimitOverrides + .findFirst({ + where: (table, { and, eq, isNull }) => and(eq(table.id, input.id), isNull(table.deletedAt)), + with: { + namespace: { + columns: { + id: true, + }, + with: { + workspace: { + columns: { + id: true, + tenantId: true, + }, }, }, }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to delete override for this namespace. Please contact support using support@unkey.dev", + }); + }); if (!override || override.namespace.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/updateNamespaceName.ts b/apps/dashboard/lib/trpc/routers/ratelimit/updateNamespaceName.ts index 703a09085..bae313116 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/updateNamespaceName.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/updateNamespaceName.ts @@ -14,16 +14,24 @@ export const updateNamespaceName = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ ctx, input }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.id, input.workspaceId), isNull(table.deletedAt)), - with: { - ratelimitNamespaces: { - where: (table, { eq, and, isNull }) => - and(isNull(table.deletedAt), eq(schema.ratelimitNamespaces.id, input.namespaceId)), + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.id, input.workspaceId), isNull(table.deletedAt)), + with: { + ratelimitNamespaces: { + where: (table, { eq, and, isNull }) => + and(isNull(table.deletedAt), eq(schema.ratelimitNamespaces.id, input.namespaceId)), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to update the name for this namespace. Please contact support using support@unkey.dev", + }); + }); if (!ws || ws.tenantId !== ctx.tenant.id) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts b/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts index c2f3f23cd..b7097519f 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts @@ -15,24 +15,32 @@ export const updateOverride = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ ctx, input }) => { - const override = await db.query.ratelimitOverrides.findFirst({ - where: (table, { and, eq, isNull }) => and(eq(table.id, input.id), isNull(table.deletedAt)), - with: { - namespace: { - columns: { - id: true, - }, - with: { - workspace: { - columns: { - id: true, - tenantId: true, + const override = await db.query.ratelimitOverrides + .findFirst({ + where: (table, { and, eq, isNull }) => and(eq(table.id, input.id), isNull(table.deletedAt)), + with: { + namespace: { + columns: { + id: true, + }, + with: { + workspace: { + columns: { + id: true, + tenantId: true, + }, }, }, }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to update this override for this namespae. Please contact support using support@unkey.dev", + }); + }); if (!override || override.namespace.workspace.tenantId !== ctx.tenant.id) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/rbac/addPermissionToRootKey.ts b/apps/dashboard/lib/trpc/routers/rbac/addPermissionToRootKey.ts index f08810b0f..149c10b45 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/addPermissionToRootKey.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/addPermissionToRootKey.ts @@ -22,10 +22,18 @@ export const addPermissionToRootKey = rateLimitedProcedure(ratelimit.create) }); } - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to add permission to the rootkey. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/rbac/connectPermissionToRole.ts b/apps/dashboard/lib/trpc/routers/rbac/connectPermissionToRole.ts index abad5c9dc..02f77b483 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/connectPermissionToRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/connectPermissionToRole.ts @@ -11,18 +11,26 @@ export const connectPermissionToRole = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - roles: { - where: (table, { eq }) => eq(table.id, input.roleId), + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + roles: { + where: (table, { eq }) => eq(table.id, input.roleId), + }, + permissions: { + where: (table, { eq }) => eq(table.id, input.permissionId), + }, }, - permissions: { - where: (table, { eq }) => eq(table.id, input.permissionId), - }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to connect this permission to role. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/rbac/connectRoleToKey.ts b/apps/dashboard/lib/trpc/routers/rbac/connectRoleToKey.ts index a7997ac33..10b13c913 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/connectRoleToKey.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/connectRoleToKey.ts @@ -12,18 +12,26 @@ export const connectRoleToKey = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - roles: { - where: (table, { eq }) => eq(table.id, input.roleId), + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + roles: { + where: (table, { eq }) => eq(table.id, input.roleId), + }, + keys: { + where: (table, { eq }) => eq(table.id, input.keyId), + }, }, - keys: { - where: (table, { eq }) => eq(table.id, input.keyId), - }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to connect the role to the key. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/rbac/createPermission.ts b/apps/dashboard/lib/trpc/routers/rbac/createPermission.ts index 809f35d96..240a68391 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/createPermission.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/createPermission.ts @@ -21,10 +21,18 @@ export const createPermission = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create permission. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/rbac/createRole.ts b/apps/dashboard/lib/trpc/routers/rbac/createRole.ts index e30504ea8..931d24511 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/createRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/createRole.ts @@ -22,10 +22,17 @@ export const createRole = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "We are unable to create role. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/rbac/deletePermission.ts b/apps/dashboard/lib/trpc/routers/rbac/deletePermission.ts index b3293c7d3..371e243fd 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/deletePermission.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/deletePermission.ts @@ -11,15 +11,23 @@ export const deletePermission = rateLimitedProcedure(ratelimit.delete) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - permissions: { - where: (table, { eq }) => eq(table.id, input.permissionId), + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + permissions: { + where: (table, { eq }) => eq(table.id, input.permissionId), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to delete this permission. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/rbac/deleteRole.ts b/apps/dashboard/lib/trpc/routers/rbac/deleteRole.ts index ec4023640..0e249a90a 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/deleteRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/deleteRole.ts @@ -11,15 +11,22 @@ export const deleteRole = rateLimitedProcedure(ratelimit.delete) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - roles: { - where: (table, { eq }) => eq(table.id, input.roleId), + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + roles: { + where: (table, { eq }) => eq(table.id, input.roleId), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "We are unable to delete role. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/rbac/disconnectPermissionFromRole.ts b/apps/dashboard/lib/trpc/routers/rbac/disconnectPermissionFromRole.ts index 259611143..5f9e8436d 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/disconnectPermissionFromRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/disconnectPermissionFromRole.ts @@ -12,10 +12,18 @@ export const disconnectPermissionFromRole = rateLimitedProcedure(ratelimit.updat }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to remove permission from the role. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/rbac/disconnectRoleFromKey.ts b/apps/dashboard/lib/trpc/routers/rbac/disconnectRoleFromKey.ts index 1d27092af..4a101c17e 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/disconnectRoleFromKey.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/disconnectRoleFromKey.ts @@ -12,10 +12,18 @@ export const disconnectRoleFromKey = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to disconnect the role from the key. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/rbac/removePermissionFromRootKey.ts b/apps/dashboard/lib/trpc/routers/rbac/removePermissionFromRootKey.ts index 6628d1daf..90a9b6704 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/removePermissionFromRootKey.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/removePermissionFromRootKey.ts @@ -12,10 +12,18 @@ export const removePermissionFromRootKey = rateLimitedProcedure(ratelimit.update }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to remove permission from the root key. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ @@ -25,21 +33,29 @@ export const removePermissionFromRootKey = rateLimitedProcedure(ratelimit.update }); } - const key = await db.query.keys.findFirst({ - where: (table, { and, eq, isNull }) => - and( - eq(schema.keys.forWorkspaceId, workspace.id), - eq(schema.keys.id, input.rootKeyId), - isNull(table.deletedAt), - ), - with: { - permissions: { - with: { - permission: true, + const key = await db.query.keys + .findFirst({ + where: (table, { and, eq, isNull }) => + and( + eq(schema.keys.forWorkspaceId, workspace.id), + eq(schema.keys.id, input.rootKeyId), + isNull(table.deletedAt), + ), + with: { + permissions: { + with: { + permission: true, + }, }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to remove permission from the root key. Please contact support using support@unkey.dev", + }); + }); if (!key) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/rbac/updatePermission.ts b/apps/dashboard/lib/trpc/routers/rbac/updatePermission.ts index db19d599d..fe1c3b926 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/updatePermission.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/updatePermission.ts @@ -21,15 +21,23 @@ export const updatePermission = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - permissions: { - where: (table, { eq }) => eq(table.id, input.id), + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + permissions: { + where: (table, { eq }) => eq(table.id, input.id), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to update permission. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/rbac/updateRole.ts b/apps/dashboard/lib/trpc/routers/rbac/updateRole.ts index 89fc88014..2787e5750 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/updateRole.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/updateRole.ts @@ -21,15 +21,23 @@ export const updateRole = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - roles: { - where: (table, { eq }) => eq(table.id, input.id), + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + roles: { + where: (table, { eq }) => eq(table.id, input.id), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to update the role. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ diff --git a/apps/dashboard/lib/trpc/routers/rbac/upsertPermission.ts b/apps/dashboard/lib/trpc/routers/rbac/upsertPermission.ts index c2006489c..8a1d85933 100644 --- a/apps/dashboard/lib/trpc/routers/rbac/upsertPermission.ts +++ b/apps/dashboard/lib/trpc/routers/rbac/upsertPermission.ts @@ -10,9 +10,18 @@ export async function upsertPermission( name: string, ): Promise { return await db.transaction(async (tx) => { - const existingPermission = await tx.query.permissions.findFirst({ - where: (table, { and, eq }) => and(eq(table.workspaceId, workspaceId), eq(table.name, name)), - }); + const existingPermission = await tx.query.permissions + .findFirst({ + where: (table, { and, eq }) => + and(eq(table.workspaceId, workspaceId), eq(table.name, name)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to upsert the permission. Please contact support using support@unkey.dev", + }); + }); if (existingPermission) { return existingPermission; } diff --git a/apps/dashboard/lib/trpc/routers/secrets/create.ts b/apps/dashboard/lib/trpc/routers/secrets/create.ts index 750fd1fc1..aa2ff1955 100644 --- a/apps/dashboard/lib/trpc/routers/secrets/create.ts +++ b/apps/dashboard/lib/trpc/routers/secrets/create.ts @@ -17,10 +17,17 @@ export const createSecret = rateLimitedProcedure(ratelimit.create) }), ) .mutation(async ({ ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "We are unable to create secret. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/secrets/decrypt.ts b/apps/dashboard/lib/trpc/routers/secrets/decrypt.ts index d50861674..1c46ffb01 100644 --- a/apps/dashboard/lib/trpc/routers/secrets/decrypt.ts +++ b/apps/dashboard/lib/trpc/routers/secrets/decrypt.ts @@ -16,15 +16,23 @@ export const decryptSecret = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - secrets: { - where: (table, { eq }) => eq(table.id, input.secretId), + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + secrets: { + where: (table, { eq }) => eq(table.id, input.secretId), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to decrypt the secret. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/secrets/update.ts b/apps/dashboard/lib/trpc/routers/secrets/update.ts index f93d89993..cd11b3ec1 100644 --- a/apps/dashboard/lib/trpc/routers/secrets/update.ts +++ b/apps/dashboard/lib/trpc/routers/secrets/update.ts @@ -15,15 +15,22 @@ export const updateSecret = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - secrets: { - where: (table, { eq }) => eq(table.id, input.secretId), + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + secrets: { + where: (table, { eq }) => eq(table.id, input.secretId), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "We are unable to update secret. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", @@ -60,7 +67,10 @@ export const updateSecret = rateLimitedProcedure(ratelimit.update) } if (Object.keys(update).length === 0) { - throw new TRPCError({ code: "PRECONDITION_FAILED", message: "No change detected" }); + throw new TRPCError({ + code: "PRECONDITION_FAILED", + message: "No change detected", + }); } await db diff --git a/apps/dashboard/lib/trpc/routers/webhook/create.ts b/apps/dashboard/lib/trpc/routers/webhook/create.ts index 50b59f757..da78246de 100644 --- a/apps/dashboard/lib/trpc/routers/webhook/create.ts +++ b/apps/dashboard/lib/trpc/routers/webhook/create.ts @@ -17,10 +17,18 @@ export const createWebhook = rateLimitedProcedure(ratelimit.create) ) .mutation(async ({ ctx }) => { const { UNKEY_WORKSPACE_ID, UNKEY_WEBHOOK_KEYS_API_ID } = env(); - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create a webhook. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", @@ -37,9 +45,17 @@ export const createWebhook = rateLimitedProcedure(ratelimit.create) prefix: "whsec", byteLength: 16, }); - const api = await db.query.apis.findFirst({ - where: (table, { eq }) => eq(table.id, UNKEY_WEBHOOK_KEYS_API_ID), - }); + const api = await db.query.apis + .findFirst({ + where: (table, { eq }) => eq(table.id, UNKEY_WEBHOOK_KEYS_API_ID), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create a webhook. Please contact support using support@unkey.dev", + }); + }); if (!api?.keyAuthId) { throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", @@ -50,29 +66,56 @@ export const createWebhook = rateLimitedProcedure(ratelimit.create) const webhookId = newId("webhook"); const keyId = newId("key"); - await db.insert(schema.keys).values({ - id: keyId, - keyAuthId: api.keyAuthId, - hash, - start, - meta: JSON.stringify({ - webhookId, - }), - workspaceId: UNKEY_WORKSPACE_ID, - createdAt: new Date(), - }); + await db + .insert(schema.keys) + .values({ + id: keyId, + keyAuthId: api.keyAuthId, + hash, + start, + meta: JSON.stringify({ + webhookId, + }), + workspaceId: UNKEY_WORKSPACE_ID, + createdAt: new Date(), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create webhook. Please contact support using support@unkey.dev", + }); + }); const permissionId = newId("permission"); - await db.insert(schema.permissions).values({ - id: permissionId, - name: `webhook.${webhookId}.verify`, - workspaceId: UNKEY_WORKSPACE_ID, - }); - await db.insert(schema.keysPermissions).values({ - keyId, - permissionId, - workspaceId: UNKEY_WORKSPACE_ID, - }); + await db + .insert(schema.permissions) + .values({ + id: permissionId, + name: `webhook.${webhookId}.verify`, + workspaceId: UNKEY_WORKSPACE_ID, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create webhook. Please contact support using support@unkey.dev", + }); + }); + await db + .insert(schema.keysPermissions) + .values({ + keyId, + permissionId, + workspaceId: UNKEY_WORKSPACE_ID, + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to create webhook. Please contact support using support@unkey.dev", + }); + }); await ingestAuditLogs({ workspaceId: UNKEY_WORKSPACE_ID, diff --git a/apps/dashboard/lib/trpc/routers/webhook/delete.ts b/apps/dashboard/lib/trpc/routers/webhook/delete.ts index 3f9c303d4..e0b00eb4b 100644 --- a/apps/dashboard/lib/trpc/routers/webhook/delete.ts +++ b/apps/dashboard/lib/trpc/routers/webhook/delete.ts @@ -11,15 +11,23 @@ export const deleteWebhook = rateLimitedProcedure(ratelimit.delete) }), ) .mutation(async ({ input, ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - webhooks: { - where: (table, { eq }) => eq(table.id, input.webhookId), + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + webhooks: { + where: (table, { eq }) => eq(table.id, input.webhookId), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to delete webhook. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/webhook/toggle.ts b/apps/dashboard/lib/trpc/routers/webhook/toggle.ts index 164bb288a..edfd1403d 100644 --- a/apps/dashboard/lib/trpc/routers/webhook/toggle.ts +++ b/apps/dashboard/lib/trpc/routers/webhook/toggle.ts @@ -12,15 +12,23 @@ export const toggleWebhook = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ input, ctx }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - with: { - webhooks: { - where: (table, { eq }) => eq(table.id, input.webhookId), + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + with: { + webhooks: { + where: (table, { eq }) => eq(table.id, input.webhookId), + }, }, - }, - }); + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to update webhook. Please contact support using support@unkey.dev", + }); + }); if (!ws) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/apps/dashboard/lib/trpc/routers/workspace/changeName.ts b/apps/dashboard/lib/trpc/routers/workspace/changeName.ts index 577762c25..1820a4f27 100644 --- a/apps/dashboard/lib/trpc/routers/workspace/changeName.ts +++ b/apps/dashboard/lib/trpc/routers/workspace/changeName.ts @@ -13,10 +13,18 @@ export const changeWorkspaceName = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ ctx, input }) => { - const ws = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.id, input.workspaceId), isNull(table.deletedAt)), - }); + const ws = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.id, input.workspaceId), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to update the workspace name. Please contact support using support@unkey.dev", + }); + }); if (!ws || ws.tenantId !== ctx.tenant.id) { throw new Error("Workspace not found, Please sign back in and try again"); } diff --git a/apps/dashboard/lib/trpc/routers/workspace/changePlan.ts b/apps/dashboard/lib/trpc/routers/workspace/changePlan.ts index 2f6303e46..1182aa15f 100644 --- a/apps/dashboard/lib/trpc/routers/workspace/changePlan.ts +++ b/apps/dashboard/lib/trpc/routers/workspace/changePlan.ts @@ -26,10 +26,17 @@ export const changeWorkspacePlan = rateLimitedProcedure(ratelimit.update) apiVersion: "2023-10-16", typescript: true, }); - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.id, input.workspaceId), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.id, input.workspaceId), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "We are unable to change plans. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ @@ -68,7 +75,14 @@ export const changeWorkspacePlan = rateLimitedProcedure(ratelimit.update) .set({ planDowngradeRequest: null, }) - .where(eq(schema.workspaces.id, input.workspaceId)); + .where(eq(schema.workspaces.id, input.workspaceId)) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable to change the plan on your workspace. Please contact support using support@unkey.dev", + }); + }); await ingestAuditLogs({ workspaceId: workspace.id, actor: { type: "user", id: ctx.user.id }, diff --git a/apps/dashboard/lib/trpc/routers/workspace/optIntoBeta.ts b/apps/dashboard/lib/trpc/routers/workspace/optIntoBeta.ts index 7ffa2b6ae..74c7333bc 100644 --- a/apps/dashboard/lib/trpc/routers/workspace/optIntoBeta.ts +++ b/apps/dashboard/lib/trpc/routers/workspace/optIntoBeta.ts @@ -11,10 +11,18 @@ export const optWorkspaceIntoBeta = rateLimitedProcedure(ratelimit.update) }), ) .mutation(async ({ ctx, input }) => { - const workspace = await db.query.workspaces.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), - }); + const workspace = await db.query.workspaces + .findFirst({ + where: (table, { and, eq, isNull }) => + and(eq(table.tenantId, ctx.tenant.id), isNull(table.deletedAt)), + }) + .catch((_err) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "We are unable opt you in to this beta feature. Please contact support using support@unkey.dev", + }); + }); if (!workspace) { throw new TRPCError({ diff --git a/apps/dashboard/lib/utils.ts b/apps/dashboard/lib/utils.ts index 1f01fc955..02cac50d8 100644 --- a/apps/dashboard/lib/utils.ts +++ b/apps/dashboard/lib/utils.ts @@ -5,8 +5,3 @@ export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } export const isBrowser = typeof window !== "undefined"; - -export function parseTrpcError(error: { message: string }): string { - const messages = JSON.parse(error.message) as Array<{ message: string }>; - return messages.at(0)?.message ?? "Unknown error, please contact support@unkey.dev"; -}