diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ab33a8f37..91c98b81f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -42,6 +42,7 @@ jobs: "PUBLIC_GROWTH_ENDPOINT=${{ secrets.PUBLIC_GROWTH_ENDPOINT }}" "PUBLIC_STRIPE_KEY=${{ secrets.PUBLIC_STRIPE_KEY }}" "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" + "SENTRY_RELEASE=${{ github.event.release.tag_name }}" publish-cloud-stage: runs-on: ubuntu-latest steps: diff --git a/Dockerfile b/Dockerfile index 2730dccb9..45263f235 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN npm i -g corepack@latest RUN corepack enable +RUN corepack prepare pnpm@10.0.0 --activate ADD ./package.json /app/package.json ADD ./pnpm-lock.yaml /app/pnpm-lock.yaml @@ -24,12 +25,14 @@ ARG PUBLIC_APPWRITE_ENDPOINT ARG PUBLIC_GROWTH_ENDPOINT ARG PUBLIC_STRIPE_KEY ARG SENTRY_AUTH_TOKEN +ARG SENTRY_RELEASE ENV PUBLIC_APPWRITE_ENDPOINT=$PUBLIC_APPWRITE_ENDPOINT ENV PUBLIC_GROWTH_ENDPOINT=$PUBLIC_GROWTH_ENDPOINT ENV PUBLIC_CONSOLE_MODE=$PUBLIC_CONSOLE_MODE ENV PUBLIC_STRIPE_KEY=$PUBLIC_STRIPE_KEY ENV SENTRY_AUTH_TOKEN=$SENTRY_AUTH_TOKEN +ENV SENTRY_RELEASE=$SENTRY_RELEASE ENV NODE_OPTIONS=--max_old_space_size=8192 RUN pnpm run build @@ -39,4 +42,4 @@ FROM nginx:1.25-alpine EXPOSE 80 COPY docker/nginx.conf /etc/nginx/conf.d/default.conf -COPY --from=build /app/build /usr/share/nginx/html/console \ No newline at end of file +COPY --from=build /app/build /usr/share/nginx/html/console diff --git a/package.json b/package.json index de203a8b9..f0ef3aee1 100644 --- a/package.json +++ b/package.json @@ -21,11 +21,13 @@ "e2e:ui": "playwright test --ui" }, "dependencies": { - "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9", + "@ai-sdk/svelte": "^1.1.22", + "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1", + "@appwrite.io/pink": "0.25.0", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0", + "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@504c653", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", "@stripe/stripe-js": "^3.5.0", diff --git a/playwright.config.ts b/playwright.config.ts index bad8f9fca..de119fa1f 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -13,7 +13,7 @@ const config: PlaywrightTestConfig = { webServer: { timeout: 120000, env: { - PUBLIC_APPWRITE_ENDPOINT: 'https://console-testing-2.appwrite.org/v1', + PUBLIC_APPWRITE_ENDPOINT: 'https://stage.cloud.appwrite.io/v1', PUBLIC_CONSOLE_MODE: 'cloud', PUBLIC_STRIPE_KEY: 'pk_test_51LT5nsGYD1ySxNCyd7b304wPD8Y1XKKWR6hqo6cu3GIRwgvcVNzoZv4vKt5DfYXL1gRGw4JOqE19afwkJYJq1g3K004eVfpdWn' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd44cbe66..78e5ecd08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,33 +8,39 @@ importers: .: dependencies: + '@ai-sdk/svelte': + specifier: ^1.1.22 + version: 1.1.22(svelte@5.25.3)(zod@3.24.3) '@appwrite.io/console': - specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9 - version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9 + specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1 + version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1 + '@appwrite.io/pink': + specifier: 0.25.0 + version: 0.25.0 '@appwrite.io/pink-icons': specifier: 0.25.0 version: 0.25.0 '@appwrite.io/pink-icons-svelte': specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.27.0) + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.25.3) '@appwrite.io/pink-legacy': specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0 - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0(react-dom@18.3.1(react@18.3.1))(svelte@5.27.0) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@504c653 + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@504c653(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 '@sentry/sveltekit': specifier: ^8.38.0 - version: 8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0)(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + version: 8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0)(@sveltejs/kit@2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) '@stripe/stripe-js': specifier: ^3.5.0 version: 3.5.0 ai: specifier: ^2.2.37 - version: 2.2.37(react@18.3.1)(solid-js@1.9.5)(svelte@5.27.0)(vue@3.5.13(typescript@5.8.3)) + version: 2.2.37(react@18.3.1)(solid-js@1.9.5)(svelte@5.25.3)(vue@3.5.13(typescript@5.8.2)) analytics: specifier: ^0.8.16 version: 0.8.16(@types/dlv@1.1.5) @@ -73,35 +79,35 @@ importers: version: 2.0.1 svelte-confetti: specifier: ^1.4.0 - version: 1.4.0(svelte@5.27.0) + version: 1.4.0(svelte@5.25.3) tippy.js: specifier: ^6.3.7 version: 6.3.7 devDependencies: '@eslint/compat': specifier: ^1.2.7 - version: 1.2.8(eslint@9.24.0) + version: 1.2.7(eslint@9.23.0) '@eslint/js': specifier: ^9.24.0 version: 9.24.0 '@melt-ui/pp': specifier: ^0.3.2 - version: 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.27.0))(svelte@5.27.0) + version: 0.3.2(@melt-ui/svelte@0.86.5(svelte@5.25.3))(svelte@5.25.3) '@melt-ui/svelte': specifier: ^0.86.5 - version: 0.86.6(svelte@5.27.0) + version: 0.86.5(svelte@5.25.3) '@playwright/test': specifier: ^1.51.1 version: 1.51.1 '@sveltejs/adapter-static': specifier: ^3.0.8 - version: 3.0.8(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3))) + version: 3.0.8(@sveltejs/kit@2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0))) '@sveltejs/kit': specifier: ^2.20.2 - version: 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + version: 2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + version: 5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -110,7 +116,7 @@ importers: version: 6.6.3 '@testing-library/svelte': specifier: ^5.2.4 - version: 5.2.7(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3))(vitest@3.1.1) + version: 5.2.7(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0))(vitest@3.0.9) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.0) @@ -125,28 +131,28 @@ importers: version: 2.0.8 '@typescript-eslint/eslint-plugin': specifier: ^8.28.0 - version: 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) + version: 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) '@typescript-eslint/parser': specifier: ^8.28.0 - version: 8.30.1(eslint@9.24.0)(typescript@5.8.3) + version: 8.28.0(eslint@9.23.0)(typescript@5.8.2) '@vitest/ui': specifier: ^3.0.9 - version: 3.1.1(vitest@3.1.1) + version: 3.0.9(vitest@3.0.9) eslint: specifier: ^9.23.0 - version: 9.24.0 + version: 9.23.0 eslint-config-prettier: specifier: ^10.1.0 - version: 10.1.2(eslint@9.24.0) + version: 10.1.1(eslint@9.23.0) eslint-plugin-svelte: specifier: ^3.3.3 - version: 3.5.1(eslint@9.24.0)(svelte@5.27.0) + version: 3.3.3(eslint@9.23.0)(svelte@5.25.3) globals: specifier: ^16.0.0 version: 16.0.0 jsdom: specifier: ^26.0.0 - version: 26.1.0 + version: 26.0.0 kleur: specifier: ^4.1.5 version: 4.1.5 @@ -155,19 +161,19 @@ importers: version: 3.5.3 prettier-plugin-svelte: specifier: ^3.3.3 - version: 3.3.3(prettier@3.5.3)(svelte@5.27.0) + version: 3.3.3(prettier@3.5.3)(svelte@5.25.3) sass: specifier: ^1.86.0 - version: 1.86.3 + version: 1.86.0 svelte: specifier: ^5.25.3 - version: 5.27.0 + version: 5.25.3 svelte-check: specifier: ^4.1.5 - version: 4.1.6(picomatch@4.0.2)(svelte@5.27.0)(typescript@5.8.3) + version: 4.1.5(picomatch@4.0.2)(svelte@5.25.3)(typescript@5.8.2) svelte-preprocess: specifier: ^6.0.3 - version: 6.0.3(@babel/core@7.26.9)(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(sass@1.86.3)(svelte@5.27.0)(typescript@5.8.3) + version: 6.0.3(@babel/core@7.26.10)(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(sass@1.86.0)(svelte@5.25.3)(typescript@5.8.2) svelte-sequential-preprocessor: specifier: ^2.0.2 version: 2.0.2 @@ -176,22 +182,53 @@ importers: version: 2.8.1 typescript: specifier: ^5.8.2 - version: 5.8.3 + version: 5.8.2 typescript-eslint: specifier: ^8.30.1 - version: 8.30.1(eslint@9.24.0)(typescript@5.8.3) + version: 8.30.1(eslint@9.23.0)(typescript@5.8.2) vite: specifier: ^6.2.3 - version: 6.3.1(@types/node@22.13.5)(sass@1.86.3) + version: 6.2.3(@types/node@22.13.14)(sass@1.86.0) vitest: specifier: ^3.0.0 - version: 3.1.1(@types/node@22.13.5)(@vitest/ui@3.1.1)(jsdom@26.1.0)(sass@1.86.3) + version: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.9)(jsdom@26.0.0)(sass@1.86.0) packages: '@adobe/css-tools@4.4.2': resolution: {integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==} + '@ai-sdk/provider-utils@2.1.11': + resolution: {integrity: sha512-lMnXA5KaRJidzW7gQmlo/SnX6D+AKk5GxHFcQtOaGOSJNmu/qcNZc1rGaO7K5qW52OvCLXtnWudR4cc/FvMpVQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider@1.0.10': + resolution: {integrity: sha512-pco8Zl9U0xwXI+nCLc0woMtxbvjU8hRmGTseAUiPHFLYAAL8trRPCukg69IDeinOvIeo1SmXxAIdWWPZOLb4Cg==} + engines: {node: '>=18'} + + '@ai-sdk/svelte@1.1.22': + resolution: {integrity: sha512-xtJjvEPHD8GDB1iODvsRLKplZ9CVUN/gT4U+nttuEvjV42qoPXKkrWwjTLEdWKnwTnoHuuI8mnQMje6RhFWtpA==} + engines: {node: '>=18'} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + '@ai-sdk/ui-utils@1.1.17': + resolution: {integrity: sha512-fCnp/wntZGqPf6tiCmhuQoSDLSBhXoI5DU2JX4As96EO870+jliE6ozvYUwYOZC6Ta2OKAjjWPcSP7HeHX0b+g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -217,12 +254,12 @@ packages: '@analytics/type-utils@0.6.2': resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9': - resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9} + '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1': + resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1} version: 1.2.1 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@1c607c00c8ac325d51241066f9c74a9dfdfb8fcd': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@1c607c00c8ac325d51241066f9c74a9dfdfb8fcd} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@504c653542de13ba8b4815805806f301df92790a': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@504c653542de13ba8b4815805806f301df92790a} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 @@ -242,15 +279,18 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0} + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@504c653': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@504c653} version: 1.0.0-next.85 peerDependencies: react-dom: ^18.0.0 svelte: ^4.0.0 - '@asamuzakjp/css-color@3.1.2': - resolution: {integrity: sha512-nwgc7jPn3LpZ4JWsoHtuwBsad1qSSLDDX634DdG0PBJofIuIEtSWk4KkRmuXyu178tjuHAbwiMNNzwqIyLYxZw==} + '@appwrite.io/pink@0.25.0': + resolution: {integrity: sha512-9z4G/iAhjvVpM7tkNqzGqrokst4hvNt3Fkf2jD4W6n8j//EJbQ3mJ0I+5dye5Sry0a33wUanq5DSztqFNYq5zw==} + + '@asamuzakjp/css-color@3.1.1': + resolution: {integrity: sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==} '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} @@ -260,16 +300,16 @@ packages: resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.9': - resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.9': - resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -294,29 +334,29 @@ packages: resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.9': - resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.9': - resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.9': - resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - '@babel/template@7.26.9': - resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.9': - resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.9': - resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} '@csstools/color-helpers@5.0.2': @@ -347,158 +387,158 @@ packages: resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} engines: {node: '>=18'} - '@esbuild/aix-ppc64@0.25.2': - resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.2': - resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.2': - resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.2': - resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.2': - resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.2': - resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.2': - resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.2': - resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.2': - resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.2': - resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.2': - resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.2': - resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.2': - resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.2': - resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.2': - resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.2': - resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.2': - resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.2': - resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.2': - resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.2': - resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.2': - resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.2': - resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.2': - resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.2': - resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.2': - resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -507,8 +547,8 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.2.8': - resolution: {integrity: sha512-LqCYHdWL/QqKIJuZ/ucMAv8d4luKGs4oCPgpt8mWztQAtPrHfXKQ/XAUc8ljCHAfJCn6SvkpTcGt5Tsh8saowA==} + '@eslint/compat@1.2.7': + resolution: {integrity: sha512-xvv7hJE32yhegJ8xNAnb62ggiAwTYHBpUCWhRxEj/ksvgDJuSXfoDkBcRYaYNFiJ+jH0IE3K16hd+xXzhBgNbg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^9.10.0 @@ -516,26 +556,26 @@ packages: eslint: optional: true - '@eslint/config-array@0.20.0': - resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.2.1': - resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + '@eslint/config-helpers@0.2.0': + resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.12.0': resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.23.0': + resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.24.0': resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -544,8 +584,8 @@ packages: resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@1.6.9': @@ -604,6 +644,11 @@ packages: '@melt-ui/svelte': '>= 0.29.0' svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1 + '@melt-ui/svelte@0.86.5': + resolution: {integrity: sha512-aaVfc0pxCf6B3ByrzGJ+hB2Sop9wJamw2lNHZlzaolU0Ew1D6O9CbeJElGODT8IbH8/bhI3LcN0nCJRh2ePq+A==} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118 + '@melt-ui/svelte@0.86.6': resolution: {integrity: sha512-Jer+M7DgIwT5IHfTayb4Iw/fkkxWNmC/mqn/nMh9JrbPbkxmyabfLQnhJ+JDn5HK77f84j34lubO3iqFtYAfMg==} peerDependencies: @@ -941,103 +986,103 @@ packages: '@prisma/instrumentation@5.22.0': resolution: {integrity: sha512-LxccF392NN37ISGxIurUljZSh1YWnphO34V5a0+T7FVQG2u9bhAXRTJpgmQ3483woVhkraQZFF7cbRrpbw/F4Q==} - '@rollup/rollup-android-arm-eabi@4.40.0': - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + '@rollup/rollup-android-arm-eabi@4.37.0': + resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + '@rollup/rollup-android-arm64@4.37.0': + resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + '@rollup/rollup-darwin-arm64@4.37.0': + resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + '@rollup/rollup-darwin-x64@4.37.0': + resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + '@rollup/rollup-freebsd-arm64@4.37.0': + resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + '@rollup/rollup-freebsd-x64@4.37.0': + resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + '@rollup/rollup-linux-arm-gnueabihf@4.37.0': + resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + '@rollup/rollup-linux-arm-musleabihf@4.37.0': + resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + '@rollup/rollup-linux-arm64-gnu@4.37.0': + resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + '@rollup/rollup-linux-arm64-musl@4.37.0': + resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + '@rollup/rollup-linux-loongarch64-gnu@4.37.0': + resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': + resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + '@rollup/rollup-linux-riscv64-gnu@4.37.0': + resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.0': - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + '@rollup/rollup-linux-riscv64-musl@4.37.0': + resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + '@rollup/rollup-linux-s390x-gnu@4.37.0': + resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.0': - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + '@rollup/rollup-linux-x64-gnu@4.37.0': + resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + '@rollup/rollup-linux-x64-musl@4.37.0': + resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.0': - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + '@rollup/rollup-win32-arm64-msvc@4.37.0': + resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + '@rollup/rollup-win32-ia32-msvc@4.37.0': + resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + '@rollup/rollup-win32-x64-msvc@4.37.0': + resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} cpu: [x64] os: [win32] @@ -1069,49 +1114,55 @@ packages: resolution: {integrity: sha512-1esQdgSUCww9XAntO4pr7uAM5cfGhLsgTK9MEwAKNfvpMYJi9NUTYa3A7AZmdA8V6107Lo4OD7peIPrDRbaDCg==} engines: {node: '>= 14'} - '@sentry/cli-darwin@2.42.2': - resolution: {integrity: sha512-GtJSuxER7Vrp1IpxdUyRZzcckzMnb4N5KTW7sbTwUiwqARRo+wxS+gczYrS8tdgtmXs5XYhzhs+t4d52ITHMIg==} + '@sentry/cli-darwin@2.43.0': + resolution: {integrity: sha512-0MYvRHJowXOMNY5W6XF4p9GQNH3LuQ+IHAQwVbZOsfwnEv8e20rf9BiPPzmJ9sIjZSWYR4yIqm6dBp6ABJFbGQ==} engines: {node: '>=10'} os: [darwin] - '@sentry/cli-linux-arm64@2.42.2': - resolution: {integrity: sha512-BOxzI7sgEU5Dhq3o4SblFXdE9zScpz6EXc5Zwr1UDZvzgXZGosUtKVc7d1LmkrHP8Q2o18HcDWtF3WvJRb5Zpw==} + '@sentry/cli-linux-arm64@2.43.0': + resolution: {integrity: sha512-7URSaNjbEJQZyYJ33XK3pVKl6PU2oO9ETF6R/4Cz2FmU3fecACLKVldv7+OuNl9aspLZ62mnPMDvT732/Fp2Ug==} engines: {node: '>=10'} cpu: [arm64] os: [linux, freebsd] - '@sentry/cli-linux-arm@2.42.2': - resolution: {integrity: sha512-7udCw+YL9lwq+9eL3WLspvnuG+k5Icg92YE7zsteTzWLwgPVzaxeZD2f8hwhsu+wmL+jNqbpCRmktPteh3i2mg==} + '@sentry/cli-linux-arm@2.43.0': + resolution: {integrity: sha512-c2Fwb6HrFL1nbaGV4uRhHC1wEJPR+wfpKN5y06PgSNNbd10YrECAB3tqBHXC8CEmhuDyFR+ORGZ7VbswfCWEEQ==} engines: {node: '>=10'} cpu: [arm] os: [linux, freebsd] - '@sentry/cli-linux-i686@2.42.2': - resolution: {integrity: sha512-Sw/dQp5ZPvKnq3/y7wIJyxTUJYPGoTX/YeMbDs8BzDlu9to2LWV3K3r7hE7W1Lpbaw4tSquUHiQjP5QHCOS7aQ==} + '@sentry/cli-linux-i686@2.43.0': + resolution: {integrity: sha512-bFo/tpMZeMJ275HPGmAENREchnBxhALOOpZAphSyalUu3pGZ+EETEtlSLrKyVNJo26Dye5W7GlrYUV9+rkyCtg==} engines: {node: '>=10'} cpu: [x86, ia32] os: [linux, freebsd] - '@sentry/cli-linux-x64@2.42.2': - resolution: {integrity: sha512-mU4zUspAal6TIwlNLBV5oq6yYqiENnCWSxtSQVzWs0Jyq97wtqGNG9U+QrnwjJZ+ta/hvye9fvL2X25D/RxHQw==} + '@sentry/cli-linux-x64@2.43.0': + resolution: {integrity: sha512-EbAmKXUNU/Ii4pNGVRCepU6ks1M43wStMKx3pibrUTllrrCwqYKyPxRRdoFYySHkduwCxnoKZcLEg9vWZ3qS6A==} engines: {node: '>=10'} cpu: [x64] os: [linux, freebsd] - '@sentry/cli-win32-i686@2.42.2': - resolution: {integrity: sha512-iHvFHPGqgJMNqXJoQpqttfsv2GI3cGodeTq4aoVLU/BT3+hXzbV0x1VpvvEhncJkDgDicJpFLM8sEPHb3b8abw==} + '@sentry/cli-win32-arm64@2.43.0': + resolution: {integrity: sha512-KmJRCdQQGLSErJvrcGcN+yWo68m+5OdluhyJHsVYMOQknwu8YMOWLm12EIa+4t4GclDvwg5xcxLccCuiWMJUZw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@sentry/cli-win32-i686@2.43.0': + resolution: {integrity: sha512-ZWxZdOyZX7NJ/CTskzg+dJ2xTpobFLXVNMOMq0HiwdhqXP2zYYJzKnIt3mHNJYA40zYFODGSgxIamodjpB8BuA==} engines: {node: '>=10'} cpu: [x86, ia32] os: [win32] - '@sentry/cli-win32-x64@2.42.2': - resolution: {integrity: sha512-vPPGHjYoaGmfrU7xhfFxG7qlTBacroz5NdT+0FmDn6692D8IvpNXl1K+eV3Kag44ipJBBeR8g1HRJyx/F/9ACw==} + '@sentry/cli-win32-x64@2.43.0': + resolution: {integrity: sha512-S/IRQYAziEnjpyROhnqzTqShDq3m8jcevXx+q5f49uQnFbfYcTgS1sdrEPqqao/K2boOWbffxYtTkvBiB/piQQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@sentry/cli@2.42.2': - resolution: {integrity: sha512-spb7S/RUumCGyiSTg8DlrCX4bivCNmU/A1hcfkwuciTFGu8l5CDc2I6jJWWZw8/0enDGxuj5XujgXvU5tr4bxg==} + '@sentry/cli@2.43.0': + resolution: {integrity: sha512-gBE3bkx+PBJxopTrzIJLX4xHe5S0w87q5frIveWKDZ5ulVIU6YWnVumay0y07RIEweUEj3IYva1qH6HG2abfiA==} engines: {node: '>= 10'} hasBin: true @@ -1189,8 +1240,8 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.20.7': - resolution: {integrity: sha512-dVbLMubpJJSLI4OYB+yWYNHGAhgc2bVevWuBjDj8jFUXIJOAnLwYP3vsmtcgoxNGUXoq0rHS5f7MFCsryb6nzg==} + '@sveltejs/kit@2.20.2': + resolution: {integrity: sha512-Dv8TOAZC9vyfcAB9TMsvUEJsRbklRTeNfcYBPaeH6KnABJ99i3CvCB2eNx8fiiliIqe+9GIchBg4RodRH5p1BQ==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -1276,8 +1327,8 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} - '@types/node@22.13.5': - resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} + '@types/node@22.13.14': + resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} '@types/pg-pool@2.0.6': resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} @@ -1291,8 +1342,8 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react@18.3.18': - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + '@types/react@18.3.20': + resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} '@types/remarkable@2.0.8': resolution: {integrity: sha512-eKXqPZfpQl1kOADjdKchHrp2gwn9qMnGXhH/AtZe0UrklzhGJkawJo/Y/D0AlWcdWoWamFNIum8+/nkAISQVGg==} @@ -1306,6 +1357,14 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript-eslint/eslint-plugin@8.28.0': + resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/eslint-plugin@8.30.1': resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1314,6 +1373,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/parser@8.28.0': + resolution: {integrity: sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/parser@8.30.1': resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1321,10 +1387,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/scope-manager@8.28.0': + resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.30.1': resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.28.0': + resolution: {integrity: sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/type-utils@8.30.1': resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1332,16 +1409,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/types@8.28.0': + resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.30.1': resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.28.0': + resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.30.1': resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.28.0': + resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.30.1': resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1349,6 +1443,10 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/visitor-keys@8.28.0': + resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.30.1': resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1356,11 +1454,11 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@3.1.1': - resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} + '@vitest/expect@3.0.9': + resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} - '@vitest/mocker@3.1.1': - resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} + '@vitest/mocker@3.0.9': + resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -1370,25 +1468,25 @@ packages: vite: optional: true - '@vitest/pretty-format@3.1.1': - resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} + '@vitest/pretty-format@3.0.9': + resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} - '@vitest/runner@3.1.1': - resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} + '@vitest/runner@3.0.9': + resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} - '@vitest/snapshot@3.1.1': - resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} + '@vitest/snapshot@3.0.9': + resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} - '@vitest/spy@3.1.1': - resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} + '@vitest/spy@3.0.9': + resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} - '@vitest/ui@3.1.1': - resolution: {integrity: sha512-2HpiRIYg3dlvAJBV9RtsVswFgUSJK4Sv7QhpxoP0eBGkYwzGIKP34PjaV00AULQi9Ovl6LGyZfsetxDWY5BQdQ==} + '@vitest/ui@3.0.9': + resolution: {integrity: sha512-FpZD4aIv/qNpwkV3XbLV6xldWFHMgoNWAJEgg5GmpObmAOLAErpYjew9dDwXdYdKOS3iZRKdwI+P3JOJcYeUBg==} peerDependencies: - vitest: 3.1.1 + vitest: 3.0.9 - '@vitest/utils@3.1.1': - resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} + '@vitest/utils@3.0.9': + resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} @@ -1429,8 +1527,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1515,6 +1613,9 @@ packages: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + autolinker@3.16.2: resolution: {integrity: sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==} @@ -1560,16 +1661,16 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001701: - resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} + caniuse-lite@1.0.30001707: + resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1621,6 +1722,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1837,6 +1942,10 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1872,8 +1981,8 @@ packages: echarts@5.6.0: resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} - electron-to-chromium@1.5.107: - resolution: {integrity: sha512-dJr1o6yCntRkXElnhsHh1bAV19bo/hKyFf7tCcWgpXbuFIF0Lakjgqv5LRfSDaNzAII8Fnxg2tqgHkgCvxdbxw==} + electron-to-chromium@1.5.128: + resolution: {integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==} emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -1900,8 +2009,12 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - esbuild@0.25.2: - resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} engines: {node: '>=18'} hasBin: true @@ -1913,14 +2026,20 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@10.1.2: - resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==} + eslint-compat-utils@0.6.4: + resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-prettier@10.1.1: + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-svelte@3.5.1: - resolution: {integrity: sha512-Qn1slddZHfqYiDO6IN8/iN3YL+VuHlgYjm30FT+hh0Jf/TX0jeZMTJXQMajFm5f6f6hURi+XO8P+NPYD+T4jkg==} + eslint-plugin-svelte@3.3.3: + resolution: {integrity: sha512-imzGqIgWbfsb/CR14d3k3M8MiVNGet+l9mjPhvo1Rm0Nxi0rNn4/eELqyR8FWlgKBMlGkOp2kshRJm0xpxNfHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.1 || ^9.0.0 @@ -1941,8 +2060,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.24.0: - resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + eslint@9.23.0: + resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1967,8 +2086,8 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esrap@1.4.6: - resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} + esrap@1.4.5: + resolution: {integrity: sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -1992,8 +2111,12 @@ packages: resolution: {integrity: sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==} engines: {node: '>=14.18'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + eventsource-parser@3.0.0: + resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} + engines: {node: '>=18.0.0'} + + expect-type@1.2.0: + resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} engines: {node: '>=12.0.0'} fast-deep-equal@3.1.3: @@ -2049,6 +2172,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} @@ -2190,15 +2317,15 @@ packages: resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} engines: {node: '>= 4'} - immutable@5.0.3: - resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} + immutable@5.1.1: + resolution: {integrity: sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.13.0: - resolution: {integrity: sha512-YG86SYDtrL/Yu8JgfWb7kjQ0myLeT1whw6fs/ZHFkXFcbk9zJU9lOCsSJHpvaPumU11nN3US7NW6x1YTk+HrUA==} + import-in-the-middle@1.13.1: + resolution: {integrity: sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==} import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -2318,8 +2445,8 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@26.1.0: - resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + jsdom@26.0.0: + resolution: {integrity: sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==} engines: {node: '>=18'} peerDependencies: canvas: ^3.0.0 @@ -2338,6 +2465,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2390,8 +2520,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - luxon@3.5.0: - resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} + luxon@3.6.0: + resolution: {integrity: sha512-WE7p0p7W1xji9qxkLYsvcIxZyfP48GuFrWIBQZIsbjCyf65dG1rv4n83HcOyEyhvzxJCrUoObCRNFgRNIQ5KNA==} engines: {node: '>=12'} lz-string@1.5.0: @@ -2445,6 +2575,14 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2485,13 +2623,13 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2525,8 +2663,11 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - nwsapi@2.2.16: - resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + normalize.css@8.0.1: + resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} + + nwsapi@2.2.20: + resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -2595,8 +2736,8 @@ packages: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-protocol@1.7.1: - resolution: {integrity: sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ==} + pg-protocol@1.8.0: + resolution: {integrity: sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -2746,8 +2887,8 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - recast@0.23.10: - resolution: {integrity: sha512-mbCmRMJUKCJ1h41V0cu2C26ULBURwuoZ34C9rChjcDaeJ/4Kv5al3O2HPwTs2m0wQ1vGhMY+tguhzU1aE8md1A==} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} redent@3.0.0: @@ -2795,8 +2936,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + rollup@4.37.0: + resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2820,8 +2961,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.86.3: - resolution: {integrity: sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==} + sass@1.86.0: + resolution: {integrity: sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==} engines: {node: '>=14.0.0'} hasBin: true @@ -2832,6 +2973,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2935,8 +3079,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@3.8.1: + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -2964,8 +3108,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.1.6: - resolution: {integrity: sha512-P7w/6tdSfk3zEVvfsgrp3h3DFC75jCdZjTQvgGJtjPORs1n7/v2VMPIoty3PWv7jnfEm3x0G/p9wH4pecTb0Wg==} + svelte-check@4.1.5: + resolution: {integrity: sha512-Gb0T2IqBNe1tLB9EB1Qh+LOe+JB8wt2/rNBDGvkxQVvk8vNeAoG+vZgFB/3P5+zC7RWlyBlzm9dVjZFph/maIg==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -2977,8 +3121,8 @@ packages: peerDependencies: svelte: ^4.0.0 - svelte-eslint-parser@1.1.2: - resolution: {integrity: sha512-vqFBRamDKo1l70KMfxxXj1/0Cco5TfMDnqaAjgz6D8PyoMhfMcDOLRkAwPg8WkMyZjMtQL3wW66TZ0x59iqO2w==} + svelte-eslint-parser@1.1.1: + resolution: {integrity: sha512-QLVGPIMDettl30qRHXU2VrPvVJKG8GsGstye7n8rFbEiu3gEARksuQg9Xu4GzubNxhGNM8stfBZkhyMbBQmjFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 @@ -3041,8 +3185,8 @@ packages: resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} - svelte@5.27.0: - resolution: {integrity: sha512-Uai13Ydt1ZE+bUHme6b9U38PCYVNCqBRoBMkUKbFbKiD7kHWjdUUrklYAQZJxyKK81qII4mrBwe/YmvEMSlC9w==} + svelte@5.25.3: + resolution: {integrity: sha512-J9rcZ/xVJonAoESqVGHHZhrNdVbrCfkdB41BP6eiwHMoFShD9it3yZXApVYMHdGfCshBsZCKsajwJeBbS/M1zg==} engines: {node: '>=18'} swr-store@0.10.6: @@ -3102,11 +3246,11 @@ packages: tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} - tldts-core@6.1.86: - resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + tldts-core@6.1.85: + resolution: {integrity: sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==} - tldts@6.1.86: - resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + tldts@6.1.85: + resolution: {integrity: sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==} hasBin: true to-regex-range@5.0.1: @@ -3124,8 +3268,8 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + tr46@5.1.0: + resolution: {integrity: sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==} engines: {node: '>=18'} trim-lines@3.0.1: @@ -3160,8 +3304,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true @@ -3195,8 +3339,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-sync-external-store@1.4.0: - resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3209,13 +3353,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.1.1: - resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} + vite-node@3.0.9: + resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.3.1: - resolution: {integrity: sha512-kkzzkqtMESYklo96HKKPE5KKLkC1amlsqt+RjFMlX2AvbRB/0wghap19NdBxxwGZ+h/C6DLCrcEphPIItlGrRQ==} + vite@6.2.3: + resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -3262,16 +3406,16 @@ packages: vite: optional: true - vitest@3.1.1: - resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} + vitest@3.0.9: + resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.1 - '@vitest/ui': 3.1.1 + '@vitest/browser': 3.0.9 + '@vitest/ui': 3.0.9 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3339,8 +3483,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -3394,6 +3538,14 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: ^3.24.1 + + zod@3.24.3: + resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} + zrender@5.6.1: resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} @@ -3404,6 +3556,36 @@ snapshots: '@adobe/css-tools@4.4.2': {} + '@ai-sdk/provider-utils@2.1.11(zod@3.24.3)': + dependencies: + '@ai-sdk/provider': 1.0.10 + eventsource-parser: 3.0.0 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.24.3 + + '@ai-sdk/provider@1.0.10': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/svelte@1.1.22(svelte@5.25.3)(zod@3.24.3)': + dependencies: + '@ai-sdk/provider-utils': 2.1.11(zod@3.24.3) + '@ai-sdk/ui-utils': 1.1.17(zod@3.24.3) + optionalDependencies: + svelte: 5.25.3 + transitivePeerDependencies: + - zod + + '@ai-sdk/ui-utils@1.1.17(zod@3.24.3)': + dependencies: + '@ai-sdk/provider': 1.0.10 + '@ai-sdk/provider-utils': 2.1.11(zod@3.24.3) + zod-to-json-schema: 3.24.5(zod@3.24.3) + optionalDependencies: + zod: 3.24.3 + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -3443,15 +3625,15 @@ snapshots: '@analytics/type-utils@0.6.2': {} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9': {} + '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@f76aff1': {} - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@1c607c00c8ac325d51241066f9c74a9dfdfb8fcd(svelte@5.27.0)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@504c653542de13ba8b4815805806f301df92790a(svelte@5.25.3)': dependencies: - svelte: 5.27.0 + svelte: 5.25.3 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.27.0)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.25.3)': dependencies: - svelte: 5.27.0 + svelte: 5.25.3 '@appwrite.io/pink-icons@0.25.0': {} @@ -3462,23 +3644,29 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0(react-dom@18.3.1(react@18.3.1))(svelte@5.27.0)': + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@504c653(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)': dependencies: - '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@1c607c00c8ac325d51241066f9c74a9dfdfb8fcd(svelte@5.27.0) + '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@504c653542de13ba8b4815805806f301df92790a(svelte@5.25.3) '@floating-ui/dom': 1.6.13 - '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.27.0))(svelte@5.27.0) - '@melt-ui/svelte': 0.86.6(svelte@5.27.0) + '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.25.3))(svelte@5.25.3) + '@melt-ui/svelte': 0.86.6(svelte@5.25.3) ansicolor: 2.0.3 d3: 7.9.0 fuse.js: 7.1.0 pretty-bytes: 6.1.1 react-dom: 18.3.1(react@18.3.1) shiki: 1.29.2 - svelte: 5.27.0 - svelte-motion: 0.12.2(svelte@5.27.0) - svelte-sonner: 0.3.28(svelte@5.27.0) + svelte: 5.25.3 + svelte-motion: 0.12.2(svelte@5.25.3) + svelte-sonner: 0.3.28(svelte@5.25.3) - '@asamuzakjp/css-color@3.1.2': + '@appwrite.io/pink@0.25.0': + dependencies: + '@appwrite.io/pink-icons': 0.25.0 + normalize.css: 8.0.1 + the-new-css-reset: 1.11.3 + + '@asamuzakjp/css-color@3.1.1': dependencies: '@csstools/css-calc': 2.1.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) '@csstools/css-color-parser': 3.0.8(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) @@ -3494,18 +3682,18 @@ snapshots: '@babel/compat-data@7.26.8': {} - '@babel/core@7.26.9': + '@babel/core@7.26.10': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helpers': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -3514,15 +3702,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.9': + '@babel/generator@7.27.0': dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.26.5': + '@babel/helper-compilation-targets@7.27.0': dependencies: '@babel/compat-data': 7.26.8 '@babel/helper-validator-option': 7.25.9 @@ -3532,17 +3720,17 @@ snapshots: '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.26.10 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color @@ -3552,38 +3740,38 @@ snapshots: '@babel/helper-validator-option@7.25.9': {} - '@babel/helpers@7.26.9': + '@babel/helpers@7.27.0': dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 - '@babel/parser@7.26.9': + '@babel/parser@7.27.0': dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.27.0 - '@babel/runtime@7.26.9': + '@babel/runtime@7.27.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.26.9': + '@babel/template@7.27.0': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 - '@babel/traverse@7.26.9': + '@babel/traverse@7.27.0': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.9': + '@babel/types@7.27.0': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 @@ -3608,93 +3796,93 @@ snapshots: '@csstools/css-tokenizer@3.0.3': {} - '@esbuild/aix-ppc64@0.25.2': + '@esbuild/aix-ppc64@0.25.1': optional: true - '@esbuild/android-arm64@0.25.2': + '@esbuild/android-arm64@0.25.1': optional: true - '@esbuild/android-arm@0.25.2': + '@esbuild/android-arm@0.25.1': optional: true - '@esbuild/android-x64@0.25.2': + '@esbuild/android-x64@0.25.1': optional: true - '@esbuild/darwin-arm64@0.25.2': + '@esbuild/darwin-arm64@0.25.1': optional: true - '@esbuild/darwin-x64@0.25.2': + '@esbuild/darwin-x64@0.25.1': optional: true - '@esbuild/freebsd-arm64@0.25.2': + '@esbuild/freebsd-arm64@0.25.1': optional: true - '@esbuild/freebsd-x64@0.25.2': + '@esbuild/freebsd-x64@0.25.1': optional: true - '@esbuild/linux-arm64@0.25.2': + '@esbuild/linux-arm64@0.25.1': optional: true - '@esbuild/linux-arm@0.25.2': + '@esbuild/linux-arm@0.25.1': optional: true - '@esbuild/linux-ia32@0.25.2': + '@esbuild/linux-ia32@0.25.1': optional: true - '@esbuild/linux-loong64@0.25.2': + '@esbuild/linux-loong64@0.25.1': optional: true - '@esbuild/linux-mips64el@0.25.2': + '@esbuild/linux-mips64el@0.25.1': optional: true - '@esbuild/linux-ppc64@0.25.2': + '@esbuild/linux-ppc64@0.25.1': optional: true - '@esbuild/linux-riscv64@0.25.2': + '@esbuild/linux-riscv64@0.25.1': optional: true - '@esbuild/linux-s390x@0.25.2': + '@esbuild/linux-s390x@0.25.1': optional: true - '@esbuild/linux-x64@0.25.2': + '@esbuild/linux-x64@0.25.1': optional: true - '@esbuild/netbsd-arm64@0.25.2': + '@esbuild/netbsd-arm64@0.25.1': optional: true - '@esbuild/netbsd-x64@0.25.2': + '@esbuild/netbsd-x64@0.25.1': optional: true - '@esbuild/openbsd-arm64@0.25.2': + '@esbuild/openbsd-arm64@0.25.1': optional: true - '@esbuild/openbsd-x64@0.25.2': + '@esbuild/openbsd-x64@0.25.1': optional: true - '@esbuild/sunos-x64@0.25.2': + '@esbuild/sunos-x64@0.25.1': optional: true - '@esbuild/win32-arm64@0.25.2': + '@esbuild/win32-arm64@0.25.1': optional: true - '@esbuild/win32-ia32@0.25.2': + '@esbuild/win32-ia32@0.25.1': optional: true - '@esbuild/win32-x64@0.25.2': + '@esbuild/win32-x64@0.25.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.24.0)': + '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0)': dependencies: - eslint: 9.24.0 + eslint: 9.23.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.8(eslint@9.24.0)': + '@eslint/compat@1.2.7(eslint@9.23.0)': optionalDependencies: - eslint: 9.24.0 + eslint: 9.23.0 - '@eslint/config-array@0.20.0': + '@eslint/config-array@0.19.2': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0 @@ -3702,16 +3890,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.1': {} + '@eslint/config-helpers@0.2.0': {} '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.13.0': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 @@ -3726,13 +3910,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/js@9.23.0': {} + '@eslint/js@9.24.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.8': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.13.0 + '@eslint/core': 0.12.0 levn: 0.4.1 '@floating-ui/core@1.6.9': @@ -3780,14 +3966,21 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.6(svelte@5.27.0))(svelte@5.27.0)': + '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.5(svelte@5.25.3))(svelte@5.25.3)': dependencies: - '@melt-ui/svelte': 0.86.6(svelte@5.27.0) + '@melt-ui/svelte': 0.86.5(svelte@5.25.3) estree-walker: 3.0.3 magic-string: 0.30.17 - svelte: 5.27.0 + svelte: 5.25.3 - '@melt-ui/svelte@0.86.6(svelte@5.27.0)': + '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.6(svelte@5.25.3))(svelte@5.25.3)': + dependencies: + '@melt-ui/svelte': 0.86.6(svelte@5.25.3) + estree-walker: 3.0.3 + magic-string: 0.30.17 + svelte: 5.25.3 + + '@melt-ui/svelte@0.86.5(svelte@5.25.3)': dependencies: '@floating-ui/core': 1.6.9 '@floating-ui/dom': 1.6.13 @@ -3795,7 +3988,17 @@ snapshots: dequal: 2.0.3 focus-trap: 7.6.4 nanoid: 5.1.5 - svelte: 5.27.0 + svelte: 5.25.3 + + '@melt-ui/svelte@0.86.6(svelte@5.25.3)': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/dom': 1.6.13 + '@internationalized/date': 3.7.0 + dequal: 2.0.3 + focus-trap: 7.6.4 + nanoid: 5.1.5 + svelte: 5.25.3 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -4045,7 +4248,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.53.0 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.13.0 + import-in-the-middle: 1.13.1 require-in-the-middle: 7.5.2 semver: 7.7.1 shimmer: 1.2.1 @@ -4057,7 +4260,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.57.1 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.13.0 + import-in-the-middle: 1.13.1 require-in-the-middle: 7.5.2 semver: 7.7.1 shimmer: 1.2.1 @@ -4069,7 +4272,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.57.2 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.13.0 + import-in-the-middle: 1.13.1 require-in-the-middle: 7.5.2 semver: 7.7.1 shimmer: 1.2.1 @@ -4179,64 +4382,64 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/rollup-android-arm-eabi@4.40.0': + '@rollup/rollup-android-arm-eabi@4.37.0': optional: true - '@rollup/rollup-android-arm64@4.40.0': + '@rollup/rollup-android-arm64@4.37.0': optional: true - '@rollup/rollup-darwin-arm64@4.40.0': + '@rollup/rollup-darwin-arm64@4.37.0': optional: true - '@rollup/rollup-darwin-x64@4.40.0': + '@rollup/rollup-darwin-x64@4.37.0': optional: true - '@rollup/rollup-freebsd-arm64@4.40.0': + '@rollup/rollup-freebsd-arm64@4.37.0': optional: true - '@rollup/rollup-freebsd-x64@4.40.0': + '@rollup/rollup-freebsd-x64@4.37.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + '@rollup/rollup-linux-arm-gnueabihf@4.37.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.0': + '@rollup/rollup-linux-arm-musleabihf@4.37.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.0': + '@rollup/rollup-linux-arm64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.0': + '@rollup/rollup-linux-arm64-musl@4.37.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + '@rollup/rollup-linux-loongarch64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.0': + '@rollup/rollup-linux-riscv64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.0': + '@rollup/rollup-linux-riscv64-musl@4.37.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.0': + '@rollup/rollup-linux-s390x-gnu@4.37.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.0': + '@rollup/rollup-linux-x64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-x64-musl@4.40.0': + '@rollup/rollup-linux-x64-musl@4.37.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.0': + '@rollup/rollup-win32-arm64-msvc@4.37.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.0': + '@rollup/rollup-win32-ia32-msvc@4.37.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.0': + '@rollup/rollup-win32-x64-msvc@4.37.0': optional: true '@sentry-internal/browser-utils@8.55.0': @@ -4269,9 +4472,9 @@ snapshots: '@sentry/bundler-plugin-core@2.22.6': dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.26.10 '@sentry/babel-plugin-component-annotate': 2.22.6 - '@sentry/cli': 2.42.2 + '@sentry/cli': 2.43.0 dotenv: 16.4.7 find-up: 5.0.0 glob: 9.3.5 @@ -4281,28 +4484,31 @@ snapshots: - encoding - supports-color - '@sentry/cli-darwin@2.42.2': + '@sentry/cli-darwin@2.43.0': optional: true - '@sentry/cli-linux-arm64@2.42.2': + '@sentry/cli-linux-arm64@2.43.0': optional: true - '@sentry/cli-linux-arm@2.42.2': + '@sentry/cli-linux-arm@2.43.0': optional: true - '@sentry/cli-linux-i686@2.42.2': + '@sentry/cli-linux-i686@2.43.0': optional: true - '@sentry/cli-linux-x64@2.42.2': + '@sentry/cli-linux-x64@2.43.0': optional: true - '@sentry/cli-win32-i686@2.42.2': + '@sentry/cli-win32-arm64@2.43.0': optional: true - '@sentry/cli-win32-x64@2.42.2': + '@sentry/cli-win32-i686@2.43.0': optional: true - '@sentry/cli@2.42.2': + '@sentry/cli-win32-x64@2.43.0': + optional: true + + '@sentry/cli@2.43.0': dependencies: https-proxy-agent: 5.0.1 node-fetch: 2.7.0 @@ -4310,13 +4516,14 @@ snapshots: proxy-from-env: 1.1.0 which: 2.0.2 optionalDependencies: - '@sentry/cli-darwin': 2.42.2 - '@sentry/cli-linux-arm': 2.42.2 - '@sentry/cli-linux-arm64': 2.42.2 - '@sentry/cli-linux-i686': 2.42.2 - '@sentry/cli-linux-x64': 2.42.2 - '@sentry/cli-win32-i686': 2.42.2 - '@sentry/cli-win32-x64': 2.42.2 + '@sentry/cli-darwin': 2.43.0 + '@sentry/cli-linux-arm': 2.43.0 + '@sentry/cli-linux-arm64': 2.43.0 + '@sentry/cli-linux-i686': 2.43.0 + '@sentry/cli-linux-x64': 2.43.0 + '@sentry/cli-win32-arm64': 2.43.0 + '@sentry/cli-win32-i686': 2.43.0 + '@sentry/cli-win32-x64': 2.43.0 transitivePeerDependencies: - encoding - supports-color @@ -4359,7 +4566,7 @@ snapshots: '@prisma/instrumentation': 5.22.0 '@sentry/core': 8.55.0 '@sentry/opentelemetry': 8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0) - import-in-the-middle: 1.13.0 + import-in-the-middle: 1.13.1 transitivePeerDependencies: - supports-color @@ -4373,26 +4580,26 @@ snapshots: '@opentelemetry/semantic-conventions': 1.30.0 '@sentry/core': 8.55.0 - '@sentry/svelte@8.55.0(svelte@5.27.0)': + '@sentry/svelte@8.55.0(svelte@5.25.3)': dependencies: '@sentry/browser': 8.55.0 '@sentry/core': 8.55.0 magic-string: 0.30.7 - svelte: 5.27.0 + svelte: 5.25.3 - '@sentry/sveltekit@8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0)(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3))': + '@sentry/sveltekit@8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0)(@sveltejs/kit@2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0))': dependencies: '@sentry/core': 8.55.0 '@sentry/node': 8.55.0 '@sentry/opentelemetry': 8.55.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0) - '@sentry/svelte': 8.55.0(svelte@5.27.0) + '@sentry/svelte': 8.55.0(svelte@5.25.3) '@sentry/vite-plugin': 2.22.6 - '@sveltejs/kit': 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + '@sveltejs/kit': 2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) magic-string: 0.30.7 magicast: 0.2.8 sorcery: 1.0.0 optionalDependencies: - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/context-async-hooks' @@ -4449,17 +4656,17 @@ snapshots: '@stripe/stripe-js@3.5.0': {} - '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.0)': + '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': dependencies: - acorn: 8.14.0 + acorn: 8.14.1 - '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))': + '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))': dependencies: - '@sveltejs/kit': 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + '@sveltejs/kit': 2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) - '@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3))': + '@sveltejs/kit@2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -4471,28 +4678,28 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.1 - svelte: 5.27.0 - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) + svelte: 5.25.3 + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) debug: 4.4.0 - svelte: 5.27.0 - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) + svelte: 5.25.3 + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)))(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)))(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.27.0 - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) - vitefu: 1.0.6(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) + svelte: 5.25.3 + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) + vitefu: 1.0.6(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) transitivePeerDependencies: - supports-color @@ -4503,7 +4710,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.26.2 - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.27.0 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -4521,13 +4728,13 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/svelte@5.2.7(svelte@5.27.0)(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3))(vitest@3.1.1)': + '@testing-library/svelte@5.2.7(svelte@5.25.3)(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0))(vitest@3.0.9)': dependencies: '@testing-library/dom': 10.4.0 - svelte: 5.27.0 + svelte: 5.25.3 optionalDependencies: - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) - vitest: 3.1.1(@types/node@22.13.5)(@vitest/ui@3.1.1)(jsdom@26.1.0)(sass@1.86.3) + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) + vitest: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.9)(jsdom@26.0.0)(sass@1.86.0) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: @@ -4537,7 +4744,7 @@ snapshots: '@types/connect@3.4.36': dependencies: - '@types/node': 22.13.5 + '@types/node': 22.13.14 '@types/cookie@0.6.0': {} @@ -4561,9 +4768,9 @@ snapshots: '@types/mysql@2.15.26': dependencies: - '@types/node': 22.13.5 + '@types/node': 22.13.14 - '@types/node@22.13.5': + '@types/node@22.13.14': dependencies: undici-types: 6.20.0 @@ -4573,15 +4780,15 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 22.13.5 - pg-protocol: 1.7.1 + '@types/node': 22.13.14 + pg-protocol: 1.8.0 pg-types: 2.2.0 '@types/prismjs@1.26.5': {} '@types/prop-types@15.7.14': {} - '@types/react@18.3.18': + '@types/react@18.3.20': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 @@ -4592,58 +4799,119 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.13.5 + '@types/node': 22.13.14 '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.30.1 - eslint: 9.24.0 + '@typescript-eslint/parser': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/type-utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.28.0 + eslint: 9.23.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.30.1(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.30.1(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.30.1 + eslint: 9.23.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.28.0(eslint@9.23.0)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.28.0 + debug: 4.4.0 + eslint: 9.23.0 + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.30.1(eslint@9.23.0)(typescript@5.8.2)': dependencies: '@typescript-eslint/scope-manager': 8.30.1 '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.30.1 debug: 4.4.0 - eslint: 9.24.0 - typescript: 5.8.3 + eslint: 9.23.0 + typescript: 5.8.2 transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@8.28.0': + dependencies: + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 + '@typescript-eslint/scope-manager@8.30.1': dependencies: '@typescript-eslint/types': 8.30.1 '@typescript-eslint/visitor-keys': 8.30.1 - '@typescript-eslint/type-utils@8.30.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.28.0(eslint@9.23.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0)(typescript@5.8.2) debug: 4.4.0 - eslint: 9.24.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + eslint: 9.23.0 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.30.1(eslint@9.23.0)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.2) + '@typescript-eslint/utils': 8.30.1(eslint@9.23.0)(typescript@5.8.2) + debug: 4.4.0 + eslint: 9.23.0 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.28.0': {} + '@typescript-eslint/types@8.30.1': {} - '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.2)': dependencies: '@typescript-eslint/types': 8.30.1 '@typescript-eslint/visitor-keys': 8.30.1 @@ -4652,22 +4920,38 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.30.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.28.0(eslint@9.23.0)(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0) - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - eslint: 9.24.0 - typescript: 5.8.3 + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + eslint: 9.23.0 + typescript: 5.8.2 transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.30.1(eslint@9.23.0)(typescript@5.8.2)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.2) + eslint: 9.23.0 + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.28.0': + dependencies: + '@typescript-eslint/types': 8.28.0 + eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.30.1': dependencies: '@typescript-eslint/types': 8.30.1 @@ -4675,60 +4959,60 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.1.1': + '@vitest/expect@3.0.9': dependencies: - '@vitest/spy': 3.1.1 - '@vitest/utils': 3.1.1 + '@vitest/spy': 3.0.9 + '@vitest/utils': 3.0.9 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3))': + '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0))': dependencies: - '@vitest/spy': 3.1.1 + '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) - '@vitest/pretty-format@3.1.1': + '@vitest/pretty-format@3.0.9': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.1': + '@vitest/runner@3.0.9': dependencies: - '@vitest/utils': 3.1.1 + '@vitest/utils': 3.0.9 pathe: 2.0.3 - '@vitest/snapshot@3.1.1': + '@vitest/snapshot@3.0.9': dependencies: - '@vitest/pretty-format': 3.1.1 + '@vitest/pretty-format': 3.0.9 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.1': + '@vitest/spy@3.0.9': dependencies: tinyspy: 3.0.2 - '@vitest/ui@3.1.1(vitest@3.1.1)': + '@vitest/ui@3.0.9(vitest@3.0.9)': dependencies: - '@vitest/utils': 3.1.1 + '@vitest/utils': 3.0.9 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.1 tinyglobby: 0.2.12 tinyrainbow: 2.0.0 - vitest: 3.1.1(@types/node@22.13.5)(@vitest/ui@3.1.1)(jsdom@26.1.0)(sass@1.86.3) + vitest: 3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.9)(jsdom@26.0.0)(sass@1.86.0) - '@vitest/utils@3.1.1': + '@vitest/utils@3.0.9': dependencies: - '@vitest/pretty-format': 3.1.1 + '@vitest/pretty-format': 3.0.9 loupe: 3.1.3 tinyrainbow: 2.0.0 '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.0 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -4741,7 +5025,7 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.0 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 @@ -4772,23 +5056,23 @@ snapshots: '@vue/shared': 3.5.13 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.3))': + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))': dependencies: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.8.3) + vue: 3.5.13(typescript@5.8.2) '@vue/shared@3.5.13': {} - acorn-import-attributes@1.9.5(acorn@8.14.0): + acorn-import-attributes@1.9.5(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 - acorn@8.14.0: {} + acorn@8.14.1: {} agent-base@6.0.2: dependencies: @@ -4798,20 +5082,20 @@ snapshots: agent-base@7.1.3: {} - ai@2.2.37(react@18.3.1)(solid-js@1.9.5)(svelte@5.27.0)(vue@3.5.13(typescript@5.8.3)): + ai@2.2.37(react@18.3.1)(solid-js@1.9.5)(svelte@5.25.3)(vue@3.5.13(typescript@5.8.2)): dependencies: eventsource-parser: 1.0.0 nanoid: 3.3.6 solid-swr-store: 0.10.7(solid-js@1.9.5)(swr-store@0.10.6) - sswr: 2.0.0(svelte@5.27.0) + sswr: 2.0.0(svelte@5.25.3) swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 - swrv: 1.0.4(vue@3.5.13(typescript@5.8.3)) + swrv: 1.0.4(vue@3.5.13(typescript@5.8.2)) optionalDependencies: react: 18.3.1 solid-js: 1.9.5 - svelte: 5.27.0 - vue: 3.5.13(typescript@5.8.3) + svelte: 5.25.3 + vue: 3.5.13(typescript@5.8.2) ajv@6.12.6: dependencies: @@ -4862,7 +5146,7 @@ snapshots: array-buffer-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-array-buffer: 3.0.5 assertion-error@2.0.1: {} @@ -4871,6 +5155,8 @@ snapshots: dependencies: tslib: 2.8.1 + asynckit@0.4.0: {} + autolinker@3.16.2: dependencies: tslib: 2.8.1 @@ -4900,8 +5186,8 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001701 - electron-to-chromium: 1.5.107 + caniuse-lite: 1.0.30001707 + electron-to-chromium: 1.5.128 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -4919,14 +5205,14 @@ snapshots: get-intrinsic: 1.3.0 set-function-length: 1.2.2 - call-bound@1.0.3: + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 callsites@3.1.0: {} - caniuse-lite@1.0.30001701: {} + caniuse-lite@1.0.30001707: {} ccount@2.0.1: {} @@ -4977,8 +5263,8 @@ snapshots: code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 - acorn: 8.14.0 + '@types/estree': 1.0.7 + acorn: 8.14.1 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -4988,6 +5274,10 @@ snapshots: color-name@1.1.4: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} commander@7.2.0: {} @@ -5000,7 +5290,7 @@ snapshots: cron-parser@4.9.0: dependencies: - luxon: 3.5.0 + luxon: 3.6.0 cross-spawn@7.0.6: dependencies: @@ -5019,7 +5309,7 @@ snapshots: cssstyle@4.3.0: dependencies: - '@asamuzakjp/css-color': 3.1.2 + '@asamuzakjp/css-color': 3.1.1 rrweb-cssom: 0.8.0 csstype@3.1.3: {} @@ -5210,7 +5500,7 @@ snapshots: side-channel: 1.1.0 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 deep-is@0.1.4: {} @@ -5232,6 +5522,8 @@ snapshots: dependencies: robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} + dequal@2.0.3: {} detect-libc@1.0.3: @@ -5262,7 +5554,7 @@ snapshots: tslib: 2.3.0 zrender: 5.6.1 - electron-to-chromium@1.5.107: {} + electron-to-chromium@1.5.128: {} emoji-regex-xs@1.0.0: {} @@ -5290,56 +5582,69 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.25.2: + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.2 - '@esbuild/android-arm': 0.25.2 - '@esbuild/android-arm64': 0.25.2 - '@esbuild/android-x64': 0.25.2 - '@esbuild/darwin-arm64': 0.25.2 - '@esbuild/darwin-x64': 0.25.2 - '@esbuild/freebsd-arm64': 0.25.2 - '@esbuild/freebsd-x64': 0.25.2 - '@esbuild/linux-arm': 0.25.2 - '@esbuild/linux-arm64': 0.25.2 - '@esbuild/linux-ia32': 0.25.2 - '@esbuild/linux-loong64': 0.25.2 - '@esbuild/linux-mips64el': 0.25.2 - '@esbuild/linux-ppc64': 0.25.2 - '@esbuild/linux-riscv64': 0.25.2 - '@esbuild/linux-s390x': 0.25.2 - '@esbuild/linux-x64': 0.25.2 - '@esbuild/netbsd-arm64': 0.25.2 - '@esbuild/netbsd-x64': 0.25.2 - '@esbuild/openbsd-arm64': 0.25.2 - '@esbuild/openbsd-x64': 0.25.2 - '@esbuild/sunos-x64': 0.25.2 - '@esbuild/win32-arm64': 0.25.2 - '@esbuild/win32-ia32': 0.25.2 - '@esbuild/win32-x64': 0.25.2 + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.2(eslint@9.24.0): + eslint-compat-utils@0.6.4(eslint@9.23.0): dependencies: - eslint: 9.24.0 + eslint: 9.23.0 + semver: 7.7.1 - eslint-plugin-svelte@3.5.1(eslint@9.24.0)(svelte@5.27.0): + eslint-config-prettier@10.1.1(eslint@9.23.0): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0) + eslint: 9.23.0 + + eslint-plugin-svelte@3.3.3(eslint@9.23.0)(svelte@5.25.3): + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.24.0 + eslint: 9.23.0 + eslint-compat-utils: 0.6.4(eslint@9.23.0) esutils: 2.0.3 known-css-properties: 0.35.0 postcss: 8.5.3 postcss-load-config: 3.1.4(postcss@8.5.3) postcss-safe-parser: 7.0.1(postcss@8.5.3) semver: 7.7.1 - svelte-eslint-parser: 1.1.2(svelte@5.27.0) + svelte-eslint-parser: 1.1.1(svelte@5.25.3) optionalDependencies: - svelte: 5.27.0 + svelte: 5.25.3 transitivePeerDependencies: - ts-node @@ -5352,20 +5657,20 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.24.0: + eslint@9.23.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.0 - '@eslint/config-helpers': 0.2.1 + '@eslint/config-array': 0.19.2 + '@eslint/config-helpers': 0.2.0 '@eslint/core': 0.12.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.24.0 - '@eslint/plugin-kit': 0.2.8 + '@eslint/js': 9.23.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 @@ -5396,8 +5701,8 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 esprima@4.0.1: {} @@ -5406,7 +5711,7 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@1.4.6: + esrap@1.4.5: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -5420,13 +5725,15 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} eventsource-parser@1.0.0: {} - expect-type@1.2.1: {} + eventsource-parser@3.0.0: {} + + expect-type@1.2.0: {} fast-deep-equal@3.1.3: {} @@ -5480,6 +5787,13 @@ snapshots: dependencies: is-callable: 1.2.7 + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + forwarded-parse@2.1.2: {} framesync@6.1.2: @@ -5622,17 +5936,17 @@ snapshots: ignore@6.0.2: {} - immutable@5.0.3: {} + immutable@5.1.1: {} import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.13.0: + import-in-the-middle@1.13.1: dependencies: - acorn: 8.14.0 - acorn-import-attributes: 1.9.5(acorn@8.14.0) + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) cjs-module-lexer: 1.4.3 module-details-from-path: 1.0.3 @@ -5652,13 +5966,13 @@ snapshots: is-arguments@1.2.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 get-intrinsic: 1.3.0 is-bigint@1.1.0: @@ -5671,7 +5985,7 @@ snapshots: is-boolean-object@1.2.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-callable@1.2.7: {} @@ -5682,7 +5996,7 @@ snapshots: is-date-object@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-extglob@2.1.1: {} @@ -5695,7 +6009,7 @@ snapshots: is-number-object@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -5704,11 +6018,11 @@ snapshots: is-reference@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 is-regex@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -5717,16 +6031,16 @@ snapshots: is-shared-array-buffer@1.0.4: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-string@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-symbol@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 @@ -5734,7 +6048,7 @@ snapshots: is-weakset@2.0.4: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-intrinsic: 1.3.0 isarray@2.0.5: {} @@ -5747,16 +6061,17 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@26.1.0: + jsdom@26.0.0: dependencies: cssstyle: 4.3.0 data-urls: 5.0.0 decimal.js: 10.5.0 + form-data: 4.0.2 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.16 + nwsapi: 2.2.20 parse5: 7.2.1 rrweb-cssom: 0.8.0 saxes: 6.0.0 @@ -5780,6 +6095,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -5821,7 +6138,7 @@ snapshots: dependencies: yallist: 3.1.1 - luxon@3.5.0: {} + luxon@3.6.0: {} lz-string@1.5.0: {} @@ -5839,9 +6156,9 @@ snapshots: magicast@0.2.8: dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 - recast: 0.23.10 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + recast: 0.23.11 math-intrinsics@1.1.0: {} @@ -5883,6 +6200,12 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + min-indent@1.0.1: {} minimatch@3.1.2: @@ -5911,9 +6234,9 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.6: {} + nanoid@3.3.11: {} - nanoid@3.3.8: {} + nanoid@3.3.6: {} nanoid@5.1.5: {} @@ -5932,7 +6255,9 @@ snapshots: normalize-path@3.0.0: {} - nwsapi@2.2.16: {} + normalize.css@8.0.1: {} + + nwsapi@2.2.20: {} object-inspect@1.13.4: {} @@ -5946,7 +6271,7 @@ snapshots: object.assign@4.1.7: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 has-symbols: 1.1.0 @@ -6000,13 +6325,13 @@ snapshots: periscopic@3.1.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 3.0.3 is-reference: 3.0.3 pg-int8@1.0.1: {} - pg-protocol@1.7.1: {} + pg-protocol@1.8.0: {} pg-types@2.2.0: dependencies: @@ -6063,7 +6388,7 @@ snapshots: postcss@8.5.3: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -6079,10 +6404,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.27.0): + prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.3): dependencies: prettier: 3.5.3 - svelte: 5.27.0 + svelte: 5.25.3 prettier@3.5.3: {} @@ -6124,7 +6449,7 @@ snapshots: readdirp@4.1.2: {} - recast@0.23.10: + recast@0.23.11: dependencies: ast-types: 0.16.1 esprima: 4.0.1 @@ -6184,30 +6509,30 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.40.0: + rollup@4.37.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.0 - '@rollup/rollup-android-arm64': 4.40.0 - '@rollup/rollup-darwin-arm64': 4.40.0 - '@rollup/rollup-darwin-x64': 4.40.0 - '@rollup/rollup-freebsd-arm64': 4.40.0 - '@rollup/rollup-freebsd-x64': 4.40.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 - '@rollup/rollup-linux-arm-musleabihf': 4.40.0 - '@rollup/rollup-linux-arm64-gnu': 4.40.0 - '@rollup/rollup-linux-arm64-musl': 4.40.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-musl': 4.40.0 - '@rollup/rollup-linux-s390x-gnu': 4.40.0 - '@rollup/rollup-linux-x64-gnu': 4.40.0 - '@rollup/rollup-linux-x64-musl': 4.40.0 - '@rollup/rollup-win32-arm64-msvc': 4.40.0 - '@rollup/rollup-win32-ia32-msvc': 4.40.0 - '@rollup/rollup-win32-x64-msvc': 4.40.0 + '@rollup/rollup-android-arm-eabi': 4.37.0 + '@rollup/rollup-android-arm64': 4.37.0 + '@rollup/rollup-darwin-arm64': 4.37.0 + '@rollup/rollup-darwin-x64': 4.37.0 + '@rollup/rollup-freebsd-arm64': 4.37.0 + '@rollup/rollup-freebsd-x64': 4.37.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.37.0 + '@rollup/rollup-linux-arm-musleabihf': 4.37.0 + '@rollup/rollup-linux-arm64-gnu': 4.37.0 + '@rollup/rollup-linux-arm64-musl': 4.37.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.37.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0 + '@rollup/rollup-linux-riscv64-gnu': 4.37.0 + '@rollup/rollup-linux-riscv64-musl': 4.37.0 + '@rollup/rollup-linux-s390x-gnu': 4.37.0 + '@rollup/rollup-linux-x64-gnu': 4.37.0 + '@rollup/rollup-linux-x64-musl': 4.37.0 + '@rollup/rollup-win32-arm64-msvc': 4.37.0 + '@rollup/rollup-win32-ia32-msvc': 4.37.0 + '@rollup/rollup-win32-x64-msvc': 4.37.0 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -6224,16 +6549,16 @@ snapshots: safe-regex-test@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 safer-buffer@2.1.2: {} - sass@1.86.3: + sass@1.86.0: dependencies: chokidar: 4.0.3 - immutable: 5.0.3 + immutable: 5.1.1 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 @@ -6246,6 +6571,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + secure-json-parse@2.7.0: {} + semver@6.3.1: {} semver@7.7.1: {} @@ -6300,14 +6627,14 @@ snapshots: side-channel-map@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 object-inspect: 1.13.4 @@ -6354,14 +6681,14 @@ snapshots: sprintf-js@1.0.3: {} - sswr@2.0.0(svelte@5.27.0): + sswr@2.0.0(svelte@5.25.3): dependencies: - svelte: 5.27.0 + svelte: 5.25.3 swrev: 4.0.0 stackback@0.0.2: {} - std-env@3.9.0: {} + std-env@3.8.1: {} stop-iteration-iterator@1.1.0: dependencies: @@ -6390,23 +6717,23 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.1.6(picomatch@4.0.2)(svelte@5.27.0)(typescript@5.8.3): + svelte-check@4.1.5(picomatch@4.0.2)(svelte@5.25.3)(typescript@5.8.2): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 fdir: 6.4.3(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.27.0 - typescript: 5.8.3 + svelte: 5.25.3 + typescript: 5.8.2 transitivePeerDependencies: - picomatch - svelte-confetti@1.4.0(svelte@5.27.0): + svelte-confetti@1.4.0(svelte@5.25.3): dependencies: - svelte: 5.27.0 + svelte: 5.25.3 - svelte-eslint-parser@1.1.2(svelte@5.27.0): + svelte-eslint-parser@1.1.1(svelte@5.25.3): dependencies: eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -6415,43 +6742,43 @@ snapshots: postcss-scss: 4.0.9(postcss@8.5.3) postcss-selector-parser: 7.1.0 optionalDependencies: - svelte: 5.27.0 + svelte: 5.25.3 - svelte-motion@0.12.2(svelte@5.27.0): + svelte-motion@0.12.2(svelte@5.25.3): dependencies: - '@types/react': 18.3.18 + '@types/react': 18.3.20 framesync: 6.1.2 popmotion: 11.0.5 style-value-types: 5.1.2 - svelte: 5.27.0 + svelte: 5.25.3 tslib: 2.8.1 - svelte-preprocess@6.0.3(@babel/core@7.26.9)(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(sass@1.86.3)(svelte@5.27.0)(typescript@5.8.3): + svelte-preprocess@6.0.3(@babel/core@7.26.10)(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(sass@1.86.0)(svelte@5.25.3)(typescript@5.8.2): dependencies: - svelte: 5.27.0 + svelte: 5.25.3 optionalDependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.26.10 postcss: 8.5.3 postcss-load-config: 3.1.4(postcss@8.5.3) - sass: 1.86.3 - typescript: 5.8.3 + sass: 1.86.0 + typescript: 5.8.2 svelte-sequential-preprocessor@2.0.2: dependencies: svelte: 4.2.19 tslib: 2.7.0 - svelte-sonner@0.3.28(svelte@5.27.0): + svelte-sonner@0.3.28(svelte@5.25.3): dependencies: - svelte: 5.27.0 + svelte: 5.25.3 svelte@4.2.19: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.6 - acorn: 8.14.0 + '@types/estree': 1.0.7 + acorn: 8.14.1 aria-query: 5.3.2 axobject-query: 4.1.0 code-red: 1.0.4 @@ -6462,18 +6789,18 @@ snapshots: magic-string: 0.30.17 periscopic: 3.1.0 - svelte@5.27.0: + svelte@5.25.3: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.0) - '@types/estree': 1.0.6 - acorn: 8.14.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) + '@types/estree': 1.0.7 + acorn: 8.14.1 aria-query: 5.3.2 axobject-query: 4.1.0 clsx: 2.1.1 esm-env: 1.2.2 - esrap: 1.4.6 + esrap: 1.4.5 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 @@ -6486,13 +6813,13 @@ snapshots: swr@2.2.0(react@18.3.1): dependencies: react: 18.3.1 - use-sync-external-store: 1.4.0(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) swrev@4.0.0: {} - swrv@1.0.4(vue@3.5.13(typescript@5.8.3)): + swrv@1.0.4(vue@3.5.13(typescript@5.8.2)): dependencies: - vue: 3.5.13(typescript@5.8.3) + vue: 3.5.13(typescript@5.8.2) symbol-tree@3.2.4: {} @@ -6526,11 +6853,11 @@ snapshots: dependencies: '@popperjs/core': 2.11.8 - tldts-core@6.1.86: {} + tldts-core@6.1.85: {} - tldts@6.1.86: + tldts@6.1.85: dependencies: - tldts-core: 6.1.86 + tldts-core: 6.1.85 to-regex-range@5.0.1: dependencies: @@ -6540,19 +6867,19 @@ snapshots: tough-cookie@5.1.2: dependencies: - tldts: 6.1.86 + tldts: 6.1.85 tr46@0.0.3: {} - tr46@5.1.1: + tr46@5.1.0: dependencies: punycode: 2.3.1 trim-lines@3.0.1: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.8.2): dependencies: - typescript: 5.8.3 + typescript: 5.8.2 tslib@2.3.0: {} @@ -6566,17 +6893,17 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.30.1(eslint@9.24.0)(typescript@5.8.3): + typescript-eslint@8.30.1(eslint@9.23.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - eslint: 9.24.0 - typescript: 5.8.3 + '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.30.1(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.30.1(eslint@9.23.0)(typescript@5.8.2) + eslint: 9.23.0 + typescript: 5.8.2 transitivePeerDependencies: - supports-color - typescript@5.8.3: {} + typescript@5.8.2: {} undici-types@6.20.0: {} @@ -6605,7 +6932,7 @@ snapshots: unplugin@1.0.1: dependencies: - acorn: 8.14.0 + acorn: 8.14.1 chokidar: 3.6.0 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 @@ -6620,7 +6947,7 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.4.0(react@18.3.1): + use-sync-external-store@1.5.0(react@18.3.1): dependencies: react: 18.3.1 @@ -6636,13 +6963,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.1(@types/node@22.13.5)(sass@1.86.3): + vite-node@3.0.9(@types/node@22.13.14)(sass@1.86.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) transitivePeerDependencies: - '@types/node' - jiti @@ -6657,49 +6984,46 @@ snapshots: - tsx - yaml - vite@6.3.1(@types/node@22.13.5)(sass@1.86.3): + vite@6.2.3(@types/node@22.13.14)(sass@1.86.0): dependencies: - esbuild: 0.25.2 - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.1 postcss: 8.5.3 - rollup: 4.40.0 - tinyglobby: 0.2.12 + rollup: 4.37.0 optionalDependencies: - '@types/node': 22.13.5 + '@types/node': 22.13.14 fsevents: 2.3.3 - sass: 1.86.3 + sass: 1.86.0 - vitefu@1.0.6(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)): + vitefu@1.0.6(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)): optionalDependencies: - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) - vitest@3.1.1(@types/node@22.13.5)(@vitest/ui@3.1.1)(jsdom@26.1.0)(sass@1.86.3): + vitest@3.0.9(@types/node@22.13.14)(@vitest/ui@3.0.9)(jsdom@26.0.0)(sass@1.86.0): dependencies: - '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.3.1(@types/node@22.13.5)(sass@1.86.3)) - '@vitest/pretty-format': 3.1.1 - '@vitest/runner': 3.1.1 - '@vitest/snapshot': 3.1.1 - '@vitest/spy': 3.1.1 - '@vitest/utils': 3.1.1 + '@vitest/expect': 3.0.9 + '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(sass@1.86.0)) + '@vitest/pretty-format': 3.0.9 + '@vitest/runner': 3.0.9 + '@vitest/snapshot': 3.0.9 + '@vitest/spy': 3.0.9 + '@vitest/utils': 3.0.9 chai: 5.2.0 debug: 4.4.0 - expect-type: 1.2.1 + expect-type: 1.2.0 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.9.0 + std-env: 3.8.1 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.1(@types/node@22.13.5)(sass@1.86.3) - vite-node: 3.1.1(@types/node@22.13.5)(sass@1.86.3) + vite: 6.2.3(@types/node@22.13.14)(sass@1.86.0) + vite-node: 3.0.9(@types/node@22.13.14)(sass@1.86.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.5 - '@vitest/ui': 3.1.1(vitest@3.1.1) - jsdom: 26.1.0 + '@types/node': 22.13.14 + '@vitest/ui': 3.0.9(vitest@3.0.9) + jsdom: 26.0.0 transitivePeerDependencies: - jiti - less @@ -6714,15 +7038,15 @@ snapshots: - tsx - yaml - vue@3.5.13(typescript@5.8.3): + vue@3.5.13(typescript@5.8.2): dependencies: '@vue/compiler-dom': 3.5.13 '@vue/compiler-sfc': 3.5.13 '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.3)) + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.2)) '@vue/shared': 3.5.13 optionalDependencies: - typescript: 5.8.3 + typescript: 5.8.2 w3c-xmlserializer@5.0.0: dependencies: @@ -6744,7 +7068,7 @@ snapshots: whatwg-url@14.2.0: dependencies: - tr46: 5.1.1 + tr46: 5.1.0 webidl-conversions: 7.0.0 whatwg-url@5.0.0: @@ -6767,12 +7091,13 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.18: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 for-each: 0.3.5 + get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -6803,6 +7128,12 @@ snapshots: zimmerframe@1.1.2: {} + zod-to-json-schema@3.24.5(zod@3.24.3): + dependencies: + zod: 3.24.3 + + zod@3.24.3: {} + zrender@5.6.1: dependencies: tslib: 2.3.0 diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index cc36ddc46..063cadd75 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -6,6 +6,7 @@ import { user } from '$lib/stores/user'; import { ENV, MODE, VARS, isCloud } from '$lib/system'; import { AppwriteException } from '@appwrite.io/console'; import { browser } from '$app/environment'; +import { getReferrerAndUtmSource } from '$lib/helpers/utm'; function plausible(domain: string): AnalyticsPlugin { if (!browser) return { name: 'analytics-plugin-plausible' }; @@ -64,6 +65,8 @@ export function trackEvent(name: string, data: object = null): void { }; } + data = { ...data, ...getReferrerAndUtmSource() }; + if (ENV.DEV || ENV.PREVIEW) { console.debug(`[Analytics] Event ${name} ${path}`, data); } else { diff --git a/src/lib/charts/legend.svelte b/src/lib/charts/legend.svelte index 2e72c1410..47489efb2 100644 --- a/src/lib/charts/legend.svelte +++ b/src/lib/charts/legend.svelte @@ -8,16 +8,23 @@
{#each legendData as { name, value }, index} - {@const formattedValue = typeof value === 'number' ? formatNumberWithCommas(value) : value} + {@const formattedValue = + typeof value === 'number' + ? numberFormat === 'comma' + ? formatNumberWithCommas(value) + : abbreviateNumber(value, decimalsForAbbreviate) + : value} {name} ({formattedValue}) diff --git a/src/lib/commandCenter/panels/ai.svelte b/src/lib/commandCenter/panels/ai.svelte index 586c523d3..9bda77da8 100644 --- a/src/lib/commandCenter/panels/ai.svelte +++ b/src/lib/commandCenter/panels/ai.svelte @@ -7,7 +7,7 @@ import { AvatarInitials, Code, LoadingDots, SvgIcon } from '$lib/components'; import { user } from '$lib/stores/user'; - import { useCompletion } from 'ai/svelte'; + import { useCompletion } from '@ai-sdk/svelte'; import { subPanels } from '../subPanels'; import { isLanguage, type Language } from '$lib/components/code.svelte'; @@ -20,7 +20,8 @@ headers: { 'x-appwrite-project': 'console' }, - credentials: 'include' + credentials: 'include', + streamProtocol: 'text' }); const examples = [ @@ -179,7 +180,7 @@ {#if $isLoading || answer}
-
{getInitials($user.name)}
+
{getInitials($user.name || $user.email)}

{previousQuestion}

diff --git a/src/lib/components/billing/alerts/newDevUpgradePro.svelte b/src/lib/components/billing/alerts/newDevUpgradePro.svelte index 29296189a..ab48d3798 100644 --- a/src/lib/components/billing/alerts/newDevUpgradePro.svelte +++ b/src/lib/components/billing/alerts/newDevUpgradePro.svelte @@ -2,7 +2,7 @@ import { base } from '$app/paths'; import { page } from '$app/state'; import { Click, trackEvent } from '$lib/actions/analytics'; - import { BillingPlan } from '$lib/constants'; + import { BillingPlan, NEW_DEV_PRO_UPGRADE_COUPON } from '$lib/constants'; import { Button } from '$lib/elements/forms'; import { organization } from '$lib/stores/organization'; import { activeHeaderAlert } from '$routes/(console)/store'; @@ -29,7 +29,7 @@ secondary fullWidthMobile class="u-line-height-1" - href={`${base}/apply-credit?code=appw50&org=${$organization.$id}`} + href={`${base}/apply-credit?code=${NEW_DEV_PRO_UPGRADE_COUPON}&org=${$organization.$id}`} on:click={() => { trackEvent(Click.CreditsRedeemClick, { from: 'button', diff --git a/src/lib/components/billing/alerts/paymentFailed.svelte b/src/lib/components/billing/alerts/paymentFailed.svelte new file mode 100644 index 000000000..9646864a9 --- /dev/null +++ b/src/lib/components/billing/alerts/paymentFailed.svelte @@ -0,0 +1,25 @@ + + +{#if $failedInvoice && $failedInvoice.teamId === $organization.$id && isOnProjects} + + To avoid service disruptions in your projects, please verify your payment details and try + again. + + + + +{/if} diff --git a/src/lib/components/billing/couponInput.svelte b/src/lib/components/billing/couponInput.svelte index 23d896a75..85e73411c 100644 --- a/src/lib/components/billing/couponInput.svelte +++ b/src/lib/components/billing/couponInput.svelte @@ -18,7 +18,7 @@ async function addCoupon() { try { - const response = await sdk.forConsole.billing.getCoupon(coupon); + const response = await sdk.forConsole.billing.getCouponAccount(coupon); couponData = response; dispatch('validation', couponData); coupon = null; diff --git a/src/lib/components/billing/discountsApplied.svelte b/src/lib/components/billing/discountsApplied.svelte new file mode 100644 index 000000000..e77bf3ca3 --- /dev/null +++ b/src/lib/components/billing/discountsApplied.svelte @@ -0,0 +1,49 @@ + + +{#if value > 0} + +
+

+ + + {label} + +

+ {#if !fixedCoupon && label.toLowerCase() === 'credits'} + + {/if} +
+ {#if value >= 100} +

Credits applied

+ {:else} + -{formatCurrency(value)} + {/if} +
+{/if} diff --git a/src/lib/components/billing/estimatedTotal.svelte b/src/lib/components/billing/estimatedTotal.svelte new file mode 100644 index 000000000..7e7e84803 --- /dev/null +++ b/src/lib/components/billing/estimatedTotal.svelte @@ -0,0 +1,144 @@ + + +{#if estimation} + + + {#if estimation} + {#each estimation.items ?? [] as item} + {#if item.value > 0} + +

{item.label}

+

{formatCurrency(item.value)}

+
+ {/if} + {/each} + {#each estimation.discounts ?? [] as item} + + {/each} +
+ +

Total due

+

+ {formatCurrency(estimation.grossAmount)} +

+
+ +

+ You'll pay {formatCurrency(estimation.grossAmount)} now. + {#if couponData?.code}Once your credits run out,{:else}Then{/if} you'll be charged + {formatCurrency(estimation.amount)} every 30 days. +

+ {/if} + + + {#if budgetEnabled} +
+ +
+ {/if} +
+
+{/if} diff --git a/src/lib/components/billing/estimatedTotalBox.svelte b/src/lib/components/billing/estimatedTotalBox.svelte index e8adcb489..112d506c1 100644 --- a/src/lib/components/billing/estimatedTotalBox.svelte +++ b/src/lib/components/billing/estimatedTotalBox.svelte @@ -43,7 +43,7 @@ Additional seats ({collaborators?.length}) + >Additional seats ({collaborators?.length ?? 0}) {formatCurrency(extraSeatsCost)} diff --git a/src/lib/components/billing/index.ts b/src/lib/components/billing/index.ts index 266d217d8..1cc70d3d9 100644 --- a/src/lib/components/billing/index.ts +++ b/src/lib/components/billing/index.ts @@ -2,8 +2,9 @@ export { default as PaymentBoxes } from './paymentBoxes.svelte'; export { default as CouponInput } from './couponInput.svelte'; export { default as SelectPaymentMethod } from './selectPaymentMethod.svelte'; export { default as UsageRates } from './usageRates.svelte'; -export { default as EstimatedTotalBox } from './estimatedTotalBox.svelte'; export { default as PlanComparisonBox } from './planComparisonBox.svelte'; export { default as EmptyCardCloud } from './emptyCardCloud.svelte'; export { default as CreditsApplied } from './creditsApplied.svelte'; export { default as PlanSelection } from './planSelection.svelte'; +export { default as EstimatedTotal } from './estimatedTotal.svelte'; +export { default as SelectPlan } from './selectPlan.svelte'; diff --git a/src/lib/components/billing/planExcess.svelte b/src/lib/components/billing/planExcess.svelte index f2f874d5e..02793dc70 100644 --- a/src/lib/components/billing/planExcess.svelte +++ b/src/lib/components/billing/planExcess.svelte @@ -2,19 +2,17 @@ import { calculateExcess, plansInfo, tierToPlan, type Tier } from '$lib/stores/billing'; import { organization } from '$lib/stores/organization'; import { toLocaleDate } from '$lib/helpers/date'; - import { Button } from '$lib/elements/forms'; import { humanFileSize } from '$lib/helpers/sizeConvertion'; import { abbreviateNumber } from '$lib/helpers/numbers'; import { formatNum } from '$lib/helpers/string'; import { onMount } from 'svelte'; - import type { OrganizationUsage } from '$lib/sdk/billing'; + import type { Aggregation } from '$lib/sdk/billing'; import { sdk } from '$lib/stores/sdk'; import { BillingPlan } from '$lib/constants'; import { Alert, Icon, Table, Tooltip } from '@appwrite.io/pink-svelte'; import { IconInfo } from '@appwrite.io/pink-icons-svelte'; export let tier: Tier; - export let members: number; const plan = $plansInfo?.get(tier); let excess: { @@ -24,16 +22,15 @@ executions?: number; members?: number; } = null; - let usage: OrganizationUsage = null; + let aggregation: Aggregation = null; let showExcess = false; onMount(async () => { - usage = await sdk.forConsole.billing.listUsage( + aggregation = await sdk.forConsole.billing.getAggregation( $organization.$id, - $organization.billingCurrentInvoiceDate, - new Date().toISOString() + $organization.billingAggregationId ); - excess = calculateExcess(usage, plan, members); + excess = calculateExcess(aggregation, plan); showExcess = Object.values(excess).some((value) => value > 0); }); @@ -41,22 +38,16 @@ {#if showExcess} - Following payment of your final invoice, your organization will switch to the {tierToPlan( - BillingPlan.FREE - ).name} plan. {#if excess?.members > 0}All team members except the owner will be removed on - that date.{/if} Service disruptions may occur unless resource usage is reduced. - - - - + You will retain access to {tierToPlan($organization.billingPlan).name} plan features until your + billing period ends. After that, + {#if excess?.members > 0} + all team members except the owner will be removed, + {:else} + your organization will be limited to Free plan resources, + {/if} and service disruptions may occur if usage exceeds Free plan limits. @@ -73,7 +64,7 @@ {#if excess?.members} Organization members - {plan.members} members + {plan.addons.seats.limit} members

diff --git a/src/lib/components/billing/selectPlan.svelte b/src/lib/components/billing/selectPlan.svelte new file mode 100644 index 000000000..8aae2f0ac --- /dev/null +++ b/src/lib/components/billing/selectPlan.svelte @@ -0,0 +1,51 @@ + + +{#if billingPlan} +

    + {#each $plansInfo.values() as plan} +
  • + + +
    +

    + {plan.name} + {#if $organization?.billingPlan === plan.$id && !isNewOrg} + Current plan + {/if} +

    +

    + {plan.desc} +

    +

    + {formatCurrency(plan?.price ?? 0)} +

    +
    +
    +
    +
  • + {/each} +
+{/if} diff --git a/src/lib/components/billing/usageRates.svelte b/src/lib/components/billing/usageRates.svelte index e835284c2..4635a1d5a 100644 --- a/src/lib/components/billing/usageRates.svelte +++ b/src/lib/components/billing/usageRates.svelte @@ -43,6 +43,13 @@ ]; $: isFree = org.billingPlan === BillingPlan.FREE; + + // equal or above means unlimited! + $: getCorrectSeatsCountValue = (count: number): string | number => { + // php int max is always larger than js + const exceedsSafeLimit = count >= Number.MAX_SAFE_INTEGER; + return exceedsSafeLimit ? 'Unlimited' : count || 0; + }; @@ -75,10 +82,10 @@ {usage.resource} - {plan[usage.id] || 'Unlimited'} + {getCorrectSeatsCountValue(plan.addons.seats.limit)} - {formatCurrency(plan.addons?.member?.price)}/{usage?.unit} + {formatCurrency(plan.addons?.seats?.price)}/{usage?.unit} {:else} diff --git a/src/lib/components/billing/validateCreditModal.svelte b/src/lib/components/billing/validateCreditModal.svelte index ebdf09acb..130532a7b 100644 --- a/src/lib/components/billing/validateCreditModal.svelte +++ b/src/lib/components/billing/validateCreditModal.svelte @@ -19,7 +19,8 @@ async function addCoupon() { try { - const response = await sdk.forConsole.billing.getCoupon(coupon); + // const response = await sdk.forConsole.billing.getCoupon(coupon); + const response = await sdk.forConsole.billing.getCouponAccount(coupon); //TODO: double check that this is the correct method if (response.onlyNewOrgs && !isNewOrg) { show = false; @@ -37,6 +38,14 @@ message: 'Credits applied successfully' }); } + couponData = response; + dispatch('validation', couponData); + coupon = null; + show = false; + addNotification({ + type: 'success', + message: 'Credits applied successfully' + }); } catch (e) { error = e.message; } diff --git a/src/lib/components/boxAvatar.svelte b/src/lib/components/boxAvatar.svelte index c2400d897..7ba70c789 100644 --- a/src/lib/components/boxAvatar.svelte +++ b/src/lib/components/boxAvatar.svelte @@ -4,7 +4,7 @@ - +
diff --git a/src/lib/components/emptyCardImageCloud.svelte b/src/lib/components/emptyCardImageCloud.svelte index 53f6c2124..2063c3388 100644 --- a/src/lib/components/emptyCardImageCloud.svelte +++ b/src/lib/components/emptyCardImageCloud.svelte @@ -7,13 +7,10 @@ export let noAspectRatio = false; - - + + {#if $$slots?.image} -
+
{/if} diff --git a/src/lib/components/feedback/feedback.svelte b/src/lib/components/feedback/feedback.svelte index 9fc52afd3..2d1a7623c 100644 --- a/src/lib/components/feedback/feedback.svelte +++ b/src/lib/components/feedback/feedback.svelte @@ -11,6 +11,7 @@ import { addNotification } from '$lib/stores/notifications'; import { page } from '$app/state'; import { Typography } from '@appwrite.io/pink-svelte'; + import { project } from '$routes/(console)/project-[project]/store'; $: $selectedFeedback = feedbackOptions.find((option) => option.type === $feedback.type); @@ -24,8 +25,11 @@ page.url.href, $user.name, $user.email, - $organization.billingPlan, - $feedbackData.value + $organization?.billingPlan, + $feedbackData.value, + $organization?.$id, + $project?.$id, + $user.$id ); addNotification({ type: 'success', diff --git a/src/lib/components/filters/customFilters.svelte b/src/lib/components/filters/customFilters.svelte index 09ff475fb..8fd765f27 100644 --- a/src/lib/components/filters/customFilters.svelte +++ b/src/lib/components/filters/customFilters.svelte @@ -12,7 +12,9 @@ { show = true; - }}>Custom filters + }}> + Custom filters + {#if show} diff --git a/src/lib/components/filters/filtersModal.svelte b/src/lib/components/filters/filtersModal.svelte index aebb86f76..a192a60ea 100644 --- a/src/lib/components/filters/filtersModal.svelte +++ b/src/lib/components/filters/filtersModal.svelte @@ -11,11 +11,19 @@ } from '$lib/elements/forms'; import type { Writable } from 'svelte/store'; import Modal from '../modal.svelte'; - import { addFilter, generateTag, operators, queries, type TagValue } from './store'; + import { + addFilter, + generateTag, + operators, + queries, + ValidOperators, + type TagValue + } from './store'; import type { Column } from '$lib/helpers/types'; import { TagList } from '.'; import { Icon, Layout } from '@appwrite.io/pink-svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; + import { addFilterAndApply } from './quickFilters'; export let show = false; export let columns: Writable; @@ -35,9 +43,17 @@ function apply() { localQueries.forEach((query) => { - addFilter($columns, query.id, query.operator, query.value, query.arrayValues); + addFilterAndApply( + query.id, + $columns.find((c) => c.id === query.id).title, + query.operator as ValidOperators, + query.value, + query.arrayValues, + $columns, + analyticsSource + ); }); - queries.apply(); + localTags = []; localQueries = []; trackEvent(Submit.FilterApply, { @@ -48,7 +64,7 @@ } function addCondition() { - const newTag = generateTag(selectedColumn, operatorKey, value, arrayValues); + const newTag = generateTag(selectedColumn, operatorKey, value || arrayValues); if (localTags.some((t) => t.tag === newTag.tag && t.value === newTag.value)) { return; } else { diff --git a/src/lib/components/filters/quickFilters.svelte b/src/lib/components/filters/quickFilters.svelte index 143fe5c73..c00316154 100644 --- a/src/lib/components/filters/quickFilters.svelte +++ b/src/lib/components/filters/quickFilters.svelte @@ -1,107 +1,70 @@ -{#if $isSmallViewport} - {#if $parsedTags?.length} - - {:else} - - {/if} -{:else} - - {#if $parsedTags?.length} - - {:else} - - {/if} - - {#each filterCols as filter (filter.title + filter.id)} - {#if filter.options} - { - addFilterAndApply( - filter.id, - filter.title, - filter.operator, - e.detail.value, - filter?.array - ? (filter.options - .filter((opt) => opt.checked) - .map((opt) => opt.value) ?? []) - : [], - $columns, - analyticsSource - ); - }} - on:clear={() => { - addFilterAndApply( - filter.id, - filter.title, - filter.operator, - null, - [], - $columns, - analyticsSource - ); - }} /> - {/if} - {/each} - + + + + {#each filterCols.filter((f) => f?.options) as filter (filter.title + filter.id)} + {#if filter.options} + { + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + e.detail.value, + filter?.array + ? (filter.options + .filter((opt) => opt.checked) + .map((opt) => opt.value) ?? []) + : [], + $columns, + analyticsSource + ); + }} + on:clear={() => { + addFilterAndApply( + filter.id, + filter.title, + filter.operator, + null, + [], + $columns, + analyticsSource + ); + }} /> + {/if} + {/each} + - - - - -{/if} - -{#if $isSmallViewport && openBottomSheet} - -{/if} + + + + diff --git a/src/lib/components/filters/quickfiltersSubMenu.svelte b/src/lib/components/filters/quickfiltersSubMenu.svelte index b49bef07e..9b4c3275c 100644 --- a/src/lib/components/filters/quickfiltersSubMenu.svelte +++ b/src/lib/components/filters/quickfiltersSubMenu.svelte @@ -34,9 +34,10 @@
- - {filter.title} + + + {filter.title} +
diff --git a/src/lib/components/filters/setFilters.ts b/src/lib/components/filters/setFilters.ts index 7c8d858d2..c59a2408c 100644 --- a/src/lib/components/filters/setFilters.ts +++ b/src/lib/components/filters/setFilters.ts @@ -9,17 +9,18 @@ export function setFilters(localTags: TagValue[], filterCols: FilterData[], $col if (!localTags?.length) { filterCols.forEach((filter) => { resetOptions(filter); - cleanOldTags(filter.title); + cleanOldTags(filter?.title); }); } else { filterCols.forEach((filter) => { - if (filter.id.toLowerCase().includes('duration')) { + const id = filter?.id?.toLowerCase(); + if (id?.includes('duration')) { setTimeFilter(filter, $columns); - } else if (filter.id.toLocaleLowerCase().includes('size')) { + } else if (id?.includes('size')) { setSizeFilter(filter, $columns); - } else if (filter.id.toLocaleLowerCase().includes('statuscode')) { + } else if (id?.includes('statuscode')) { setStatusCodeFilter(filter, $columns); - } else if (filter.id === '$createdAt' || filter.id === '$updatedAt') { + } else if (id === '$createdat' || id === '$updatedat') { setDateFilter(filter, $columns); } else { setFilterData(filter); @@ -40,7 +41,7 @@ export function setFilterData(filter: FilterData) { option.checked = values.includes(option.value); }); } - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: tagData.tag.replace(',', ' or '), value: tagData.value @@ -52,7 +53,7 @@ export function setFilterData(filter: FilterData) { }); } else { resetOptions(filter); - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -76,7 +77,7 @@ export function setTimeFilter(filter: FilterData, columns: Column[]) { value: timeTag.value }; - cleanOldTags(filter.title); + cleanOldTags(filter?.title); parsedTags.update((tags) => { tags.push(newTag); @@ -84,7 +85,7 @@ export function setTimeFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -102,7 +103,7 @@ export function setSizeFilter(filter: FilterData, columns: Column[]) { return prev; }); if (sizeRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${sizeRange.label}**`, @@ -114,7 +115,7 @@ export function setSizeFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -127,7 +128,7 @@ export function setStatusCodeFilter(filter: FilterData, columns: Column[]) { const codeRange = ranges.find((c) => c?.value && c.value === statusCodeTag.value); if (codeRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${codeRange.label}**`, value: statusCodeTag.value @@ -139,7 +140,7 @@ export function setStatusCodeFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } @@ -158,7 +159,7 @@ export function setDateFilter(filter: FilterData, columns: Column[]) { return prev; }); if (dateRange) { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); const newTag = { tag: `**${filter.title}** is **${dateRange.label}**`, value: dateTag.value @@ -169,11 +170,12 @@ export function setDateFilter(filter: FilterData, columns: Column[]) { }); } } else { - cleanOldTags(filter.title); + cleanOldTags(filter?.title); } } function cleanOldTags(title: string) { + if (!title) return; parsedTags.update((tags) => { tags = tags.filter((tag) => !tag.tag.includes(`**${title}**`)); return tags; @@ -181,6 +183,7 @@ function cleanOldTags(title: string) { } export function resetOptions(filter: FilterData) { + if (!filter?.options) return; filter.options.forEach((option) => { option.checked = false; }); diff --git a/src/lib/components/git/deploymentDomains.svelte b/src/lib/components/git/deploymentDomains.svelte index bb6ed3942..f588cc57c 100644 --- a/src/lib/components/git/deploymentDomains.svelte +++ b/src/lib/components/git/deploymentDomains.svelte @@ -42,12 +42,12 @@ {#if sortedDomains.length > 1} - + +{sortedDomains.length - 1} - + {#each sortedDomains as rule, i} {#if i !== 0} - import { EmptySearch, Paginator } from '$lib/components'; + import { Empty, EmptySearch, Paginator } from '$lib/components'; import { Button, InputSearch, InputSelect } from '$lib/elements/forms'; import { timeFromNow } from '$lib/helpers/date'; import { sdk } from '$lib/stores/sdk'; @@ -20,6 +20,7 @@ import { VCSDetectionType, type Models } from '@appwrite.io/console'; import { getFrameworkIcon } from '$lib/stores/sites'; import { connectGitHub } from '$lib/stores/git'; + import Card from '../card.svelte'; let { action = $bindable('select'), @@ -79,7 +80,6 @@ selectedRepository = $repositories.repositories[0].id; $repository = $repositories.repositories[0]; } - return $repositories.repositories; } @@ -148,7 +148,10 @@ ); }} bind:value={selectedInstallation} /> - + {/await} @@ -173,7 +176,10 @@ {:then response} {#if response?.length} - {#snippet children(paginatedItems)} + {#snippet children( + paginatedItems: Models.ProviderRepositoryRuntime[] & + Models.ProviderRepositoryFramework[] + )} {#each paginatedItems as repo} @@ -257,7 +263,7 @@ {/snippet} - {:else} + {:else if search} {#if search} @@ -267,6 +273,14 @@ {/if} + {:else} + + + + No repositories available + + + {/if} {/await} {/if} diff --git a/src/lib/components/labelCard.svelte b/src/lib/components/labelCard.svelte index 052e2ddd3..ffcd8474c 100644 --- a/src/lib/components/labelCard.svelte +++ b/src/lib/components/labelCard.svelte @@ -1,5 +1,5 @@ - + diff --git a/src/lib/components/paginator.svelte b/src/lib/components/paginator.svelte index e7b252d82..de410b087 100644 --- a/src/lib/components/paginator.svelte +++ b/src/lib/components/paginator.svelte @@ -1,7 +1,8 @@ - - + {@render children(paginatedItems, limit)} {#if !hideFooter} diff --git a/src/lib/components/permissions/permissions.svelte b/src/lib/components/permissions/permissions.svelte index a4f6875e7..1dabdb0ba 100644 --- a/src/lib/components/permissions/permissions.svelte +++ b/src/lib/components/permissions/permissions.svelte @@ -226,3 +226,14 @@
{/if} + + diff --git a/src/lib/components/progressBarBig.svelte b/src/lib/components/progressBarBig.svelte index 54ed44d8c..c521e7f95 100644 --- a/src/lib/components/progressBarBig.svelte +++ b/src/lib/components/progressBarBig.svelte @@ -7,7 +7,7 @@ export let maxValue: string | undefined = undefined; export let maxUnit: string | undefined = undefined; export let progressValue: number; - export let progressMax: number; + export let progressMax: number | undefined = undefined; export let showBar = true; export let progressBarData: Array = []; @@ -15,7 +15,7 @@
- {#if currentValue !== undefined && currentUnit !== undefined && progress !== undefined && maxValue !== undefined} + {#if currentValue !== undefined && currentUnit !== undefined && progress !== undefined}
@@ -23,14 +23,18 @@ {currentValue} {currentUnit} - - {maxValue} - {maxUnit ? maxUnit : ''} - + {#if maxValue !== undefined} + + {maxValue} + {maxUnit ? maxUnit : ''} + + {/if} -
- -
+ {#if progressMax !== undefined} +
+ +
+ {/if}
{/if} diff --git a/src/lib/components/regionCard.svelte b/src/lib/components/regionCard.svelte index 3e1964802..795451e46 100644 --- a/src/lib/components/regionCard.svelte +++ b/src/lib/components/regionCard.svelte @@ -1,9 +1,12 @@
diff --git a/src/lib/layout/usageMultiple.svelte b/src/lib/layout/usageMultiple.svelte index 4b5db9588..421b0892b 100644 --- a/src/lib/layout/usageMultiple.svelte +++ b/src/lib/layout/usageMultiple.svelte @@ -13,6 +13,7 @@ export let count: Models.Metric[][]; export let legendData: LegendData[]; export let showHeader: boolean = true; + export let legendNumberFormat: 'comma' | 'abbreviate' = 'comma';
@@ -55,7 +56,10 @@ }))} /> {#if legendData} - + {/if}
{/if} diff --git a/src/lib/layout/wizardSecondaryContent.svelte b/src/lib/layout/wizardSecondaryContent.svelte index 6afa25335..f4e9ea882 100644 --- a/src/lib/layout/wizardSecondaryContent.svelte +++ b/src/lib/layout/wizardSecondaryContent.svelte @@ -1,8 +1,12 @@ + +
- {#if $$slots.aside} + {#if !hideSidebar}
diff --git a/src/lib/sdk/billing.ts b/src/lib/sdk/billing.ts index d9ac25147..6dcacb3af 100644 --- a/src/lib/sdk/billing.ts +++ b/src/lib/sdk/billing.ts @@ -1,8 +1,8 @@ -import type { Client, Models } from '@appwrite.io/console'; -import type { Organization, OrganizationList } from '../stores/organization'; -import type { PaymentMethod } from '@stripe/stripe-js'; import type { Tier } from '$lib/stores/billing'; import type { Campaign } from '$lib/stores/campaigns'; +import type { Client, Models } from '@appwrite.io/console'; +import type { PaymentMethod } from '@stripe/stripe-js'; +import type { Organization, OrganizationError, OrganizationList } from '../stores/organization'; export type PaymentMethodData = { $id: string; @@ -65,6 +65,32 @@ export type InvoiceList = { total: number; }; +export type Estimation = { + amount: number; + grossAmount: number; + credits: number; + discount: number; + items: EstimationItem[]; + discounts: EstimationItem[]; + trialDays: number; + trialEndDate: string | undefined; + error: string | undefined; +}; + +export type EstimationItem = { + label: string; + value: number; +}; + +export type EstimationDeleteOrganization = { + amount: number; + grossAmount: number; + credits: number; + discount: number; + items: EstimationItem[]; + unpaidInvoices: Invoice[]; +}; + export type Coupon = { $id: string; code: string; @@ -147,10 +173,12 @@ export type Aggregation = { * Total amount of the invoice. */ amount: number; + additionalMembers: number; + /** * Price for additional members */ - additionalMembers: number; + additionalMemberAmount: number; /** * Total storage usage. */ @@ -175,6 +203,10 @@ export type Aggregation = { * Usage logs for the billing period. */ resources: OrganizationUsage; + /** + * Aggregation billing plan + */ + plan: string; }; export type OrganizationUsage = { @@ -182,11 +214,13 @@ export type OrganizationUsage = { executions: Array; databasesReads: Array; databasesWrites: Array; + imageTransformations: Array; executionsTotal: number; filesStorageTotal: number; buildsStorageTotal: number; databasesReadsTotal: number; databasesWritesTotal: number; + imageTransformationsTotal: number; deploymentsStorageTotal: number; executionsMBSecondsTotal: number; buildsMBSecondsTotal: number; @@ -204,6 +238,7 @@ export type OrganizationUsage = { users: number; authPhoneTotal: number; authPhoneEstimate: number; + imageTransformations: number; }>; authPhoneTotal: number; authPhoneEstimate: number; @@ -264,14 +299,25 @@ export type AdditionalResource = { multiplier?: number; }; +export type PlanAddon = { + supported: boolean; + currency: string; + invoiceDesc: string; + price: number; + limit: number; + value: number; + type: string; +}; + export type Plan = { $id: string; name: string; + desc: string; price: number; order: number; bandwidth: number; storage: number; - members: number; + imageTransformations: number; webhooks: number; users: number; teams: number; @@ -283,7 +329,7 @@ export type Plan = { realtime: number; logs: number; authPhone: number; - addons: { + usage: { bandwidth: AdditionalResource; executions: AdditionalResource; member: AdditionalResource; @@ -291,7 +337,11 @@ export type Plan = { storage: AdditionalResource; users: AdditionalResource; }; + addons: { + seats: PlanAddon; + }; trialDays: number; + budgetCapEnabled: boolean; isAvailable: boolean; selfService: boolean; premiumSupport: boolean; @@ -300,9 +350,10 @@ export type Plan = { backupsEnabled: boolean; backupPolicies: number; emailBranding: boolean; + supportsCredits: boolean; }; -export type PlansInfo = { +export type PlanList = { plans: Plan[]; total: number; }; @@ -337,20 +388,45 @@ export class Billing { ); } + async validateOrganization(organizationId: string, invites: string[]): Promise { + const path = `/organizations/${organizationId}/validate`; + const params = { + organizationId, + invites + }; + const uri = new URL(this.client.config.endpoint + path); + return await this.client.call( + 'PATCH', + uri, + { + 'content-type': 'application/json' + }, + params + ); + } + async createOrganization( organizationId: string, name: string, billingPlan: string, paymentMethodId: string, - billingAddressId: string = undefined - ): Promise { + billingAddressId: string = null, + couponId: string = null, + invites: Array = [], + budget: number = undefined, + taxId: string = null + ): Promise { const path = `/organizations`; const params = { organizationId, name, billingPlan, paymentMethodId, - billingAddressId + billingAddressId, + couponId, + invites, + budget, + taxId }; const uri = new URL(this.client.config.endpoint + path); return await this.client.call( @@ -363,6 +439,28 @@ export class Billing { ); } + async estimationCreateOrganization( + billingPlan: string, + couponId: string = null, + invites: Array = [] + ): Promise { + const path = `/organizations/estimations/create-organization`; + const params = { + billingPlan, + couponId, + invites + }; + const uri = new URL(this.client.config.endpoint + path); + return await this.client.call( + 'patch', + uri, + { + 'content-type': 'application/json' + }, + params + ); + } + async deleteOrganization(organizationId: string): Promise { const path = `/organizations/${organizationId}`; const params = { @@ -379,20 +477,30 @@ export class Billing { ); } - async getPlan(organizationId: string): Promise { - const path = `/organizations/${organizationId}/plan`; - const params = { - organizationId - }; + async estimationDeleteOrganization( + organizationId: string + ): Promise { + const path = `/organizations/${organizationId}/estimations/delete-organization`; const uri = new URL(this.client.config.endpoint + path); - return await this.client.call( - 'get', - uri, - { - 'content-type': 'application/json' - }, - params - ); + return await this.client.call('patch', uri, { + 'content-type': 'application/json' + }); + } + + async getOrganizationPlan(organizationId: string): Promise { + const path = `/organizations/${organizationId}/plan`; + const uri = new URL(this.client.config.endpoint + path); + return await this.client.call('get', uri, { + 'content-type': 'application/json' + }); + } + + async getPlan(planId: string): Promise { + const path = `/console/plans/${planId}`; + const uri = new URL(this.client.config.endpoint + path); + return await this.client.call('get', uri, { + 'content-type': 'application/json' + }); } async getRoles(organizationId: string): Promise { @@ -407,14 +515,22 @@ export class Billing { organizationId: string, billingPlan: string, paymentMethodId: string, - billingAddressId: string = undefined - ): Promise { + billingAddressId: string = undefined, + couponId: string = null, + invites: Array = [], + budget: number = undefined, + taxId: string = null + ): Promise { const path = `/organizations/${organizationId}/plan`; const params = { organizationId, billingPlan, paymentMethodId, - billingAddressId + billingAddressId, + couponId, + invites, + budget, + taxId }; const uri = new URL(this.client.config.endpoint + path); return await this.client.call( @@ -427,6 +543,37 @@ export class Billing { ); } + async estimationUpdatePlan( + organizationId: string, + billingPlan: string, + couponId: string = null, + invites: Array = [] + ): Promise { + const path = `/organizations/${organizationId}/estimations/update-plan`; + const params = { + billingPlan, + couponId, + invites + }; + const uri = new URL(this.client.config.endpoint + path); + return await this.client.call( + 'patch', + uri, + { + 'content-type': 'application/json' + }, + params + ); + } + + async cancelDowngrade(organizationId: string): Promise { + const path = `/organizations/${organizationId}/plan/cancel`; + const uri = new URL(this.client.config.endpoint + path); + return await this.client.call('patch', uri, { + 'content-type': 'application/json' + }); + } + async updateBudget( organizationId: string, budget: number, @@ -594,6 +741,14 @@ export class Billing { ); } + async updateInvoiceStatus(organizationId: string, invoiceId: string): Promise { + const path = `/organizations/${organizationId}/invoices/${invoiceId}/status`; + const uri = new URL(this.client.config.endpoint + path); + return await this.client.call('PATCH', uri, { + 'content-type': 'application/json' + }); + } + async retryPayment( organizationId: string, invoiceId: string, @@ -750,6 +905,22 @@ export class Billing { } } + async getCouponAccount(couponId: string): Promise { + const path = `/account/coupons/${couponId}`; + const params = { + couponId + }; + const uri = new URL(this.client.config.endpoint + path); + return await this.client.call( + 'GET', + uri, + { + 'content-type': 'application/json' + }, + params + ); + } + async getCoupon(couponId: string): Promise { const path = `/console/coupons/${couponId}`; const params = { @@ -1120,7 +1291,7 @@ export class Billing { ); } - async getPlansInfo(): Promise { + async getPlansInfo(): Promise { const path = `/console/plans`; const params = {}; const uri = new URL(this.client.config.endpoint + path); diff --git a/src/lib/sdk/usage.ts b/src/lib/sdk/usage.ts index 304bad1f6..b446bfa50 100644 --- a/src/lib/sdk/usage.ts +++ b/src/lib/sdk/usage.ts @@ -185,6 +185,14 @@ export type UsageBuckets = { * Aggregated statistics of bucket storage files per period. */ storage: Metric[]; + /** + * Aggregated statistics of bucket image transformations per period. + */ + imageTransformations: Metric[]; + /** + * Total aggregated number of bucket image transformations. + */ + imageTransformationsTotal: number; }; /** * UsageFunctions @@ -311,7 +319,17 @@ export type UsageProject = { authPhoneEstimate: number; /** - * Aggregated statistics of total number SMS by country + * Aggregated statistics of total number SMS by country. */ authPhoneCountriesBreakdown: Models.MetricBreakdown[]; + + /** + * Array of image transformations per period. + */ + imageTransformations: Metric[]; + + /** + * Aggregated statistics of total number of image transformations. + */ + imageTransformationsTotal: number; }; diff --git a/src/lib/stores/billing.ts b/src/lib/stores/billing.ts index 146239b36..efcd47ba9 100644 --- a/src/lib/stores/billing.ts +++ b/src/lib/stores/billing.ts @@ -1,40 +1,41 @@ -import { page } from '$app/stores'; -import { derived, get, writable } from 'svelte/store'; -import { sdk } from './sdk'; -import { organization, type Organization } from './organization'; -import type { - InvoiceList, - AddressesList, - Invoice, - PaymentList, - PlansMap, - PaymentMethodData, - OrganizationUsage, - Plan -} from '$lib/sdk/billing'; -import { isCloud } from '$lib/system'; -import { cachedStore } from '$lib/helpers/cache'; -import { Query } from '@appwrite.io/console'; -import { headerAlert } from './headerAlert'; -import PaymentAuthRequired from '$lib/components/billing/alerts/paymentAuthRequired.svelte'; -import { addNotification, notifications } from './notifications'; +import { browser } from '$app/environment'; import { goto } from '$app/navigation'; import { base } from '$app/paths'; -import { activeHeaderAlert, orgMissingPaymentMethod } from '$routes/(console)/store'; -import MarkedForDeletion from '$lib/components/billing/alerts/markedForDeletion.svelte'; -import { BillingPlan } from '$lib/constants'; -import PaymentMandate from '$lib/components/billing/alerts/paymentMandate.svelte'; -import MissingPaymentMethod from '$lib/components/billing/alerts/missingPaymentMethod.svelte'; -import LimitReached from '$lib/components/billing/alerts/limitReached.svelte'; import { Click, trackEvent } from '$lib/actions/analytics'; +import { page } from '$app/stores'; +import LimitReached from '$lib/components/billing/alerts/limitReached.svelte'; +import MarkedForDeletion from '$lib/components/billing/alerts/markedForDeletion.svelte'; +import MissingPaymentMethod from '$lib/components/billing/alerts/missingPaymentMethod.svelte'; import newDevUpgradePro from '$lib/components/billing/alerts/newDevUpgradePro.svelte'; -import { last } from '$lib/helpers/array'; +import PaymentAuthRequired from '$lib/components/billing/alerts/paymentAuthRequired.svelte'; +import PaymentMandate from '$lib/components/billing/alerts/paymentMandate.svelte'; +import { BillingPlan, NEW_DEV_PRO_UPGRADE_COUPON } from '$lib/constants'; +import { cachedStore } from '$lib/helpers/cache'; import { sizeToBytes, type Size } from '$lib/helpers/sizeConvertion'; -import { user } from './user'; -import { browser } from '$app/environment'; +import type { + AddressesList, + Aggregation, + Invoice, + InvoiceList, + PaymentList, + PaymentMethodData, + Plan, + PlansMap +} from '$lib/sdk/billing'; +import { isCloud } from '$lib/system'; +import { activeHeaderAlert, orgMissingPaymentMethod } from '$routes/(console)/store'; +import { Query } from '@appwrite.io/console'; +import { derived, get, writable } from 'svelte/store'; +import { headerAlert } from './headerAlert'; +import { addNotification, notifications } from './notifications'; +import { organization, type Organization, type OrganizationError } from './organization'; import { canSeeBilling } from './roles'; +import { sdk } from './sdk'; +import { user } from './user'; +import BudgetLimitAlert from '$routes/(console)/organization-[organization]/budgetLimitAlert.svelte'; +import TeamReadonlyAlert from '$routes/(console)/organization-[organization]/teamReadonlyAlert.svelte'; -export type Tier = 'tier-0' | 'tier-1' | 'tier-2' | 'auto-1' | 'cont-1'; +export type Tier = 'tier-0' | 'tier-1' | 'tier-2' | 'auto-1' | 'cont-1' | 'ent-1'; export const roles = [ { @@ -59,12 +60,20 @@ export const roles = [ } ]; +export const teamStatusReadonly = 'readonly'; +export const billingLimitOutstandingInvoice = 'outstanding_invoice'; + export const paymentMethods = derived(page, ($page) => $page.data.paymentMethods as PaymentList); export const addressList = derived(page, ($page) => $page.data.addressList as AddressesList); export const plansInfo = derived(page, ($page) => $page.data.plansInfo as PlansMap); export const daysLeftInTrial = writable(0); export const readOnly = writable(false); +export const showBudgetAlert = derived( + page, + ($page) => ($page.data.organization?.billingLimits.budgetLimit ?? 0) >= 100 +); + export function getRoleLabel(role: string) { return roles.find((r) => r.value === role)?.label ?? role; } @@ -81,6 +90,8 @@ export function tierToPlan(tier: Tier) { return tierGitHubEducation; case BillingPlan.CUSTOM: return tierCustom; + case BillingPlan.ENTERPRISE: + return tierEnterprise; default: return tierFree; } @@ -130,7 +141,8 @@ export type PlanServices = | 'usersAddon' | 'webhooks' | 'sites' - | 'authPhone'; + | 'authPhone' + | 'imageTransformations'; export function getServiceLimit(serviceId: PlanServices, tier: Tier = null, plan?: Plan): number { if (!isCloud) return 0; @@ -138,6 +150,14 @@ export function getServiceLimit(serviceId: PlanServices, tier: Tier = null, plan const info = get(plansInfo); if (!info) return 0; plan ??= info.get(tier ?? get(organization)?.billingPlan); + // members are no longer a variable on plan itself! + // the correct info for members/seats, resides in `addons`. + // plan > addons > seats/others + if (serviceId === 'members') { + // some don't include `limit`, so we fallback! + return plan?.['addons']['seats']['limit'] ?? 1; + } + return plan?.[serviceId] ?? 0; } @@ -151,11 +171,12 @@ export const failedInvoice = cachedStore< load: async (orgId) => { if (!isCloud) set(null); if (!get(canSeeBilling)) set(null); - const invoices = await sdk.forConsole.billing.listInvoices(orgId); - const failedInvoices = invoices.invoices.filter((i) => i.status === 'failed'); + const failedInvoices = await sdk.forConsole.billing.listInvoices(orgId, [ + Query.equal('status', 'failed') + ]); // const failedInvoices = invoices.invoices; - if (failedInvoices?.length > 0) { - const firstFailed = failedInvoices[0]; + if (failedInvoices?.invoices?.length > 0) { + const firstFailed = failedInvoices.invoices[0]; const today = new Date(); const thirtyDaysAgo = new Date(today.setDate(today.getDate() - 30)); const failedDate = new Date(firstFailed.$createdAt); @@ -200,6 +221,11 @@ export const tierCustom: TierData = { description: 'Team on a custom contract' }; +export const tierEnterprise: TierData = { + name: 'Enterprise', + description: 'For enterprises that need more power and premium support.' +}; + export const showUsageRatesModal = writable(false); export function checkForUsageFees(plan: Tier, id: PlanServices) { @@ -257,13 +283,35 @@ export function calculateTrialDay(org: Organization) { } export async function checkForUsageLimit(org: Organization) { - if (org?.billingPlan !== BillingPlan.FREE) { + if (org?.status === teamStatusReadonly && org?.remarks === billingLimitOutstandingInvoice) { + headerAlert.add({ + id: 'teamReadOnlyFailedInvoices', + component: TeamReadonlyAlert, + show: true, + importance: 11 + }); + readOnly.set(true); + return; + } + if (!org?.billingLimits && org?.status !== teamStatusReadonly) { readOnly.set(false); return; } - if (!org?.billingLimits) { - readOnly.set(false); - return; + if (org?.billingPlan !== BillingPlan.FREE) { + const { budgetLimit } = org?.billingLimits ?? {}; + + if (budgetLimit && budgetLimit >= 100) { + readOnly.set(false); + headerAlert.add({ + id: 'budgetLimit', + component: BudgetLimitAlert, + show: true, + importance: 10 + }); + + readOnly.set(true); + return; + } } const { bandwidth, documents, executions, storage, users } = org?.billingLimits ?? {}; const resources = [ @@ -276,7 +324,8 @@ export async function checkForUsageLimit(org: Organization) { const members = org.total; const plan = get(plansInfo)?.get(org.billingPlan); - const membersOverflow = members > plan.members ? members - (plan.members || members) : 0; + const membersOverflow = + members - 1 > plan.addons.seats.limit ? members - (plan.addons.seats.limit || members) : 0; if (resources.some((r) => r.value >= 100) || membersOverflow > 0) { readOnly.set(true); @@ -456,30 +505,36 @@ export async function checkForNewDevUpgradePro(org: Organization) { if (now - accountCreated < 1000 * 60 * 60 * 24 * 7) return; const isDismissed = !!localStorage.getItem('newDevUpgradePro'); if (isDismissed) return; - if (now - accountCreated < 1000 * 60 * 60 * 24 * 37) { - headerAlert.add({ - id: 'newDevUpgradePro', - component: newDevUpgradePro, - show: true, - importance: 1 - }); + // check if coupon already applied + try { + await sdk.forConsole.billing.getCouponAccount(NEW_DEV_PRO_UPGRADE_COUPON); + } catch (e) { + return; } + headerAlert.add({ + id: 'newDevUpgradePro', + component: newDevUpgradePro, + show: true, + importance: 1 + }); } export const upgradeURL = derived( page, ($page) => `${base}/organization-${$page.data?.organization?.$id}/change-plan` ); +export const billingURL = derived( + page, + ($page) => `${base}/organization-${$page.data?.organization?.$id}/billing` +); export const hideBillingHeaderRoutes = ['/console/create-organization', '/console/account']; -export function calculateExcess(usage: OrganizationUsage, plan: Plan, members: number) { - const totBandwidth = usage?.bandwidth?.length > 0 ? last(usage.bandwidth).value : 0; +export function calculateExcess(addon: Aggregation, plan: Plan) { return { - bandwidth: calculateResourceSurplus(totBandwidth, plan.bandwidth), - storage: calculateResourceSurplus(usage?.storageTotal, plan.storage, 'GB'), - users: calculateResourceSurplus(usage?.usersTotal, plan.users), - executions: calculateResourceSurplus(usage?.executionsTotal, plan.executions, 'GB'), - members: calculateResourceSurplus(members, plan.members) + bandwidth: calculateResourceSurplus(addon.usageBandwidth, plan.bandwidth), + storage: calculateResourceSurplus(addon.usageStorage, plan.storage, 'GB'), + executions: calculateResourceSurplus(addon.usageExecutions, plan.executions, 'GB'), + members: addon.additionalMembers }; } @@ -488,3 +543,7 @@ export function calculateResourceSurplus(total: number, limit: number, limitUnit const realLimit = (limitUnit ? sizeToBytes(limit, limitUnit) : limit) || Infinity; return total > realLimit ? total - realLimit : 0; } + +export function isOrganization(org: Organization | OrganizationError): org is Organization { + return (org as Organization).$id !== undefined; +} diff --git a/src/lib/stores/database.ts b/src/lib/stores/database.ts index efec8fed1..7ce2f1697 100644 --- a/src/lib/stores/database.ts +++ b/src/lib/stores/database.ts @@ -1,10 +1,12 @@ -import { derived, writable } from 'svelte/store'; +import { derived, get, writable } from 'svelte/store'; import { page } from '$app/stores'; import { type Models, Query } from '@appwrite.io/console'; import { sdk } from '$lib/stores/sdk'; import { headerAlert } from '$lib/stores/headerAlert'; import BackupDatabase from '$lib/components/backupDatabaseAlert.svelte'; import { shouldShowNotification } from '$lib/helpers/notifications'; +import { isCloud } from '$lib/system'; +import { currentPlan } from '$lib/stores/organization'; export const database = derived(page, ($page) => $page.data?.database as Models.Database); @@ -17,16 +19,19 @@ export async function checkForDatabaseBackupPolicies(database: Models.Database) if (!shouldShowNotification(backupsBannerId)) return; let total = 0; + const backupsEnabled = get(currentPlan)?.backupsEnabled ?? true; - try { - const policies = await sdk.forProject.backups.listPolicies([ - Query.limit(1), - Query.equal('resourceId', database.$id) - ]); + if (isCloud && backupsEnabled) { + try { + const policies = await sdk.forProject.backups.listPolicies([ + Query.limit(1), + Query.equal('resourceId', database.$id) + ]); - total = policies.total; - } catch (e) { - // ignore, backups not allowed on free plan error. + total = policies.total; + } catch (e) { + // ignore, backups not allowed on free plan error. + } } showPolicyAlert.set(total <= 0); diff --git a/src/lib/stores/feedback.ts b/src/lib/stores/feedback.ts index f23cf953b..62b14f2f8 100644 --- a/src/lib/stores/feedback.ts +++ b/src/lib/stores/feedback.ts @@ -115,10 +115,26 @@ function createFeedbackStore() { email?: string, // eslint-disable-next-line billingPlan?: string, - value?: number + value?: number, + orgId?: string, + projectId?: string, + userId?: string ) => { if (!VARS.GROWTH_ENDPOINT) return; trackEvent(Submit.FeedbackSubmit); + + const customFields: Array<{ id: string; value: string | number }> = [ + { id: '47364', value: currentPage } + ]; + + if (value) { + customFields.push({ id: '40655', value }); + } + + if (billingPlan) { + customFields.push({ id: '56109', value: billingPlan }); + } + const response = await fetch(`${VARS.GROWTH_ENDPOINT}/feedback`, { method: 'POST', headers: { @@ -128,14 +144,13 @@ function createFeedbackStore() { subject, message, email, - // billingPlan, + customFields, firstname: name || 'Unknown', - customFields: [ - { id: '47364', value: currentPage }, - ...(value ? [{ id: '40655', value }] : []) - ], metaFields: { - source: get(feedback).source + source: get(feedback).source, + orgId, + projectId, + userId } }) }); diff --git a/src/lib/stores/oauth-providers.ts b/src/lib/stores/oauth-providers.ts index 5a437dd8b..858b31083 100644 --- a/src/lib/stores/oauth-providers.ts +++ b/src/lib/stores/oauth-providers.ts @@ -101,6 +101,12 @@ export const oAuthProviders: Record = { docs: 'https://developers.facebook.com/', component: Main }, + figma: { + name: 'Figma', + icon: 'figma', + docs: 'https://www.figma.com/developers/api#access-tokens', + component: Main + }, github: { name: 'GitHub', icon: 'github', diff --git a/src/lib/stores/organization.ts b/src/lib/stores/organization.ts index 128962b73..471c25d21 100644 --- a/src/lib/stores/organization.ts +++ b/src/lib/stores/organization.ts @@ -4,6 +4,15 @@ import type { Models } from '@appwrite.io/console'; import type { Tier } from './billing'; import type { Plan } from '$lib/sdk/billing'; +export type OrganizationError = { + status: number; + message: string; + teamId: string; + invoiceId: string; + clientSecret: string; + type: string; +}; + export type Organization = Models.Team> & { billingBudget: number; billingPlan: Tier; @@ -21,6 +30,10 @@ export type Organization = Models.Team> & { amount: number; billingTaxId?: string; billingPlanDowngrade?: Tier; + billingAggregationId: string; + billingInvoiceId: string; + status: string; + remarks: string; }; export type OrganizationList = { @@ -34,6 +47,7 @@ export type BillingLimits = { executions: number; storage: number; users: number; + budgetLimit: number; }; export const newOrgModal = writable(false); diff --git a/src/routes/(console)/account/deleteAccount.svelte b/src/routes/(console)/account/deleteAccount.svelte index e87837f82..0c31d74c4 100644 --- a/src/routes/(console)/account/deleteAccount.svelte +++ b/src/routes/(console)/account/deleteAccount.svelte @@ -14,10 +14,10 @@ - + - {$user.name} + {$user.name || 'User'} diff --git a/src/routes/(console)/account/payments/editAddressModal.svelte b/src/routes/(console)/account/payments/editAddressModal.svelte index cbd2406c2..6697c3ea5 100644 --- a/src/routes/(console)/account/payments/editAddressModal.svelte +++ b/src/routes/(console)/account/payments/editAddressModal.svelte @@ -22,10 +22,6 @@ onMount(async () => { const countryList = await sdk.forProject.locale.listCountries(); - const locale = await sdk.forProject.locale.get(); - if (locale.countryCode) { - selectedAddress.country = locale.countryCode; - } options = countryList.countries.map((country) => { return { value: country.code, @@ -57,6 +53,21 @@ trackError(e, Submit.BillingAddressUpdate); } } + + /** + * This component isn't a modal, so it mounts with its parent. + * On mount, `selectedAddress` can be `null`, so we set the country when the modal shows. + * + * And we only run this if the selected address has no country set, + * which really shouldn't happen, but here we are, playing it safe! + */ + $: if (show && !selectedAddress.country) { + sdk.forProject.locale.get().then((locale) => { + if (locale.countryCode) { + selectedAddress.country = locale.countryCode; + } + }); + } diff --git a/src/routes/(console)/account/updateName.svelte b/src/routes/(console)/account/updateName.svelte index 9f70fd598..07e85def1 100644 --- a/src/routes/(console)/account/updateName.svelte +++ b/src/routes/(console)/account/updateName.svelte @@ -12,7 +12,7 @@ let name: string = null; onMount(async () => { - name ??= $user.name; + name ??= $user.name ?? ''; }); async function updateName() { diff --git a/src/routes/(console)/apply-credit/+page.svelte b/src/routes/(console)/apply-credit/+page.svelte index 5fd6b396f..cdc813d09 100644 --- a/src/routes/(console)/apply-credit/+page.svelte +++ b/src/routes/(console)/apply-credit/+page.svelte @@ -3,25 +3,27 @@ import { base } from '$app/paths'; import { page } from '$app/state'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; - import { - CreditsApplied, - EstimatedTotalBox, - SelectPaymentMethod - } from '$lib/components/billing'; + import { CreditsApplied, EstimatedTotal, SelectPaymentMethod } from '$lib/components/billing'; import { BillingPlan, Dependencies } from '$lib/constants'; import { Button, Form, InputSelect, InputTags, InputText } from '$lib/elements/forms'; import { toLocaleDate } from '$lib/helpers/date'; import { Wizard } from '$lib/layout'; - import { type PaymentList } from '$lib/sdk/billing'; + import { type PaymentList, type Plan } from '$lib/sdk/billing'; import { addNotification } from '$lib/stores/notifications'; - import { organizationList, type Organization } from '$lib/stores/organization'; + import { + organizationList, + type Organization, + type OrganizationError + } from '$lib/stores/organization'; import { sdk } from '$lib/stores/sdk'; + import { confirmPayment } from '$lib/stores/stripe.js'; import { ID } from '@appwrite.io/console'; import { onMount } from 'svelte'; import { writable } from 'svelte/store'; - import { plansInfo } from '$lib/stores/billing'; + import { isOrganization, plansInfo, type Tier } from '$lib/stores/billing'; import { Fieldset, Icon, Layout, Tooltip } from '@appwrite.io/pink-svelte'; import { IconInfo } from '@appwrite.io/pink-icons-svelte'; + import EstimatedTotalBox from '$lib/components/billing/estimatedTotalBox.svelte'; export let data; @@ -66,13 +68,19 @@ let coupon: string; let couponData = data?.couponData; let campaign = data?.campaign; - let billingPlan = BillingPlan.PRO; + let billingPlan: Tier = BillingPlan.PRO; let tempOrgId = null; + let currentPlan: Plan; $: onlyNewOrgs = (campaign && campaign.onlyNewOrgs) || (couponData && couponData.onlyNewOrgs); $: selectedOrgId = tempOrgId; + function isUpgrade() { + const newPlan = page.data.plansInfo.get(billingPlan); + return currentPlan && newPlan && currentPlan.order < newPlan.order; + } + onMount(async () => { await loadPaymentMethods(); if (!$organizationList?.total || campaign?.onlyNewOrgs) { @@ -89,6 +97,19 @@ if ($organizationList.total > 0 && tempOrgId === null) { tempOrgId = $organizationList.teams[0].$id; } + if (page.url.searchParams.has('type')) { + const type = page.url.searchParams.get('type'); + if (type === 'payment_confirmed') { + const organizationId = page.url.searchParams.get('id'); + collaborators = page.url.searchParams.get('invites').split(','); + + await sdk.forConsole.billing.validateOrganization(organizationId, collaborators); + } + } + + if (!selectedOrgId && $organizationList?.total) { + selectedOrgId = $organizationList.teams[0].$id; + } }); async function loadPaymentMethods() { @@ -103,76 +124,82 @@ async function handleSubmit() { if (!couponForm.checkValidity()) return; + isSubmitting.set(true); try { - let org: Organization; + let org: Organization | OrganizationError; // Create new org if (selectedOrgId === newOrgId) { org = await sdk.forConsole.billing.createOrganization( newOrgId, name, billingPlan, - paymentMethodId + paymentMethodId, + null, + couponData.code ? couponData.code : null, + collaborators, + billingBudget, + taxId ); } + // Upgrade existing org - else if (selectedOrg?.billingPlan !== billingPlan) { + else if (selectedOrg?.billingPlan !== billingPlan && isUpgrade()) { org = await sdk.forConsole.billing.updatePlan( selectedOrg.$id, billingPlan, paymentMethodId, - null + null, + couponData.code ? couponData.code : null, + collaborators ); } - // Existing pro org + // Existing pro org, apply credits else { org = selectedOrg; - } - - // Add coupon - if (couponData?.code) { await sdk.forConsole.billing.addCredit(org.$id, couponData.code); } - // Add budget - if (billingBudget) { - await sdk.forConsole.billing.updateBudget(org.$id, billingBudget, [75]); + if (!isOrganization(org) && org.status === 402) { + let clientSecret = org.clientSecret; + let params = new URLSearchParams(); + params.append('type', 'payment_confirmed'); + params.append('org', org.teamId); + for (const [key, value] of page.url.searchParams.entries()) { + if (key !== 'type' && key !== 'id') { + params.append(key, value); + } + } + params.append('invites', collaborators.join(',')); + await confirmPayment( + '', + clientSecret, + paymentMethodId, + '/console/apply-credit?' + params.toString() + ); + org = await sdk.forConsole.billing.validateOrganization(org.teamId, collaborators); } - // Add collaborators - if (collaborators?.length) { - collaborators.forEach(async (collaborator) => { - await sdk.forConsole.teams.createMembership( - org.$id, - ['owner'], - collaborator, - undefined, - undefined, - `${page.url.origin}${base}/invite` - ); + if (isOrganization(org)) { + trackEvent(Submit.CreditRedeem, { + coupon: couponData.code, + campaign: couponData?.campaign }); + await invalidate(Dependencies.ORGANIZATION); + await goto(`${base}/organization-${org.$id}`); + addNotification({ + type: 'success', + message: 'Credits applied successfully' + }); + await invalidate(Dependencies.ACCOUNT); } - - // Add tax ID - if (taxId) { - await sdk.forConsole.billing.updateTaxId(org.$id, taxId); - } - trackEvent(Submit.CreditRedeem, { - coupon: couponData.code, - campaign: couponData?.campaign - }); - await invalidate(Dependencies.ORGANIZATION); - await goto(`${base}/organization-${org.$id}`); - addNotification({ - type: 'success', - message: 'Credits applied successfully' - }); - await invalidate(Dependencies.ACCOUNT); } catch (e) { trackError(e, Submit.CreditRedeem); addNotification({ type: 'error', message: e.message }); + } finally { + isSubmitting.set(false); } } @@ -197,10 +224,32 @@ (team) => team.$id === selectedOrgId ) as Organization; - $: billingPlan = - selectedOrg?.billingPlan === BillingPlan.SCALE - ? BillingPlan.SCALE - : (campaign?.plan ?? BillingPlan.PRO); + function getBillingPlan(): Tier | undefined { + const campaignPlan = + campaign?.plan && $plansInfo.get(campaign.plan) ? $plansInfo.get(campaign.plan) : null; + const orgPlan = + selectedOrg?.billingPlan && $plansInfo.get(selectedOrg.billingPlan) + ? $plansInfo.get(selectedOrg.billingPlan) + : null; + + if (!campaignPlan || !orgPlan) { + return; + } + + return campaignPlan.order > orgPlan.order ? campaign.plan : selectedOrg?.billingPlan; + } + + $: if (selectedOrg) { + billingPlan = getBillingPlan(); + } + + $: { + if (selectedOrgId) { + (async () => { + currentPlan = await sdk.forConsole.billing.getOrganizationPlan(selectedOrgId); + })(); + } + } @@ -286,7 +335,7 @@ - {#if selectedOrg?.$id && selectedOrg?.billingPlan !== BillingPlan.FREE && selectedOrg?.billingPlan !== BillingPlan.GITHUB_EDUCATION} + {#if selectedOrg?.$id && selectedOrg?.billingPlan === billingPlan}
{ +export const load = async ({ url }) => { // Has promo code if (url.searchParams.has('code')) { let couponData: Coupon; let campaign: Campaign; const code = url.searchParams.get('code'); try { - couponData = await sdk.forConsole.billing.getCoupon(code); + couponData = await sdk.forConsole.billing.getCouponAccount(code); if (couponData.campaign) { campaign = await sdk.forConsole.billing.getCampaign(couponData.campaign); } diff --git a/src/routes/(console)/create-organization/+page.svelte b/src/routes/(console)/create-organization/+page.svelte index 21c6f426e..eebf3d31b 100644 --- a/src/routes/(console)/create-organization/+page.svelte +++ b/src/routes/(console)/create-organization/+page.svelte @@ -4,24 +4,28 @@ import { page } from '$app/state'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { - EstimatedTotalBox, PlanComparisonBox, PlanSelection, - SelectPaymentMethod + SelectPaymentMethod, + SelectPlan } from '$lib/components/billing'; import ValidateCreditModal from '$lib/components/billing/validateCreditModal.svelte'; import { BillingPlan, Dependencies } from '$lib/constants'; import { Button, Form, InputTags, InputText } from '$lib/elements/forms'; import { Wizard } from '$lib/layout'; - import type { Coupon } from '$lib/sdk/billing'; - import { tierToPlan } from '$lib/stores/billing'; + + import type { Coupon, PaymentList } from '$lib/sdk/billing'; + import { isOrganization, tierToPlan } from '$lib/stores/billing'; import { addNotification } from '$lib/stores/notifications'; - import type { Organization } from '$lib/stores/organization'; + import { type OrganizationError, type Organization } from '$lib/stores/organization'; import { sdk } from '$lib/stores/sdk'; + import { confirmPayment } from '$lib/stores/stripe'; import { ID } from '@appwrite.io/console'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; import { Divider, Fieldset, Icon, Layout, Link, Typography } from '@appwrite.io/pink-svelte'; import { writable } from 'svelte/store'; + import EstimatedTotalBox from '$lib/components/billing/estimatedTotalBox.svelte'; + import { onMount } from 'svelte'; export let data; @@ -29,13 +33,22 @@ let selectedCoupon: Partial | null = data.coupon; let previousPage: string = base; let showExitModal = false; + let formComponent: Form; let isSubmitting = writable(false); + + let methods: PaymentList; let name: string; - let paymentMethodId: string = - data.paymentMethods.paymentMethods.find((method) => !!method?.last4)?.$id ?? null; + let billingPlan: BillingPlan = BillingPlan.FREE; + let paymentMethodId: string; let collaborators: string[] = []; + let couponData: Partial = { + code: null, + status: null, + credits: null + }; let taxId: string; + let billingBudget: number; let showCreditModal = false; @@ -43,9 +56,73 @@ previousPage = from?.url?.pathname || previousPage; }); + onMount(async () => { + if (page.url.searchParams.has('coupon')) { + const coupon = page.url.searchParams.get('coupon'); + try { + const response = await sdk.forConsole.billing.getCouponAccount(coupon); + couponData = response; + } catch (e) { + couponData = { + code: null, + status: null, + credits: null + }; + } + } + if (page.url.searchParams.has('name')) { + name = page.url.searchParams.get('name'); + } + if (page.url.searchParams.has('plan')) { + const plan = page.url.searchParams.get('plan'); + if (plan && Object.values(BillingPlan).includes(plan as BillingPlan)) { + billingPlan = plan as BillingPlan; + } + } + if ( + data?.hasFreeOrganizations || + (page.url.searchParams.has('type') && page.url.searchParams.get('type') === 'createPro') + ) { + billingPlan = BillingPlan.PRO; + } + if (page.url.searchParams.has('type')) { + const type = page.url.searchParams.get('type'); + if (type === 'payment_confirmed') { + const organizationId = page.url.searchParams.get('id'); + const invites = page.url.searchParams.get('invites').split(','); + await validate(organizationId, invites); + } + } + }); + + async function loadPaymentMethods() { + methods = await sdk.forConsole.billing.listPaymentMethods(); + paymentMethodId = methods.paymentMethods.find((method) => !!method?.last4)?.$id ?? null; + } + + async function validate(organizationId: string, invites: string[]) { + try { + const org = await sdk.forConsole.billing.validateOrganization(organizationId, invites); + if (isOrganization(org)) { + await preloadData(`${base}/console/organization-${org.$id}`); + await goto(`${base}/console/organization-${org.$id}`); + addNotification({ + type: 'success', + message: `${org.name ?? 'Organization'} has been created` + }); + } + } catch (e) { + addNotification({ + type: 'error', + message: e.message + }); + trackError(e, Submit.OrganizationCreate); + } + } + async function create() { try { - let org: Organization; + let org: Organization | OrganizationError; if (selectedPlan === BillingPlan.FREE) { org = await sdk.forConsole.billing.createOrganization( @@ -61,53 +138,49 @@ name, selectedPlan, paymentMethodId, - null + null, + couponData.code ? couponData.code : null, + collaborators, + billingBudget, + taxId ); - //Add budget - if (billingBudget) { - await sdk.forConsole.billing.updateBudget(org.$id, billingBudget, [75]); - } - - //Add coupon - if (selectedCoupon?.code) { - await sdk.forConsole.billing.addCredit(org.$id, selectedCoupon.code); - trackEvent(Submit.CreditRedeem); - } - - //Add collaborators - if (collaborators?.length) { - collaborators.forEach(async (collaborator) => { - await sdk.forConsole.teams.createMembership( - org.$id, - ['developer'], - collaborator, - undefined, - undefined, - `${page.url.origin}${base}/invite` - ); - }); - } - - // Add tax ID - if (taxId) { - await sdk.forConsole.billing.updateTaxId(org.$id, taxId); + if (!isOrganization(org) && org.status === 402) { + let clientSecret = org.clientSecret; + let params = new URLSearchParams(); + params.append('type', 'payment_confirmed'); + params.append('id', org.teamId); + for (const [key, value] of page.url.searchParams.entries()) { + if (key !== 'type' && key !== 'id') { + params.append(key, value); + } + } + params.append('invites', collaborators.join(',')); + await confirmPayment( + '', + clientSecret, + paymentMethodId, + '/console/create-organization?' + params.toString() + ); + await validate(org.teamId, collaborators); } } trackEvent(Submit.OrganizationCreate, { - plan: tierToPlan(selectedPlan)?.name, - budget_cap_enabled: !!billingBudget, + plan: tierToPlan(billingPlan)?.name, + budget_cap_enabled: billingBudget !== null, members_invited: collaborators?.length }); - await invalidate(Dependencies.ACCOUNT); - await preloadData(`${base}/organization-${org.$id}`); - await goto(`${base}/organization-${org.$id}`); - addNotification({ - type: 'success', - message: `${name ?? 'Organization'} has been created` - }); + if (isOrganization(org)) { + await invalidate(Dependencies.ACCOUNT); + await preloadData(`${base}/organization-${org.$id}`); + await goto(`${base}/organization-${org.$id}`); + addNotification({ + type: 'success', + message: `${org.name ?? 'Organization'} has been created` + }); + } } catch (e) { addNotification({ type: 'error', diff --git a/src/routes/(console)/organization-[organization]/+layout.ts b/src/routes/(console)/organization-[organization]/+layout.ts index 650990e86..cd1968ea8 100644 --- a/src/routes/(console)/organization-[organization]/+layout.ts +++ b/src/routes/(console)/organization-[organization]/+layout.ts @@ -27,7 +27,7 @@ export const load: LayoutLoad = async ({ params, depends }) => { const res = await sdk.forConsole.billing.getRoles(params.organization); roles = res.roles; scopes = res.scopes; - currentPlan = await sdk.forConsole.billing.getPlan(params.organization); + currentPlan = await sdk.forConsole.billing.getOrganizationPlan(params.organization); if (scopes.includes('billing.read')) { await failedInvoice.load(params.organization); if (get(failedInvoice)) { diff --git a/src/routes/(console)/organization-[organization]/+page.svelte b/src/routes/(console)/organization-[organization]/+page.svelte index 1fa4c2699..d35713319 100644 --- a/src/routes/(console)/organization-[organization]/+page.svelte +++ b/src/routes/(console)/organization-[organization]/+page.svelte @@ -24,7 +24,6 @@ import { ID, Region } from '@appwrite.io/console'; import { openImportWizard } from '../project-[project]/settings/migrations/(import)'; import { readOnly } from '$lib/stores/billing'; - import type { RegionList } from '$lib/sdk/billing'; import { onMount, type ComponentType } from 'svelte'; import { canWriteProjects } from '$lib/stores/roles'; import { checkPricingRefAndRedirect } from '$lib/helpers/pricingRedirect'; @@ -40,12 +39,13 @@ } from '@appwrite.io/pink-icons-svelte'; import { getPlatformInfo } from '$lib/helpers/platform'; import CreateProjectCloud from './createProjectCloud.svelte'; + import { regions as regionsStore } from '$routes/(console)/organization-[organization]/store'; export let data; - let addOrganization = false; let showCreate = false; let showCreateProjectCloud = false; + let addOrganization = false; async function allServiceDisabled(project: Models.Project) { let disabled = true; @@ -130,21 +130,18 @@ } }; - let regions: RegionList; onMount(async () => { if (isCloud) { - regions = await sdk.forConsole.billing.listRegions(); + const regions = await sdk.forConsole.billing.listRegions(); + regionsStore.set(regions); checkPricingRefAndRedirect(page.url.searchParams); } - - const searchParams = page.url.searchParams; - if (searchParams.has('create-project')) { - handleCreateProject(); - } }); - function findRegion(project: Models.Project & { region?: string }) { - return regions.regions.find((region) => region.$id === project?.region); + function findRegion(project: Models.Project) { + return $regionsStore?.regions?.find( + (region) => region.$id === (project as Models.Project & { region: string }).region + ); } @@ -211,7 +208,7 @@ {/if} - {#if isCloud && regions} + {#if isCloud && $regionsStore?.regions} {@const region = findRegion(project)} {region?.name} @@ -243,5 +240,5 @@ {#if showCreateProjectCloud} - + {/if} diff --git a/src/routes/(console)/organization-[organization]/billing/+page.svelte b/src/routes/(console)/organization-[organization]/billing/+page.svelte index a6fa6b745..1915fb8d7 100644 --- a/src/routes/(console)/organization-[organization]/billing/+page.svelte +++ b/src/routes/(console)/organization-[organization]/billing/+page.svelte @@ -1,7 +1,6 @@ @@ -91,6 +94,11 @@ Upgrade to a Pro plan to manage when you receive billing alerts for your organization. + {:else if !$currentPlan.budgetCapEnabled} + + Budget caps are not supported on your current plan. For more information, please + reach out to your customer success manager. + {:else} {#if alerts.length >= 4} diff --git a/src/routes/(console)/organization-[organization]/billing/budgetCap.svelte b/src/routes/(console)/organization-[organization]/billing/budgetCap.svelte index 2982bc43d..32a0be64a 100644 --- a/src/routes/(console)/organization-[organization]/billing/budgetCap.svelte +++ b/src/routes/(console)/organization-[organization]/billing/budgetCap.svelte @@ -10,13 +10,14 @@ import { sdk } from '$lib/stores/sdk'; import { Alert, Link } from '@appwrite.io/pink-svelte'; import { onMount } from 'svelte'; + import BudgetAlert from './budgetAlert.svelte'; let capActive = false; let budget: number; onMount(() => { budget = $organization?.billingBudget; - capActive = !!$organization?.billingBudget; + capActive = $organization?.billingBudget !== null; }); async function updateBudget() { @@ -26,7 +27,7 @@ budget, $organization.budgetAlerts ); - invalidate(Dependencies.ORGANIZATION); + await invalidate(Dependencies.ORGANIZATION); addNotification({ type: 'success', isHtml: true, @@ -45,7 +46,7 @@ } $: if (!capActive) { - budget = 0; + budget = null; } @@ -64,6 +65,11 @@ target="_blank" rel="noopener noreferrer">view our pricing guide. + {:else if !$currentPlan.budgetCapEnabled} + + Budget caps are not supported on your current plan. For more information, please + reach out to your customer success manager. + {:else} @@ -105,3 +111,5 @@ + + 0} /> diff --git a/src/routes/(console)/organization-[organization]/billing/cancelDowngradeModal.svelte b/src/routes/(console)/organization-[organization]/billing/cancelDowngradeModal.svelte new file mode 100644 index 000000000..44c9c9710 --- /dev/null +++ b/src/routes/(console)/organization-[organization]/billing/cancelDowngradeModal.svelte @@ -0,0 +1,42 @@ + + + +

+ Your organization is set to change to + {tierToPlan($organization?.billingPlanDowngrade).name} + plan on {toLocaleDate($organization.billingNextInvoiceDate)}. Are you sure + you want to cancel this change and keep your current plan? +

+ + + + +
diff --git a/src/routes/(console)/organization-[organization]/billing/paymentHistory.svelte b/src/routes/(console)/organization-[organization]/billing/paymentHistory.svelte index 3371ff4ed..ddf7206a4 100644 --- a/src/routes/(console)/organization-[organization]/billing/paymentHistory.svelte +++ b/src/routes/(console)/organization-[organization]/billing/paymentHistory.svelte @@ -5,7 +5,7 @@ import { toLocaleDate } from '$lib/helpers/date'; import { formatCurrency } from '$lib/helpers/numbers'; import type { Invoice, InvoiceList } from '$lib/sdk/billing'; - import { getApiEndpoint, sdk } from '$lib/stores/sdk'; + import { sdk } from '$lib/stores/sdk'; import { Query } from '@appwrite.io/console'; import { onMount } from 'svelte'; import { trackEvent } from '$lib/actions/analytics'; @@ -28,8 +28,7 @@ IconExternalLink, IconRefresh } from '@appwrite.io/pink-icons-svelte'; - - // let isLoadingInvoices = true; + import { base } from '$app/paths'; let offset = 0; let invoiceList: InvoiceList = { @@ -38,7 +37,6 @@ }; const limit = 5; - const endpoint = getApiEndpoint(); onMount(request); @@ -47,11 +45,13 @@ invoiceList = await sdk.forConsole.billing.listInvoices(page.params.organization, [ Query.limit(limit), Query.offset(offset), - Query.notEqual('from', $organization.billingCurrentInvoiceDate), - Query.notEqual('status', 'pending'), Query.orderDesc('$createdAt') ]); - // isLoadingInvoices = false; + } + + $: if (page.url.searchParams.get('type') === 'validate-invoice') { + window.history.replaceState({}, '', page.url.pathname); + request(); } function retryPayment(invoice: Invoice) { @@ -135,12 +135,12 @@ + href={`${base}/organizations/${page.params.organization}/invoices/${invoice.$id}/view`}> View invoice + href={`${base}/organizations/${page.params.organization}/invoices/${invoice.$id}/download`}> Download PDF {#if status === 'overdue' || status === 'failed'} diff --git a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte index b03133998..c007b40f5 100644 --- a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte +++ b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte @@ -3,14 +3,13 @@ import { CardGrid } from '$lib/components'; import { Button } from '$lib/elements/forms'; import { toLocaleDate } from '$lib/helpers/date'; - import { plansInfo, tierToPlan, upgradeURL } from '$lib/stores/billing'; + import { plansInfo, upgradeURL } from '$lib/stores/billing'; import { organization } from '$lib/stores/organization'; - import type { CreditList, Invoice, Plan } from '$lib/sdk/billing'; + import type { Aggregation, CreditList, Invoice, Plan } from '$lib/sdk/billing'; import { abbreviateNumber, formatCurrency, formatNumberWithCommas } from '$lib/helpers/numbers'; import { humanFileSize } from '$lib/helpers/sizeConvertion'; import { BillingPlan } from '$lib/constants'; import { Click, trackEvent } from '$lib/actions/analytics'; - import { type Models } from '@appwrite.io/console'; import { Accordion, Card, @@ -21,14 +20,15 @@ Typography } from '@appwrite.io/pink-svelte'; import { IconInfo, IconTag } from '@appwrite.io/pink-icons-svelte'; + import CancelDowngradeModel from './cancelDowngradeModal.svelte'; - export let invoices: Array; - export let members: Models.MembershipList; export let currentPlan: Plan; export let creditList: CreditList; + export let currentInvoice: Invoice | undefined = undefined; + export let currentAggregation: Aggregation | undefined = undefined; + + let showCancel: boolean = false; - const currentInvoice: Invoice | undefined = invoices.length > 0 ? invoices[0] : undefined; - const extraMembers = members.total > 1 ? members.total - 1 : 0; const availableCredit = creditList.available; const today = new Date(); const isTrial = @@ -60,15 +60,13 @@ exclude accumulated credits and applicable taxes.

- Billing period: {toLocaleDate($organization?.billingCurrentInvoiceDate)} - {toLocaleDate( - $organization?.billingNextInvoiceDate - )} + Due at: {toLocaleDate($organization?.billingNextInvoiceDate)}

- {tierToPlan($organization?.billingPlan)?.name} plan + {currentPlan.name} plan {isTrial || $organization?.billingPlan === BillingPlan.GITHUB_EDUCATION @@ -79,36 +77,40 @@ - {#if $organization?.billingPlan !== BillingPlan.FREE && $organization?.billingPlan !== BillingPlan.GITHUB_EDUCATION && extraUsage > 0} + {#if currentPlan.budgeting && extraUsage > 0} + badge={(currentAggregation.additionalMembers > 0 + ? currentInvoice.usage.length + 1 + : currentInvoice.usage.length + ).toString()}> {formatCurrency(extraUsage >= 0 ? extraUsage : 0)} - {#if extraMembers} + {#if currentAggregation.additionalMembers} Additional members - {formatCurrency( - extraMembers * - (currentPlan?.addons?.member?.price ?? 0) - )} + + {formatCurrency( + currentAggregation.additionalMemberAmount + )} + - {extraMembers} + {currentAggregation.additionalMembers} {/if} {#if currentInvoice?.usage} {#each currentInvoice.usage as excess, i} - {#if i > 0 || extraMembers} + {#if i > 0 || currentAggregation.additionalMembers} {/if} {#if ['storage', 'bandwidth'].includes(excess.name)} @@ -180,7 +182,7 @@ {/if} - {#if $organization?.billingPlan !== BillingPlan.FREE && availableCredit > 0} + {#if currentPlan.supportsCredits && availableCredit > 0} @@ -188,7 +190,7 @@ >Credits to be applied - {formatCurrency( + -{formatCurrency( Math.min(availableCredit, currentInvoice?.amount ?? 0) )} @@ -245,17 +247,21 @@ {:else}
- + {#if $organization?.billingPlanDowngrade !== null} + + {:else} + + {/if} @@ -265,6 +271,8 @@ {/if} + +