diff --git a/.env.example b/.env.example index 33f6f43e3..5f948ba78 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,7 @@ PUBLIC_APPWRITE_COL_MESSAGES_ID= PUBLIC_APPWRITE_COL_THREADS_ID= PUBLIC_APPWRITE_DB_MAIN_ID= PUBLIC_APPWRITE_FN_TLDR_ID= -PUBLIC_APPWRITE_ENDPOINT= +PUBLIC_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1 PUBLIC_APPWRITE_PROJECT_ID= PUBLIC_APPWRITE_DASHBOARD=https://cloud.appwrite.io PUBLIC_APPWRITE_PROJECT_INIT_ID= @@ -11,4 +11,4 @@ PUBLIC_POSTHOG_API_KEY= APPWRITE_DB_INIT_ID= APPWRITE_COL_INIT_ID= APPWRITE_API_KEY_INIT= -SENTRY_AUTH_TOKEN= \ No newline at end of file +SENTRY_AUTH_TOKEN= diff --git a/README.md b/README.md index b037b5769..302e26237 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The Appwrite Website has been built with the following frameworks: ## Development -_If this is your first time setting up the repository, please run `pnpm install` inside the repo's directory._ +_If this is your first time setting up the repository, please run `pnpm install` inside the repo's directory and create a `.env` file based on `.env.example`._ To get the repo up and running in your local environment, use the following command: diff --git a/eslint.config.js b/eslint.config.js index 09537bd61..6a5f0c364 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,33 +1,51 @@ -import prettier from 'eslint-config-prettier'; +import { includeIgnoreFile } from '@eslint/compat'; import js from '@eslint/js'; +import prettier from 'eslint-config-prettier'; import svelte from 'eslint-plugin-svelte'; import globals from 'globals'; +import { fileURLToPath } from 'node:url'; import ts from 'typescript-eslint'; +import svelteConfig from './svelte.config.js'; + +const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); export default ts.config( + includeIgnoreFile(gitignorePath), js.configs.recommended, ...ts.configs.recommended, - ...svelte.configs['flat/recommended'], + ...svelte.configs.recommended, prettier, - ...svelte.configs['flat/prettier'], + ...svelte.configs.prettier, { languageOptions: { - globals: { - ...globals.browser, - ...globals.node - } + globals: { ...globals.browser, ...globals.node } + }, + rules: { + // TODO: remove them one by one + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-duplicate-enum-values': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + 'svelte/infinite-reactive-loop': 'off', + 'svelte/require-each-key': 'off', + 'svelte/no-immutable-reactive-statements': 'off', + 'svelte/no-at-html-tags': 'off', + 'svelte/no-useless-mustaches': 'off', + 'svelte/no-reactive-reassign': 'off', + 'svelte/no-reactive-literals': 'off' } }, { - files: ['**/*.svelte'], - + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + ignores: ['eslint.config.js', 'svelte.config.js'], languageOptions: { parserOptions: { - parser: ts.parser + // Only uncomment this if you want it to take 3 minutes https://github.com/sveltejs/eslint-plugin-svelte/issues/1084 + // projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig } } - }, - { - ignores: ['build/', '.svelte-kit/', 'dist/'] } ); diff --git a/package.json b/package.json index 629c61411..a4de0691b 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "download-contributors": "node ./scripts/download-contributor-data.js", "format": "prettier --write .", "format:check": "prettier --check .", + "generate:icons": "node ./src/icons/optimize.js", "icons:build": "node ./src/icons/build.js", "icons:generate": "node ./src/icons/optimize.js && node ./src/icons/build.js", "icons:optimize": "node ./src/icons/optimize.js", @@ -23,10 +24,9 @@ "optimize": "node ./scripts/optimize-assets.js", "optimize:all": "node ./scripts/optimize-all.js" }, - "packageManager": "pnpm@10.6.2", + "packageManager": "pnpm@10.8.1", "dependencies": { "@number-flow/svelte": "^0.3.3", - "@sentry/sveltekit": "^8.51.0", "h3": "^1.14.0", "posthog-js": "^1.210.2", "sharp": "^0.33.5" @@ -36,22 +36,24 @@ "@appwrite.io/pink": "~0.26.0", "@appwrite.io/pink-icons": "~0.26.0", "@appwrite.io/repo": "github:appwrite/appwrite#1.6.x", + "@eslint/compat": "^1.2.7", "@eslint/js": "^9.21.0", "@fingerprintjs/fingerprintjs": "^4.5.1", "@internationalized/date": "3.5.0", "@melt-ui/pp": "^0.3.2", - "@melt-ui/svelte": "^0.86.2", + "@melt-ui/svelte": "^0.86.5", "@playwright/test": "^1.50.0", - "@sveltejs/adapter-node": "^4.0.1", - "@sveltejs/enhanced-img": "^0.1.9", - "@sveltejs/kit": "^2.16.1", - "@sveltejs/vite-plugin-svelte": "^3.1.2", - "@tailwindcss/postcss": "4.0.0-alpha.17", + "@sveltejs/adapter-node": "^5.2.12", + "@sveltejs/enhanced-img": "^0.4.4", + "@sveltejs/kit": "^2.20.2", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tailwindcss/postcss": "^4.1.2", "@types/compression": "^1.7.5", "@types/glob": "^8.1.0", "@types/markdown-it": "^13.0.9", "@types/morgan": "^1.9.9", "analytics": "^0.8.16", + "bits-ui": "^1.3.19", "clsx": "^2.1.1", "cva": "npm:class-variance-authority@^0.7.1", "date-fns": "^3.6.0", @@ -68,6 +70,7 @@ "highlight.js": "^11.11.1", "markdown-it": "^14.1.0", "meilisearch": "^0.37.0", + "melt": "^0.29.2", "motion": "^10.18.0", "node-html-parser": "^6.1.13", "openapi-types": "^12.1.3", @@ -80,27 +83,27 @@ "prettier-plugin-svelte": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.11", "remeda": "^2.20.0", + "reodotdev": "^1.0.0", "sass": "^1.83.4", - "svelte": "^4.2.19", - "svelte-check": "^3.8.6", - "svelte-markdoc-preprocess": "^2.1.0", + "svelte": "^5.25.6", + "svelte-check": "^4.0.0", + "svelte-markdoc-preprocess": "3.0.0", "svelte-markdown": "^0.4.1", "svgtofont": "^4.2.3", - "tailwind-merge": "^2.6.0", - "tailwindcss": "4.0.0-alpha.17", + "tailwind-merge": "^3.0.2", + "tailwindcss": "^4.1.2", "tslib": "^2.8.1", - "typescript": "^5.7.3", + "typescript": "^5.8.2", "typescript-eslint": "^8.21.0", - "vite": "^5.4.14", + "vite": "^6.2.4", "vite-plugin-dynamic-import": "^1.6.0", "vite-plugin-image-optimizer": "^1.1.8", "vite-plugin-manifest-sri": "^0.2.0", - "vitest": "^1.6.0" + "vitest": "^3.1.1" }, "pnpm": { "onlyBuiltDependencies": [ "@parcel/watcher", - "@sentry/cli", "core-js", "esbuild", "sharp", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a55b2b833..168d0aa38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,7 @@ importers: dependencies: '@number-flow/svelte': specifier: ^0.3.3 - version: 0.3.5(svelte@4.2.19) - '@sentry/sveltekit': - specifier: ^8.51.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.19.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(encoding@0.1.13)(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + version: 0.3.5(svelte@5.25.6) h3: specifier: ^1.14.0 version: 1.15.1 @@ -35,7 +32,10 @@ importers: version: 0.26.0 '@appwrite.io/repo': specifier: github:appwrite/appwrite#1.6.x - version: https://codeload.github.com/appwrite/appwrite/tar.gz/2c803b262cbf62b499df28ff11d2ca40e16ab909 + version: https://codeload.github.com/appwrite/appwrite/tar.gz/8b23d4bab1057eea089fa301b756495b7d207bfd + '@eslint/compat': + specifier: ^1.2.7 + version: 1.2.7(eslint@9.22.0(jiti@2.4.2)) '@eslint/js': specifier: ^9.21.0 version: 9.22.0 @@ -47,28 +47,28 @@ importers: version: 3.5.0 '@melt-ui/pp': specifier: ^0.3.2 - version: 0.3.2(@melt-ui/svelte@0.86.4(svelte@4.2.19))(svelte@4.2.19) + version: 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.25.6))(svelte@5.25.6) '@melt-ui/svelte': - specifier: ^0.86.2 - version: 0.86.4(svelte@4.2.19) + specifier: ^0.86.5 + version: 0.86.6(svelte@5.25.6) '@playwright/test': specifier: ^1.50.0 version: 1.51.0 '@sveltejs/adapter-node': - specifier: ^4.0.1 - version: 4.0.1(@sveltejs/kit@2.19.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1))) + specifier: ^5.2.12 + version: 5.2.12(@sveltejs/kit@2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)))(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0))) '@sveltejs/enhanced-img': - specifier: ^0.1.9 - version: 0.1.9(rollup@4.35.0)(svelte@4.2.19) + specifier: ^0.4.4 + version: 0.4.4(rollup@4.35.0)(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) '@sveltejs/kit': - specifier: ^2.16.1 - version: 2.19.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + specifier: ^2.20.2 + version: 2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)))(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) '@sveltejs/vite-plugin-svelte': - specifier: ^3.1.2 - version: 3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + specifier: ^5.0.3 + version: 5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) '@tailwindcss/postcss': - specifier: 4.0.0-alpha.17 - version: 4.0.0-alpha.17(postcss@8.5.3) + specifier: ^4.1.2 + version: 4.1.2 '@types/compression': specifier: ^1.7.5 version: 1.7.5 @@ -84,6 +84,9 @@ importers: analytics: specifier: ^0.8.16 version: 0.8.16(@types/dlv@1.1.5) + bits-ui: + specifier: ^1.3.19 + version: 1.3.19(svelte@5.25.6) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -104,19 +107,19 @@ importers: version: 8.5.2(embla-carousel@8.5.2) embla-carousel-svelte: specifier: ^8.5.2 - version: 8.5.2(svelte@4.2.19) + version: 8.5.2(svelte@5.25.6) embla-carousel-wheel-gestures: specifier: ^8.0.1 version: 8.0.1(embla-carousel@8.5.2) eslint: specifier: ^9.19.0 - version: 9.22.0(jiti@1.21.7) + version: 9.22.0(jiti@2.4.2) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.22.0(jiti@1.21.7)) + version: 9.1.0(eslint@9.22.0(jiti@2.4.2)) eslint-plugin-svelte: specifier: ^2.46.1 - version: 2.46.1(eslint@9.22.0(jiti@1.21.7))(svelte@4.2.19) + version: 2.46.1(eslint@9.22.0(jiti@2.4.2))(svelte@5.25.6) fuse.js: specifier: ^7.0.0 version: 7.1.0 @@ -132,6 +135,9 @@ importers: meilisearch: specifier: ^0.37.0 version: 0.37.0(encoding@0.1.13) + melt: + specifier: ^0.29.2 + version: 0.29.2(@floating-ui/dom@1.6.13)(svelte@5.25.6) motion: specifier: ^10.18.0 version: 10.18.0 @@ -158,64 +164,71 @@ importers: version: 3.5.3 prettier-plugin-svelte: specifier: ^3.3.3 - version: 3.3.3(prettier@3.5.3)(svelte@4.2.19) + version: 3.3.3(prettier@3.5.3)(svelte@5.25.6) prettier-plugin-tailwindcss: specifier: ^0.6.11 - version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@4.2.19))(prettier@3.5.3) + version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.6))(prettier@3.5.3) remeda: specifier: ^2.20.0 version: 2.21.2 + reodotdev: + specifier: ^1.0.0 + version: 1.0.0 sass: specifier: ^1.83.4 version: 1.85.1 svelte: - specifier: ^4.2.19 - version: 4.2.19 + specifier: ^5.25.6 + version: 5.25.6 svelte-check: - specifier: ^3.8.6 - version: 3.8.6(@babel/core@7.26.10)(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(sass@1.85.1)(svelte@4.2.19) + specifier: ^4.0.0 + version: 4.1.5(picomatch@4.0.2)(svelte@5.25.6)(typescript@5.8.2) svelte-markdoc-preprocess: - specifier: ^2.1.0 - version: 2.1.0 + specifier: 3.0.0 + version: 3.0.0 svelte-markdown: specifier: ^0.4.1 - version: 0.4.1(svelte@4.2.19) + version: 0.4.1(svelte@5.25.6) svgtofont: specifier: ^4.2.3 version: 4.2.3 tailwind-merge: - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^3.0.2 + version: 3.0.2 tailwindcss: - specifier: 4.0.0-alpha.17 - version: 4.0.0-alpha.17 + specifier: ^4.1.2 + version: 4.1.2 tslib: specifier: ^2.8.1 version: 2.8.1 typescript: - specifier: ^5.7.3 + specifier: ^5.8.2 version: 5.8.2 typescript-eslint: specifier: ^8.21.0 - version: 8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2) + version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) vite: - specifier: ^5.4.14 - version: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) + specifier: ^6.2.4 + version: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) vite-plugin-dynamic-import: specifier: ^1.6.0 version: 1.6.0 vite-plugin-image-optimizer: specifier: ^1.1.8 - version: 1.1.8(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + version: 1.1.8(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) vite-plugin-manifest-sri: specifier: ^0.2.0 version: 0.2.0 vitest: - specifier: ^1.6.0 - version: 1.6.1(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -250,215 +263,164 @@ packages: '@appwrite.io/pink@0.26.0': resolution: {integrity: sha512-iPeGE56pauzxuIXt15ZswjKCErwp3QdF3XOlJZfyYY7J2nirra85JNTL+3lWuFIf8yYWL7NbvCjhf8ig79TgwA==} - '@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/2c803b262cbf62b499df28ff11d2ca40e16ab909': - resolution: {tarball: https://codeload.github.com/appwrite/appwrite/tar.gz/2c803b262cbf62b499df28ff11d2ca40e16ab909} + '@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/8b23d4bab1057eea089fa301b756495b7d207bfd': + resolution: {tarball: https://codeload.github.com/appwrite/appwrite/tar.gz/8b23d4bab1057eea089fa301b756495b7d207bfd} version: 0.0.0 - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.26.10': - resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.26.10': - resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.26.10': - resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/runtime@7.26.10': resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} - '@babel/template@7.26.9': - resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.26.10': - resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.10': - resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} - engines: {node: '>=6.9.0'} - '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -472,6 +434,15 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@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 + peerDependenciesMeta: + eslint: + optional: true + '@eslint/config-array@0.19.2': resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -643,6 +614,9 @@ packages: '@internationalized/date@3.5.0': resolution: {integrity: sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==} + '@internationalized/date@3.8.0': + resolution: {integrity: sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -834,8 +808,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@markdoc/markdoc@0.4.0': - resolution: {integrity: sha512-fSh4P3Y4E7oaKYc2oNzSIJVPDto7SMzAuQN1Iyx53UxzleA6QzRdNWRxmiPqtVDaDi5dELd2yICoG91csrGrAw==} + '@markdoc/markdoc@0.5.1': + resolution: {integrity: sha512-W2apYOglq0hOnvWbhE70yl6V9++FG+YPFKNHmgiSjv0HTmdJaMLt+NA1LMqoH5LasSiTI7R0yVc5ofjaFh39Pg==} engines: {node: '>=14.7.0'} peerDependencies: '@types/react': '*' @@ -852,8 +826,8 @@ packages: '@melt-ui/svelte': '>= 0.29.0' svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1 - '@melt-ui/svelte@0.86.4': - resolution: {integrity: sha512-qFagx5z8ccs5SurHaq0f5v/91d5E/5MY+3B3MbstTKGR9wLcpbw3tq5B20LIO9lSxTgUhbOgoU0QsUvqIcEVEw==} + '@melt-ui/svelte@0.86.6': + resolution: {integrity: sha512-Jer+M7DgIwT5IHfTayb4Iw/fkkxWNmC/mqn/nMh9JrbPbkxmyabfLQnhJ+JDn5HK77f84j34lubO3iqFtYAfMg==} peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118 @@ -1001,230 +975,6 @@ packages: peerDependencies: svelte: ^4 || ^5 - '@opentelemetry/api-logs@0.53.0': - resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} - engines: {node: '>=14'} - - '@opentelemetry/api-logs@0.57.1': - resolution: {integrity: sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==} - engines: {node: '>=14'} - - '@opentelemetry/api-logs@0.57.2': - resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} - engines: {node: '>=14'} - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/context-async-hooks@1.30.1': - resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@1.30.1': - resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/instrumentation-amqplib@0.46.1': - resolution: {integrity: sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-connect@0.43.0': - resolution: {integrity: sha512-Q57JGpH6T4dkYHo9tKXONgLtxzsh1ZEW5M9A/OwKrZFyEpLqWgjhcZ3hIuVvDlhb426iDF1f9FPToV/mi5rpeA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-dataloader@0.16.0': - resolution: {integrity: sha512-88+qCHZC02up8PwKHk0UQKLLqGGURzS3hFQBZC7PnGwReuoKjHXS1o29H58S+QkXJpkTr2GACbx8j6mUoGjNPA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-express@0.47.0': - resolution: {integrity: sha512-XFWVx6k0XlU8lu6cBlCa29ONtVt6ADEjmxtyAyeF2+rifk8uBJbk1La0yIVfI0DoKURGbaEDTNelaXG9l/lNNQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fastify@0.44.1': - resolution: {integrity: sha512-RoVeMGKcNttNfXMSl6W4fsYoCAYP1vi6ZAWIGhBY+o7R9Y0afA7f9JJL0j8LHbyb0P0QhSYk+6O56OwI2k4iRQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fs@0.19.0': - resolution: {integrity: sha512-JGwmHhBkRT2G/BYNV1aGI+bBjJu4fJUD/5/Jat0EWZa2ftrLV3YE8z84Fiij/wK32oMZ88eS8DI4ecLGZhpqsQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-generic-pool@0.43.0': - resolution: {integrity: sha512-at8GceTtNxD1NfFKGAuwtqM41ot/TpcLh+YsGe4dhf7gvv1HW/ZWdq6nfRtS6UjIvZJOokViqLPJ3GVtZItAnQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-graphql@0.47.0': - resolution: {integrity: sha512-Cc8SMf+nLqp0fi8oAnooNEfwZWFnzMiBHCGmDFYqmgjPylyLmi83b+NiTns/rKGwlErpW0AGPt0sMpkbNlzn8w==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-hapi@0.45.1': - resolution: {integrity: sha512-VH6mU3YqAKTePPfUPwfq4/xr049774qWtfTuJqVHoVspCLiT3bW+fCQ1toZxt6cxRPYASoYaBsMA3CWo8B8rcw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-http@0.57.1': - resolution: {integrity: sha512-ThLmzAQDs7b/tdKI3BV2+yawuF09jF111OFsovqT1Qj3D8vjwKBwhi/rDE5xethwn4tSXtZcJ9hBsVAlWFQZ7g==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-ioredis@0.47.0': - resolution: {integrity: sha512-4HqP9IBC8e7pW9p90P3q4ox0XlbLGme65YTrA3UTLvqvo4Z6b0puqZQP203YFu8m9rE/luLfaG7/xrwwqMUpJw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-kafkajs@0.7.0': - resolution: {integrity: sha512-LB+3xiNzc034zHfCtgs4ITWhq6Xvdo8bsq7amR058jZlf2aXXDrN9SV4si4z2ya9QX4tz6r4eZJwDkXOp14/AQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-knex@0.44.0': - resolution: {integrity: sha512-SlT0+bLA0Lg3VthGje+bSZatlGHw/vwgQywx0R/5u9QC59FddTQSPJeWNw29M6f8ScORMeUOOTwihlQAn4GkJQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-koa@0.47.0': - resolution: {integrity: sha512-HFdvqf2+w8sWOuwtEXayGzdZ2vWpCKEQv5F7+2DSA74Te/Cv4rvb2E5So5/lh+ok4/RAIPuvCbCb/SHQFzMmbw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-lru-memoizer@0.44.0': - resolution: {integrity: sha512-Tn7emHAlvYDFik3vGU0mdwvWJDwtITtkJ+5eT2cUquct6nIs+H8M47sqMJkCpyPe5QIBJoTOHxmc6mj9lz6zDw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongodb@0.51.0': - resolution: {integrity: sha512-cMKASxCX4aFxesoj3WK8uoQ0YUrRvnfxaO72QWI2xLu5ZtgX/QvdGBlU3Ehdond5eb74c2s1cqRQUIptBnKz1g==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongoose@0.46.0': - resolution: {integrity: sha512-mtVv6UeaaSaWTeZtLo4cx4P5/ING2obSqfWGItIFSunQBrYROfhuVe7wdIrFUs2RH1tn2YYpAJyMaRe/bnTTIQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql2@0.45.0': - resolution: {integrity: sha512-qLslv/EPuLj0IXFvcE3b0EqhWI8LKmrgRPIa4gUd8DllbBpqJAvLNJSv3cC6vWwovpbSI3bagNO/3Q2SuXv2xA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql@0.45.0': - resolution: {integrity: sha512-tWWyymgwYcTwZ4t8/rLDfPYbOTF3oYB8SxnYMtIQ1zEf5uDm90Ku3i6U/vhaMyfHNlIHvDhvJh+qx5Nc4Z3Acg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-nestjs-core@0.44.0': - resolution: {integrity: sha512-t16pQ7A4WYu1yyQJZhRKIfUNvl5PAaF2pEteLvgJb/BWdd1oNuU1rOYt4S825kMy+0q4ngiX281Ss9qiwHfxFQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-pg@0.50.0': - resolution: {integrity: sha512-TtLxDdYZmBhFswm8UIsrDjh/HFBeDXd4BLmE8h2MxirNHewLJ0VS9UUddKKEverb5Sm2qFVjqRjcU+8Iw4FJ3w==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-redis-4@0.46.0': - resolution: {integrity: sha512-aTUWbzbFMFeRODn3720TZO0tsh/49T8H3h8vVnVKJ+yE36AeW38Uj/8zykQ/9nO8Vrtjr5yKuX3uMiG/W8FKNw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-tedious@0.18.0': - resolution: {integrity: sha512-9zhjDpUDOtD+coeADnYEJQ0IeLVCj7w/hqzIutdp5NqS1VqTAanaEfsEcSypyvYv5DX3YOsTUoF+nr2wDXPETA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-undici@0.10.0': - resolution: {integrity: sha512-vm+V255NGw9gaSsPD6CP0oGo8L55BffBc8KnxqsMuc6XiAD1L8SFNzsW0RHhxJFqy9CJaJh+YiJ5EHXuZ5rZBw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.7.0 - - '@opentelemetry/instrumentation@0.53.0': - resolution: {integrity: sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.57.1': - resolution: {integrity: sha512-SgHEKXoVxOjc20ZYusPG3Fh+RLIZTSa4x8QtD3NfgAUDyqdFFS9W1F2ZVbZkqDCdyMcQG02Ok4duUGLHJXHgbA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.57.2': - resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/redis-common@0.36.2': - resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} - engines: {node: '>=14'} - - '@opentelemetry/resources@1.30.1': - resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@1.30.1': - resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/semantic-conventions@1.27.0': - resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} - engines: {node: '>=14'} - - '@opentelemetry/semantic-conventions@1.28.0': - resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} - engines: {node: '>=14'} - - '@opentelemetry/semantic-conventions@1.30.0': - resolution: {integrity: sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw==} - engines: {node: '>=14'} - - '@opentelemetry/sql-common@0.40.1': - resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -1319,9 +1069,6 @@ packages: '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} - '@prisma/instrumentation@5.22.0': - resolution: {integrity: sha512-LxccF392NN37ISGxIurUljZSh1YWnphO34V5a0+T7FVQG2u9bhAXRTJpgmQ3483woVhkraQZFF7cbRrpbw/F4Q==} - '@resvg/resvg-js-android-arm-eabi@2.6.2': resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} engines: {node: '>= 10'} @@ -1398,9 +1145,9 @@ packages: resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==} engines: {node: '>= 10'} - '@rollup/plugin-commonjs@25.0.8': - resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} - engines: {node: '>=14.0.0'} + '@rollup/plugin-commonjs@28.0.3': + resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 peerDependenciesMeta: @@ -1416,8 +1163,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.3.1': - resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + '@rollup/plugin-node-resolve@16.0.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -1529,132 +1276,27 @@ packages: cpu: [x64] os: [win32] - '@sentry-internal/browser-utils@8.55.0': - resolution: {integrity: sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==} - engines: {node: '>=14.18'} - - '@sentry-internal/feedback@8.55.0': - resolution: {integrity: sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw==} - engines: {node: '>=14.18'} - - '@sentry-internal/replay-canvas@8.55.0': - resolution: {integrity: sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w==} - engines: {node: '>=14.18'} - - '@sentry-internal/replay@8.55.0': - resolution: {integrity: sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw==} - engines: {node: '>=14.18'} - - '@sentry/babel-plugin-component-annotate@2.22.6': - resolution: {integrity: sha512-V2g1Y1I5eSe7dtUVMBvAJr8BaLRr4CLrgNgtPaZyMT4Rnps82SrZ5zqmEkLXPumlXhLUWR6qzoMNN2u+RXVXfQ==} - engines: {node: '>= 14'} - - '@sentry/browser@8.55.0': - resolution: {integrity: sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw==} - engines: {node: '>=14.18'} - - '@sentry/bundler-plugin-core@2.22.6': - resolution: {integrity: sha512-1esQdgSUCww9XAntO4pr7uAM5cfGhLsgTK9MEwAKNfvpMYJi9NUTYa3A7AZmdA8V6107Lo4OD7peIPrDRbaDCg==} - engines: {node: '>= 14'} - - '@sentry/cli-darwin@2.42.3': - resolution: {integrity: sha512-QGNXZ5c2kbjB3O37ep/uVfqTspHaHkH4kmoMPNJ6j21A1oYyJq5t/AX9JWsueysRwvn6Jc0K0+XyzYZ13z0vsQ==} - engines: {node: '>=10'} - os: [darwin] - - '@sentry/cli-linux-arm64@2.42.3': - resolution: {integrity: sha512-tRqWrmphK82G14KKFEouLdV8BdCpGsTuySZ8nzTqhoAtcjpWFaavX2/1UqKzPVYjkxwXc1npO3Q7qfZYW2HvjQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux, freebsd] - - '@sentry/cli-linux-arm@2.42.3': - resolution: {integrity: sha512-tipumegAsKy9KLq6Bk87E8FqkKErReaNzdhoHCb081jkxQxpzKN/MQPMl9mA0XeKc4A7OUBM3vjhIk6uNi1R2g==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux, freebsd] - - '@sentry/cli-linux-i686@2.42.3': - resolution: {integrity: sha512-pc4Kc7xTMNbUPiRLQ2UXcj2V2vbVmST0IyhOlVTmY0L3ZxMdiwTq7qgS/IcxI/CaCPyEZWplXnxlsa//mCMuYw==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [linux, freebsd] - - '@sentry/cli-linux-x64@2.42.3': - resolution: {integrity: sha512-CZoG2swc38/RruLYtvMJNpcbvzqpcSDl+dUFJ3y6wIvMsE1IQL3zrb4xSh1Acf8Hi+GhlFAtoZpgH1tpWWZ/Zw==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux, freebsd] - - '@sentry/cli-win32-i686@2.42.3': - resolution: {integrity: sha512-geiPcfeuSj23N346xwrxFAuohIivK48NKQQYllVFAADYoYrSawSznVzRyOIheiOte1AIrDkpqzoT/5igl7ANEQ==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [win32] - - '@sentry/cli-win32-x64@2.42.3': - resolution: {integrity: sha512-sG+phJ+3WUMx6gTrUd7UH+q0L6X1YjS57ovMMf3XYyE/WIF8c+uc+vZC/RB3O5l3vTTCXoePqHf8+9ulgp9dkA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@sentry/cli@2.42.3': - resolution: {integrity: sha512-SqY+QZGAISb0NWh6Y4HX/RUhUq9VQjN18ZhY3tTtObgxoaRkbngs21gEyemSKf5hv3HsVGuUf9jvxGQEalwrsw==} - engines: {node: '>= 10'} - hasBin: true - - '@sentry/core@8.55.0': - resolution: {integrity: sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==} - engines: {node: '>=14.18'} - - '@sentry/node@8.55.0': - resolution: {integrity: sha512-h10LJLDTRAzYgay60Oy7moMookqqSZSviCWkkmHZyaDn+4WURnPp5SKhhfrzPRQcXKrweiOwDSHBgn1tweDssg==} - engines: {node: '>=14.18'} - - '@sentry/opentelemetry@8.55.0': - resolution: {integrity: sha512-UvatdmSr3Xf+4PLBzJNLZ2JjG1yAPWGe/VrJlJAqyTJ2gKeTzgXJJw8rp4pbvNZO8NaTGEYhhO+scLUj0UtLAQ==} - engines: {node: '>=14.18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 - '@opentelemetry/core': ^1.30.1 - '@opentelemetry/instrumentation': ^0.57.1 - '@opentelemetry/sdk-trace-base': ^1.30.1 - '@opentelemetry/semantic-conventions': ^1.28.0 - - '@sentry/svelte@8.55.0': - resolution: {integrity: sha512-8xQ3RHOUq21f40LWn5eJEgg6rLQfZ+8oBdKLkg03b3SwvfdBs9CrlPkvhhmxdZZslmcGr6ewl0t5WT9ea8Ydlw==} - engines: {node: '>=14.18'} - peerDependencies: - svelte: 3.x || 4.x || 5.x - - '@sentry/sveltekit@8.55.0': - resolution: {integrity: sha512-fhjv4hn/y/4olSuZLBzQZbD20EcguIzgSYmarc8P/kn9ZVkO5onNDIqgDP0wmFrGVs5ihCPl/gGn9gXV0cXUjQ==} - engines: {node: '>=16'} - peerDependencies: - '@sveltejs/kit': 1.x || 2.x - vite: '*' - peerDependenciesMeta: - vite: - optional: true - - '@sentry/vite-plugin@2.22.6': - resolution: {integrity: sha512-zIieP1VLWQb3wUjFJlwOAoaaJygJhXeUoGd0e/Ha2RLb2eW2S+4gjf6y6NqyY71tZ74LYVZKg/4prB6FAZSMXQ==} - engines: {node: '>= 14'} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sveltejs/adapter-node@4.0.1': - resolution: {integrity: sha512-IviiTtKCDp+0QoTmmMlGGZBA1EoUNsjecU6XGV9k62S3f01SNsVhpqi2e4nbI62BLGKh/YKKfFii+Vz/b9XIxg==} + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-node@5.2.12': + resolution: {integrity: sha512-0bp4Yb3jKIEcZWVcJC/L1xXp9zzJS4hDwfb4VITAkfT4OVdkspSHsx7YhqJDbb2hgLl6R9Vs7VQR+fqIVOxPUQ==} peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/enhanced-img@0.1.9': - resolution: {integrity: sha512-gUgaiG88P6moWcxZx4YrzMhAlw1TgggKRp7n9gdfCREDeXHysCd1l9GpQR3sh109SM3rNlkiaAzt+iPLT0aG1w==} + '@sveltejs/enhanced-img@0.4.4': + resolution: {integrity: sha512-BlBTGfbLUgHa+zSVrsGLOd+noCKWfipoOjoxE26bAAX97v7zh5eiCAp1KEdpkluL05Tl3+nR14gQdPsATyZqoA==} + peerDependencies: + svelte: ^5.0.0 + vite: '>= 5.0.0' - '@sveltejs/kit@2.19.0': - resolution: {integrity: sha512-UTx28Ad4sYsLU//gqkEo5aFOPFBRT2uXCmXTsURqhurDCvzkVwXruJgBcHDaMiK6RKKpYRteDUaXYqZyGPgCXQ==} + '@sveltejs/kit@2.20.2': + resolution: {integrity: sha512-Dv8TOAZC9vyfcAB9TMsvUEJsRbklRTeNfcYBPaeH6KnABJ99i3CvCB2eNx8fiiliIqe+9GIchBg4RodRH5p1BQ==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -1662,90 +1304,99 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 || ^6.0.0 - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': - resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 - '@sveltejs/vite-plugin-svelte@3.1.2': - resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte@5.0.3': + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tailwindcss/oxide-android-arm64@4.0.0-alpha.17': - resolution: {integrity: sha512-IBOd4/iQW8tq8YJJgoEECy+wVPnJcAx/kwS45uKTbq5GVK9l8siBEnTiJ7VPnuoo2vQfLlJjshA7ar8nMX589w==} + '@tailwindcss/node@4.1.2': + resolution: {integrity: sha512-ZwFnxH+1z8Ehh8bNTMX3YFrYdzAv7JLY5X5X7XSFY+G9QGJVce/P9xb2mh+j5hKt8NceuHmdtllJvAHWKtsNrQ==} + + '@tailwindcss/oxide-android-arm64@4.1.2': + resolution: {integrity: sha512-IxkXbntHX8lwGmwURUj4xTr6nezHhLYqeiJeqa179eihGv99pRlKV1W69WByPJDQgSf4qfmwx904H6MkQqTA8w==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.0.0-alpha.17': - resolution: {integrity: sha512-JiV0oe6QmeL/6dDQkk12H+sa/BmH4p7KbaW2/PPOTfFVZjIbM9Qj3drsFwWRuwPTI9mSpJQFxWtdbMYarLVK1w==} + '@tailwindcss/oxide-darwin-arm64@4.1.2': + resolution: {integrity: sha512-ZRtiHSnFYHb4jHKIdzxlFm6EDfijTCOT4qwUhJ3GWxfDoW2yT3z/y8xg0nE7e72unsmSj6dtfZ9Y5r75FIrlpA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.0.0-alpha.17': - resolution: {integrity: sha512-39zvOSxFfiVcQQp1/4dD5kMH6bwKagRO2PLLmlH6EAM7LuIyVsKJwFK5Z+ZYTLoG3hUGUxvCPOjgbqMYvRLJ3w==} + '@tailwindcss/oxide-darwin-x64@4.1.2': + resolution: {integrity: sha512-BiKUNZf1A0pBNzndBvnPnBxonCY49mgbOsPfILhcCE5RM7pQlRoOgN7QnwNhY284bDbfQSEOWnFR0zbPo6IDTw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.0.0-alpha.17': - resolution: {integrity: sha512-KplmR3Md+B5W0ocH4N3ArLowABlKHKqV6mImURrGriqDhwfVeJyarugx+Uo811D2qSYTqLkQXW7u0esIxBM69w==} + '@tailwindcss/oxide-freebsd-x64@4.1.2': + resolution: {integrity: sha512-Z30VcpUfRGkiddj4l5NRCpzbSGjhmmklVoqkVQdkEC0MOelpY+fJrVhzSaXHmWrmSvnX8yiaEqAbdDScjVujYQ==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0-alpha.17': - resolution: {integrity: sha512-2GZ91U2fkqY9ohaPiQr1UJt0yAaZq7/5tFXvtRUY72PDYfz1PlnvxyDlQ16roepxi+Si52svLmzm7E9g4kVz/g==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.2': + resolution: {integrity: sha512-w3wsK1ChOLeQ3gFOiwabtWU5e8fY3P1Ss8jR3IFIn/V0va3ir//hZ8AwURveS4oK1Pu6b8i+yxesT4qWnLVUow==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.0.0-alpha.17': - resolution: {integrity: sha512-11do1KeInnJo7vVJgI2bTJ3YHQ6jirbJB4KcfHS1sn9ArKUFJrgk+32QQGj+Gv39krgzSReNb84Xr+Oi6iCcyA==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.2': + resolution: {integrity: sha512-oY/u+xJHpndTj7B5XwtmXGk8mQ1KALMfhjWMMpE8pdVAznjJsF5KkCceJ4Fmn5lS1nHMCwZum5M3/KzdmwDMdw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.0.0-alpha.17': - resolution: {integrity: sha512-qB0XX8iGafq7IJa7yDPVaDLQC2QhjtMgXgKggpgxjtLaSQDVJ53hHmmjglgLSghlHpZ0+mNfQDT8EOzRdhvj7Q==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.2': + resolution: {integrity: sha512-k7G6vcRK/D+JOWqnKzKN/yQq1q4dCkI49fMoLcfs2pVcaUAXEqCP9NmA8Jv+XahBv5DtDjSAY3HJbjosEdKczg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.0.0-alpha.17': - resolution: {integrity: sha512-iTsqmqxdcrLf77SagBIygip656YLEtl2wO5VMoeK3omYviM/ipNH2Vu5HZ6fB/qotX9gVzyz4iQovFAWvp6Azg==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.2': + resolution: {integrity: sha512-fLL+c678TkYKgkDLLNxSjPPK/SzTec7q/E5pTwvpTqrth867dftV4ezRyhPM5PaiCqX651Y8Yk0wRQMcWUGnmQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.0.0-alpha.17': - resolution: {integrity: sha512-2bHxD8yXy36dpIFUbDW7LRDKYpZXRcOC0PTVukobmkp+F0p8rEnTcI36DPLGEA8W3+FDIKbGQM4aMb1r/BbGZg==} + '@tailwindcss/oxide-linux-x64-musl@4.1.2': + resolution: {integrity: sha512-0tU1Vjd1WucZ2ooq6y4nI9xyTSaH2g338bhrqk+2yzkMHskBm+pMsOCfY7nEIvALkA1PKPOycR4YVdlV7Czo+A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-win32-x64-msvc@4.0.0-alpha.17': - resolution: {integrity: sha512-qNFwdHYQoJDfObko0WyutVrFPoaZB5pVkJ6FlR7M/0ylLvx/BR7kfyWZYmivi3DGXZmm4eMFLLYZjBjLHWbvUg==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.2': + resolution: {integrity: sha512-r8QaMo3QKiHqUcn+vXYCypCEha+R0sfYxmaZSgZshx9NfkY+CHz91aS2xwNV/E4dmUDkTPUag7sSdiCHPzFVTg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.2': + resolution: {integrity: sha512-lYCdkPxh9JRHXoBsPE8Pu/mppUsC2xihYArNAESub41PKhHTnvn6++5RpmFM+GLSt3ewyS8fwCVvht7ulWm6cw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.0.0-alpha.17': - resolution: {integrity: sha512-5FciVkCRpYRsVRyu8+ldiiOxGgXDJQLMzd5fjPCt7JZWhSZjS/QkXQdBc41Bcice3sgxTtKpKA4ef3sEcOfG/A==} + '@tailwindcss/oxide@4.1.2': + resolution: {integrity: sha512-Zwz//1QKo6+KqnCKMT7lA4bspGfwEgcPAHlSthmahtgrpKDfwRGk8PKQrW8Zg/ofCDIlg6EtjSTKSxxSufC+CQ==} engines: {node: '>= 10'} - '@tailwindcss/postcss@4.0.0-alpha.17': - resolution: {integrity: sha512-N0DQOSy+5c1/JkKt1yPja5Kb0QqpkYFFEcV5SK+Cnko+ncsDYOesEfIm00qAtb/9S9SWy5PGNHP7s0U21pWGyA==} + '@tailwindcss/postcss@4.1.2': + resolution: {integrity: sha512-vgkMo6QRhG6uv97im6Y4ExDdq71y9v2IGZc+0wn7lauQFYJM/1KdUVhrOkexbUso8tUsMOWALxyHVkQEbsM7gw==} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1767,9 +1418,6 @@ packages: '@types/compression@1.7.5': resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} - '@types/connect@3.4.36': - resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} - '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -1827,24 +1475,12 @@ packages: '@types/morgan@1.9.9': resolution: {integrity: sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==} - '@types/mysql@2.15.26': - resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} - '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} '@types/node@22.13.10': resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} - '@types/pg-pool@2.0.6': - resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} - - '@types/pg@8.6.1': - resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} - - '@types/pug@2.0.10': - resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/qs@6.9.18': resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} @@ -1860,12 +1496,6 @@ packages: '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - '@types/shimmer@1.2.0': - resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} - - '@types/tedious@4.0.14': - resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - '@typescript-eslint/eslint-plugin@8.26.1': resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1913,20 +1543,34 @@ packages: resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/expect@1.6.1': - resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + '@vitest/expect@3.1.1': + resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} - '@vitest/runner@1.6.1': - resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + '@vitest/mocker@3.1.1': + resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vitest/snapshot@1.6.1': - resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + '@vitest/pretty-format@3.1.1': + resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} - '@vitest/spy@1.6.1': - resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + '@vitest/runner@3.1.1': + resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} - '@vitest/utils@1.6.1': - resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + '@vitest/snapshot@3.1.1': + resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} + + '@vitest/spy@3.1.1': + resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} + + '@vitest/utils@3.1.1': + resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} '@xmldom/xmldom@0.7.13': resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} @@ -1940,20 +1584,11 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - acorn-import-attributes@1.9.5: - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} - peerDependencies: - acorn: ^8 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} @@ -2012,10 +1647,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -2035,12 +1666,9 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -2052,6 +1680,10 @@ packages: resolution: {integrity: sha512-mK8yQmJJy369cz0x2LJwhKD72tkTObBwhgR+3U8Ts8+wCSspED3ydXlWpsv1ZQ9g2iq4b+7EWli+ap2nTeUQog==} engines: {node: '>=16.0.0'} + axe-core@4.9.1: + resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==} + engines: {node: '>=4'} + axios@1.8.3: resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==} @@ -2065,13 +1697,15 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bits-ui@1.3.19: + resolution: {integrity: sha512-2blb6dkgedHUsDXqCjvmtUi4Advgd9MhaJDT8r7bEWDzHI8HGsOoYsLeh8CxpEWWEYPrlGN+7k+kpxRhIDdFrQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.11.0 + bmp-js@0.1.0: resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} @@ -2088,15 +1722,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} - buffer-equal@0.0.1: resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} engines: {node: '>=0.4.0'} @@ -2127,22 +1752,20 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001704: - resolution: {integrity: sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==} - centra@2.7.0: resolution: {integrity: sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==} - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -2151,10 +1774,6 @@ packages: resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} engines: {node: '>=18.17'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -2163,9 +1782,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -2188,9 +1804,6 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2235,15 +1848,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} @@ -2306,8 +1913,8 @@ packages: supports-color: optional: true - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} deep-is@0.1.4: @@ -2338,10 +1945,6 @@ packages: destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -2384,10 +1987,6 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2400,9 +1999,6 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.116: - resolution: {integrity: sha512-mufxTCJzLBQVvSdZzX1s5YAuXsN1M4tTyYxOOL1TcSKtIzQ9rjIrm7yFK80rN5dwGTePgdoABDSHpuVtRQh0Zw==} - embla-carousel-auto-scroll@8.5.2: resolution: {integrity: sha512-B0QF4vcHRLu7DJwDpgTq5q8qsX4185hOuXfpWPtOlZW+a+QG7ZIN3zTSUTI3Xt0MTWkAB5ZJ0gsFj2zUMKL3ig==} peerDependencies: @@ -2442,6 +2038,10 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2472,12 +2072,9 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es6-promise@3.3.1: - resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -2547,15 +2144,13 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} + esrap@1.4.6: + resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -2582,13 +2177,13 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - exif-parser@0.1.12: resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} @@ -2608,6 +2203,14 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -2660,9 +2263,6 @@ packages: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} - forwarded-parse@2.1.2: - resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} - fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -2696,17 +2296,10 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2715,10 +2308,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - gifwrap@0.9.4: resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==} @@ -2743,17 +2332,9 @@ packages: engines: {node: '>=12'} deprecated: Glob versions prior to v9 are no longer supported - glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2762,16 +2343,10 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2832,10 +2407,6 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -2856,9 +2427,9 @@ packages: image2uri@1.0.5: resolution: {integrity: sha512-y0BKZgnoDLRIF2J0Pg/Wa6uhY5i6SqR7Wfagghf0UHRpnWJ5jm1IS0bZjAV5ADOxHAM2zdzYWmw8EbQgEUlvmw==} - imagetools-core@6.0.4: - resolution: {integrity: sha512-N1qs5qn7u9nR3kboISkYuvJm8MohiphCfBa+wx1UOropVaFis9/mh6wuDPLHJNhl6/64C7q2Pch5NASVKAaSrg==} - engines: {node: '>=12.0.0'} + imagetools-core@7.0.2: + resolution: {integrity: sha512-nrLdKLJHHXd8MitwlXK6/h1TSwGaH3X1DZ3z6yMv/tX7dJ12ecLxZ6P5jgKetfIFh8IJwH9fCWMoTA8ixg0VVA==} + engines: {node: '>=18.0.0'} immutable@5.0.3: resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} @@ -2867,9 +2438,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.13.1: - resolution: {integrity: sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==} - import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -2895,6 +2463,9 @@ packages: resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} engines: {node: ^18.17.0 || >=20.5.0} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} @@ -2905,10 +2476,6 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -2952,10 +2519,6 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -2970,6 +2533,22 @@ packages: engines: {node: '>=10'} hasBin: true + jest-axe@9.0.0: + resolution: {integrity: sha512-Xt7O0+wIpW31lv0SO1wQZUTyJE7DEmnDEZeTt9/S9L5WUywxrv8BrgvTuQEqujtfaQOcJ70p4wg7UUgK1E2F5g==} + engines: {node: '>= 16.0.0'} + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.2.2: + resolution: {integrity: sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jimp@0.16.13: resolution: {integrity: sha512-Bxz8q7V4rnCky9A0ktTNGA9SkNFVWRHodddI/DaAWZJzF7sVUlFYKQ60y9JGqrKpi48ECA/TnfMzzc5C70VByA==} @@ -2977,15 +2556,13 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -2993,11 +2570,6 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -3007,11 +2579,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - jsonc-eslint-parser@2.4.0: resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3110,10 +2677,6 @@ packages: load-bmfont@1.4.2: resolution: {integrity: sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==} - local-pkg@0.5.1: - resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} - engines: {node: '>=14'} - locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} @@ -3127,18 +2690,15 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - lovely-logs@1.2.2: - resolution: {integrity: sha512-dPvYcBok38QvXC+X8/v2BZJDA/iZfCfkRXAwp+s9rvBxY+ZWkMuhNNxukQVIUVMNutIonKpN140Vfv6LCli/wQ==} + lovely-logs@2.6.0: + resolution: {integrity: sha512-l5Oao2HccZj4eRkaGpIyGsNkcxvhgL4emmYrRAllMVHlZY2Zag+w2tWrp5LqP+Ih92ONIhCTNZk/8zvGH8+row==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -3146,17 +2706,6 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.7: - resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} - engines: {node: '>=12'} - - magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} - - magicast@0.2.8: - resolution: {integrity: sha512-zEnqeb3E6TfMKYXGyHv3utbuHNixr04o3/gVGviSzVQkbFiU46VZUd+Ea/1npKfvEsEWxBYuIksKzoztTDPg0A==} - make-fetch-happen@10.2.1: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3192,8 +2741,11 @@ packages: meilisearch@0.37.0: resolution: {integrity: sha512-LdbK6JmRghCawrmWKJSEQF0OiE82md+YqJGE/U2JcCD8ROwlhTx0KM6NX4rQt0u0VpV0QZVG9umYiu3CSSIJAQ==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + melt@0.29.2: + resolution: {integrity: sha512-x0qR8yE8+x2Bu6s1DRJNAxPBN295ANfTVJ/8UcWsNm/hb7M14ws9G64OFpRExZcI45kdh2KZb1LwHFmNsLwUbQ==} + peerDependencies: + '@floating-ui/dom': ^1.6.0 + svelte: ^5.0.0 merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -3219,17 +2771,9 @@ packages: engines: {node: '>=4'} hasBin: true - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3237,10 +2781,6 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3272,10 +2812,6 @@ packages: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} @@ -3297,12 +2833,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - - module-details-from-path@1.0.3: - resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} - motion@10.18.0: resolution: {integrity: sha512-MVAZZmwM/cp77BrNe1TxTMldxRPjwBNHheU5aPToqT4rJdZxLiADk58H+a0al5jKLxkB0OdgNq6DiVn11cjvIQ==} @@ -3367,9 +2897,6 @@ packages: node-mock-http@1.0.0: resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - noop2@2.0.0: resolution: {integrity: sha512-2bu7Pfpf6uNqashWV8P7yYeutQ3XkLY9MBSYI5sOAFZxuWcW/uJfLbKj5m6SvMDT9U1Y0C+7UFG+7VSiIdXjtA==} @@ -3378,17 +2905,9 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - normalize.css@8.0.1: resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3410,10 +2929,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} @@ -3440,10 +2955,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -3495,10 +3006,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -3516,27 +3023,14 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} peek-readable@4.1.0: resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} engines: {node: '>=8'} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - - pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - - pg-protocol@1.8.0: - resolution: {integrity: sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==} - - pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - phin@2.9.3: resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -3556,10 +3050,6 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -3571,9 +3061,6 @@ packages: resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} hasBin: true - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - plausible-tracker@0.3.9: resolution: {integrity: sha512-hMhneYm3GCPyQon88SZrVJx+LlqhM1kZFQbuAgXPoh/Az2YvO1B6bitT9qlhpiTdJlsT5lsr3gPmzoVjb5CDXA==} engines: {node: '>=10'} @@ -3592,12 +3079,6 @@ packages: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} - postcss-import@16.1.0: - resolution: {integrity: sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==} - engines: {node: '>=18.0.0'} - peerDependencies: - postcss: ^8.0.0 - postcss-load-config@3.1.4: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} @@ -3626,29 +3107,10 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} - - postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - - postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - - postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} - posthog-js@1.230.4: resolution: {integrity: sha512-mxugFjLif0pSlwQ1vYHj92xA0x86foKsRir/IO7TowFzIPk7YL8+nfNvoihmq4ZRomUbQhgzHildsAQDfj6j9w==} peerDependencies: @@ -3748,10 +3210,6 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -3787,9 +3245,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -3813,10 +3268,6 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} - regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} @@ -3826,14 +3277,13 @@ packages: remeda@2.21.2: resolution: {integrity: sha512-wdhkMDou8HRpD7RnxKJ/FHJWEGXRH7jV/pb0NsdLLSoBo+G9RjtxcY41hVhogLfEMkThk6aySKjs+Yd6PnpzBA==} + reodotdev@1.0.0: + resolution: {integrity: sha512-wXe1vJucZjrhQL0SxOL9EvmJrtbMCIEGMdZX5lj/57n2T3UhBHZsAcM5TQASJ0T6ZBbrETRnMhH33bsbJeRO6Q==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.5.2: - resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} - engines: {node: '>=8.6.0'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3851,11 +3301,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -3869,6 +3314,11 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + runed@0.23.4: + resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==} + peerDependencies: + svelte: ^5.7.0 + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -3882,9 +3332,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sander@0.5.1: - resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} - sass@1.85.1: resolution: {integrity: sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==} engines: {node: '>=14.0.0'} @@ -3893,10 +3340,6 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.7.1: resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} @@ -3920,9 +3363,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shimmer@1.2.1: - resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -3956,22 +3396,10 @@ packages: resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - sorcery@0.11.1: - resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==} - hasBin: true - - sorcery@1.0.0: - resolution: {integrity: sha512-5ay9oJE+7sNmhzl3YNG18jEEEf4AOQCM/FAqR5wMmzqd1FtRorFbJXn3w3SKOhbiQaVgHM+Q1lszZspjri7bpA==} - hasBin: true - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - split2@1.1.1: resolution: {integrity: sha512-cfurE2q8LamExY+lJ9Ex3ZfBwqAPduzOKVscPDXNCLLMvyaeD3DTz1yk7fVIs6Chco+12XeD0BB6HEoYzPYbXA==} @@ -4010,25 +3438,17 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.1: - resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} - strtok3@6.3.0: resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} engines: {node: '>=10'} + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -4042,11 +3462,13 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@3.8.6: - resolution: {integrity: sha512-ij0u4Lw/sOTREP13BdWZjiXD/BlHE6/e2e34XzmVmsp5IN4kVa3PWP65NM32JAgwjZlwBg/+JtiNV1MM8khu0Q==} + svelte-check@4.1.5: + resolution: {integrity: sha512-Gb0T2IqBNe1tLB9EB1Qh+LOe+JB8wt2/rNBDGvkxQVvk8vNeAoG+vZgFB/3P5+zC7RWlyBlzm9dVjZFph/maIg==} + engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: - svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' svelte-eslint-parser@0.43.0: resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==} @@ -4057,14 +3479,8 @@ packages: svelte: optional: true - svelte-hmr@0.16.0: - resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} - engines: {node: ^12.20 || ^14.13.1 || >= 16} - peerDependencies: - svelte: ^3.19.0 || ^4.0.0 - - svelte-markdoc-preprocess@2.1.0: - resolution: {integrity: sha512-Q1IsHTj+uEhh6qjCdRdUXjsfaTJxSdpJ/csM0b86BFhPcdc+nh9QmInWvgrTeLZqu9X4CGCO9U3VbC7FcXjaSw==} + svelte-markdoc-preprocess@3.0.0: + resolution: {integrity: sha512-95VPUYL1yQyPgRucsikQy673h5FDH+qqQa8pugPT1/zuMFuvoBRvTRmB0kKeC2TD/mBsQm+is2vU2YwYbVPZoA==} svelte-markdown@0.4.1: resolution: {integrity: sha512-pOlLY6EruKJaWI9my/2bKX8PdTeP5CM0s4VMmwmC2prlOkjAf+AOmTM4wW/l19Y6WZ87YmP8+ZCJCCwBChWjYw==} @@ -4076,46 +3492,15 @@ packages: peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1 - svelte-preprocess@5.1.4: - resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} - engines: {node: '>= 16.0.0'} + svelte-toolbelt@0.7.1: + resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} peerDependencies: - '@babel/core': ^7.10.2 - coffeescript: ^2.5.1 - less: ^3.11.3 || ^4.0.0 - postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - pug: ^3.0.0 - sass: ^1.26.8 - stylus: ^0.55.0 - sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 - svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 - typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' - peerDependenciesMeta: - '@babel/core': - optional: true - coffeescript: - optional: true - less: - optional: true - postcss: - optional: true - postcss-load-config: - optional: true - pug: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - typescript: - optional: true + svelte: ^5.0.0 - svelte@4.2.19: - resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} - engines: {node: '>=16'} + svelte@5.25.6: + resolution: {integrity: sha512-RGkaeAXDuJdvhA1fdSM5GgD++vYfJYijZL0uN6kM2s/TRJ663jktBhZlF0qjzAJGR/34PtaeT3G8MKJY1EKeqg==} + engines: {node: '>=18'} svg-pathdata@6.0.3: resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} @@ -4154,11 +3539,15 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@2.6.0: - resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} - tailwindcss@4.0.0-alpha.17: - resolution: {integrity: sha512-wWr6kvH40Hp1LQVcD738ojwU6+muJnpIUZw3J2EqjOdqHpg3iUIkrrQszP5HP4nwi4qBsoCoHPWVJ3Qw4f1IZw==} + tailwindcss@4.1.2: + resolution: {integrity: sha512-VCsK+fitIbQF7JlxXaibFhxrPq4E2hDcG8apzHUdWFMCQWD8uLdlHg4iSkZ53cgLCCcZ+FZK7vG8VjvLcnBgKw==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} @@ -4180,24 +3569,25 @@ packages: timm@1.7.1: resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} - tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} to-regex-range@5.0.1: @@ -4248,10 +3638,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - type-fest@4.37.0: resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==} engines: {node: '>=16'} @@ -4296,15 +3682,6 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unplugin@1.0.1: - resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -4318,13 +3695,13 @@ packages: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} - vite-imagetools@6.2.9: - resolution: {integrity: sha512-C4ZYhgj2vAj43/TpZ06XlDNP0p/7LIeYbgUYr+xG44nM++4HGX6YZBKAYpiBNgiCFUTJ6eXkRppWBrfPMevgmg==} - engines: {node: '>=12.0.0'} + vite-imagetools@7.0.5: + resolution: {integrity: sha512-OOvVnaBTqJJ2J7X1cM1qpH4pj9jsfTxia1VSuWeyXtf+OnP8d0YI1LHpv8y2NT47wg+n7XiTgh3BvcSffuBWrw==} + engines: {node: '>=18.0.0'} - vite-node@1.6.1: - resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@3.1.1: + resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite-plugin-dynamic-import@1.6.0: @@ -4339,22 +3716,27 @@ packages: vite-plugin-manifest-sri@0.2.0: resolution: {integrity: sha512-Zt5jt19xTIJ91LOuQTCtNG7rTFc5OziAjBz2H5NdCGqaOD1nxrWExLhcKW+W4/q8/jOPCg/n5ncYEQmqCxiGQQ==} - vite@5.4.14: - resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@6.2.4: + resolution: {integrity: sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -4369,29 +3751,36 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vitefu@0.2.5: - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + vitefu@1.0.6: + resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: vite: optional: true - vitest@1.6.1: - resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@3.1.1: + resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.1 - '@vitest/ui': 1.6.1 + '@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 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/debug': + optional: true '@types/node': optional: true '@vitest/browser': @@ -4409,13 +3798,6 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - - webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -4481,9 +3863,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -4520,12 +3899,13 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.0: - resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==} - engines: {node: '>=12.20'} + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} snapshots: + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -4575,191 +3955,103 @@ snapshots: normalize.css: 8.0.1 the-new-css-reset: 1.11.3 - '@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/2c803b262cbf62b499df28ff11d2ca40e16ab909': {} - - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.26.8': {} - - '@babel/core@7.26.10': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.10 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.26.10 - '@babel/parser': 7.26.10 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.10 - '@babel/types': 7.26.10 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.26.10': - dependencies: - '@babel/parser': 7.26.10 - '@babel/types': 7.26.10 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.26.5': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.26.10 - '@babel/types': 7.26.10 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.10 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helpers@7.26.10': - dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.10 - - '@babel/parser@7.26.10': - dependencies: - '@babel/types': 7.26.10 + '@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/8b23d4bab1057eea089fa301b756495b7d207bfd': {} '@babel/runtime@7.26.10': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.26.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.10 - '@babel/types': 7.26.10 - - '@babel/traverse@7.26.10': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.10 - '@babel/parser': 7.26.10 - '@babel/template': 7.26.9 - '@babel/types': 7.26.10 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.26.10': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.25.2': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.25.2': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.25.2': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.25.2': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.25.2': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.25.2': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.25.2': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.25.2': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.25.2': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.25.2': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.25.2': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.25.2': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.25.2': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.25.2': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.25.2': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.25.2': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.25.2': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-arm64@0.25.2': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.25.2': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/openbsd-arm64@0.25.2': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/openbsd-x64@0.25.2': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/sunos-x64@0.25.2': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-arm64@0.25.2': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.22.0(jiti@1.21.7))': + '@esbuild/win32-ia32@0.25.2': + optional: true + + '@esbuild/win32-x64@0.25.2': + optional: true + + '@eslint-community/eslint-utils@4.5.1(eslint@9.22.0(jiti@2.4.2))': dependencies: - eslint: 9.22.0(jiti@1.21.7) + eslint: 9.22.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} + '@eslint/compat@1.2.7(eslint@9.22.0(jiti@2.4.2))': + optionalDependencies: + eslint: 9.22.0(jiti@2.4.2) + '@eslint/config-array@0.19.2': dependencies: '@eslint/object-schema': 2.1.6 @@ -4906,6 +4198,10 @@ snapshots: dependencies: '@swc/helpers': 0.5.15 + '@internationalized/date@3.8.0': + dependencies: + '@swc/helpers': 0.5.15 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5185,18 +4481,19 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@markdoc/markdoc@0.4.0': + '@markdoc/markdoc@0.5.1': optionalDependencies: + '@types/linkify-it': 3.0.5 '@types/markdown-it': 12.2.3 - '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.4(svelte@4.2.19))(svelte@4.2.19)': + '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.6(svelte@5.25.6))(svelte@5.25.6)': dependencies: - '@melt-ui/svelte': 0.86.4(svelte@4.2.19) + '@melt-ui/svelte': 0.86.6(svelte@5.25.6) estree-walker: 3.0.3 magic-string: 0.30.17 - svelte: 4.2.19 + svelte: 5.25.6 - '@melt-ui/svelte@0.86.4(svelte@4.2.19)': + '@melt-ui/svelte@0.86.6(svelte@5.25.6)': dependencies: '@floating-ui/core': 1.6.9 '@floating-ui/dom': 1.6.13 @@ -5204,7 +4501,7 @@ snapshots: dequal: 2.0.3 focus-trap: 7.6.4 nanoid: 5.1.3 - svelte: 4.2.19 + svelte: 5.25.6 '@motionone/animation@10.18.0': dependencies: @@ -5331,304 +4628,11 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@number-flow/svelte@0.3.5(svelte@4.2.19)': + '@number-flow/svelte@0.3.5(svelte@5.25.6)': dependencies: esm-env: 1.2.2 number-flow: 0.5.5 - svelte: 4.2.19 - - '@opentelemetry/api-logs@0.53.0': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api-logs@0.57.1': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api-logs@0.57.2': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api@1.9.0': {} - - '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.28.0 - - '@opentelemetry/instrumentation-amqplib@0.46.1(@opentelemetry/api@1.9.0)': - dependencies: - '@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/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-connect@0.43.0(@opentelemetry/api@1.9.0)': - dependencies: - '@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/semantic-conventions': 1.30.0 - '@types/connect': 3.4.36 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-dataloader@0.16.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-express@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@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/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-fastify@0.44.1(@opentelemetry/api@1.9.0)': - dependencies: - '@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/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-fs@0.19.0(@opentelemetry/api@1.9.0)': - dependencies: - '@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) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-generic-pool@0.43.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-graphql@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-hapi@0.45.1(@opentelemetry/api@1.9.0)': - dependencies: - '@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/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-http@0.57.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - forwarded-parse: 2.1.2 - semver: 7.7.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-ioredis@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.36.2 - '@opentelemetry/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-kafkajs@0.7.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-knex@0.44.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-koa@0.47.0(@opentelemetry/api@1.9.0)': - dependencies: - '@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/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-lru-memoizer@0.44.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongodb@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongoose@0.46.0(@opentelemetry/api@1.9.0)': - dependencies: - '@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/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql2@0.45.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql@0.45.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - '@types/mysql': 2.15.26 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-nestjs-core@0.44.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-pg@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@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/semantic-conventions': 1.27.0 - '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) - '@types/pg': 8.6.1 - '@types/pg-pool': 2.0.6 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-redis-4@0.46.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.36.2 - '@opentelemetry/semantic-conventions': 1.30.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-tedious@0.18.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-undici@0.10.0(@opentelemetry/api@1.9.0)': - dependencies: - '@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) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.53.0 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.13.1 - require-in-the-middle: 7.5.2 - semver: 7.7.1 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.57.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.1 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.13.1 - require-in-the-middle: 7.5.2 - semver: 7.7.1 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.13.1 - require-in-the-middle: 7.5.2 - semver: 7.7.1 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/redis-common@0.36.2': {} - - '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - - '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - - '@opentelemetry/semantic-conventions@1.27.0': {} - - '@opentelemetry/semantic-conventions@1.28.0': {} - - '@opentelemetry/semantic-conventions@1.30.0': {} - - '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + svelte: 5.25.6 '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -5700,14 +4704,6 @@ snapshots: '@polka/url@1.0.0-next.28': {} - '@prisma/instrumentation@5.22.0': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@resvg/resvg-js-android-arm-eabi@2.6.2': optional: true @@ -5759,14 +4755,15 @@ snapshots: '@resvg/resvg-js-win32-ia32-msvc': 2.6.2 '@resvg/resvg-js-win32-x64-msvc': 2.6.2 - '@rollup/plugin-commonjs@25.0.8(rollup@4.35.0)': + '@rollup/plugin-commonjs@28.0.3(rollup@4.35.0)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.35.0) commondir: 1.0.1 estree-walker: 2.0.2 - glob: 8.1.0 + fdir: 6.4.3(picomatch@4.0.2) is-reference: 1.2.1 magic-string: 0.30.17 + picomatch: 4.0.2 optionalDependencies: rollup: 4.35.0 @@ -5776,7 +4773,7 @@ snapshots: optionalDependencies: rollup: 4.35.0 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.35.0)': + '@rollup/plugin-node-resolve@16.0.1(rollup@4.35.0)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.35.0) '@types/resolve': 1.20.2 @@ -5851,201 +4848,35 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.35.0': optional: true - '@sentry-internal/browser-utils@8.55.0': - dependencies: - '@sentry/core': 8.55.0 - - '@sentry-internal/feedback@8.55.0': - dependencies: - '@sentry/core': 8.55.0 - - '@sentry-internal/replay-canvas@8.55.0': - dependencies: - '@sentry-internal/replay': 8.55.0 - '@sentry/core': 8.55.0 - - '@sentry-internal/replay@8.55.0': - dependencies: - '@sentry-internal/browser-utils': 8.55.0 - '@sentry/core': 8.55.0 - - '@sentry/babel-plugin-component-annotate@2.22.6': {} - - '@sentry/browser@8.55.0': - dependencies: - '@sentry-internal/browser-utils': 8.55.0 - '@sentry-internal/feedback': 8.55.0 - '@sentry-internal/replay': 8.55.0 - '@sentry-internal/replay-canvas': 8.55.0 - '@sentry/core': 8.55.0 - - '@sentry/bundler-plugin-core@2.22.6(encoding@0.1.13)': - dependencies: - '@babel/core': 7.26.10 - '@sentry/babel-plugin-component-annotate': 2.22.6 - '@sentry/cli': 2.42.3(encoding@0.1.13) - dotenv: 16.4.7 - find-up: 5.0.0 - glob: 9.3.5 - magic-string: 0.30.8 - unplugin: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/cli-darwin@2.42.3': - optional: true - - '@sentry/cli-linux-arm64@2.42.3': - optional: true - - '@sentry/cli-linux-arm@2.42.3': - optional: true - - '@sentry/cli-linux-i686@2.42.3': - optional: true - - '@sentry/cli-linux-x64@2.42.3': - optional: true - - '@sentry/cli-win32-i686@2.42.3': - optional: true - - '@sentry/cli-win32-x64@2.42.3': - optional: true - - '@sentry/cli@2.42.3(encoding@0.1.13)': - dependencies: - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - optionalDependencies: - '@sentry/cli-darwin': 2.42.3 - '@sentry/cli-linux-arm': 2.42.3 - '@sentry/cli-linux-arm64': 2.42.3 - '@sentry/cli-linux-i686': 2.42.3 - '@sentry/cli-linux-x64': 2.42.3 - '@sentry/cli-win32-i686': 2.42.3 - '@sentry/cli-win32-x64': 2.42.3 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/core@8.55.0': {} - - '@sentry/node@8.55.0': - dependencies: - '@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/instrumentation-amqplib': 0.46.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.43.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.16.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fastify': 0.44.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.19.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.43.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.45.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.57.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.7.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.44.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.47.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.44.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.46.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.45.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.45.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-nestjs-core': 0.44.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis-4': 0.46.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.18.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.10.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - '@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.1 - transitivePeerDependencies: - - supports-color - - '@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)': - dependencies: - '@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/core': 8.55.0 - - '@sentry/svelte@8.55.0(svelte@4.2.19)': - dependencies: - '@sentry/browser': 8.55.0 - '@sentry/core': 8.55.0 - magic-string: 0.30.7 - svelte: 4.2.19 - - '@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.19.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(encoding@0.1.13)(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1))': - 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@4.2.19) - '@sentry/vite-plugin': 2.22.6(encoding@0.1.13) - '@sveltejs/kit': 2.19.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) - magic-string: 0.30.7 - magicast: 0.2.8 - sorcery: 1.0.0 - optionalDependencies: - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) - transitivePeerDependencies: - - '@opentelemetry/api' - - '@opentelemetry/context-async-hooks' - - '@opentelemetry/core' - - '@opentelemetry/instrumentation' - - '@opentelemetry/sdk-trace-base' - - '@opentelemetry/semantic-conventions' - - encoding - - supports-color - - svelte - - '@sentry/vite-plugin@2.22.6(encoding@0.1.13)': - dependencies: - '@sentry/bundler-plugin-core': 2.22.6(encoding@0.1.13) - unplugin: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - '@sinclair/typebox@0.27.8': {} - '@sveltejs/adapter-node@4.0.1(@sveltejs/kit@2.19.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))': + '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': dependencies: - '@rollup/plugin-commonjs': 25.0.8(rollup@4.35.0) + acorn: 8.14.1 + + '@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)))(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)))': + dependencies: + '@rollup/plugin-commonjs': 28.0.3(rollup@4.35.0) '@rollup/plugin-json': 6.1.0(rollup@4.35.0) - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.35.0) - '@sveltejs/kit': 2.19.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.35.0) + '@sveltejs/kit': 2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)))(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) rollup: 4.35.0 - '@sveltejs/enhanced-img@0.1.9(rollup@4.35.0)(svelte@4.2.19)': + '@sveltejs/enhanced-img@0.4.4(rollup@4.35.0)(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0))': dependencies: magic-string: 0.30.17 - svelte-parse-markup: 0.1.5(svelte@4.2.19) - vite-imagetools: 6.2.9(rollup@4.35.0) + sharp: 0.33.5 + svelte: 5.25.6 + svelte-parse-markup: 0.1.5(svelte@5.25.6) + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) + vite-imagetools: 7.0.5(rollup@4.35.0) + zimmerframe: 1.1.2 transitivePeerDependencies: - rollup - - svelte - '@sveltejs/kit@2.19.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1))': + '@sveltejs/kit@2.20.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)))(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -6057,29 +4888,28 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.1 - svelte: 4.2.19 - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) + svelte: 5.25.6 + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)))(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) debug: 4.4.0 - svelte: 4.2.19 - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) + svelte: 5.25.6 + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)))(svelte@4.2.19)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)))(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 4.2.19 - svelte-hmr: 0.16.0(svelte@4.2.19) - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) - vitefu: 0.2.5(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)) + svelte: 5.25.6 + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) + vitefu: 1.0.6(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) transitivePeerDependencies: - supports-color @@ -6087,57 +4917,67 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/oxide-android-arm64@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.0.0-alpha.17': - optional: true - - '@tailwindcss/oxide@4.0.0-alpha.17': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.0.0-alpha.17 - '@tailwindcss/oxide-darwin-arm64': 4.0.0-alpha.17 - '@tailwindcss/oxide-darwin-x64': 4.0.0-alpha.17 - '@tailwindcss/oxide-freebsd-x64': 4.0.0-alpha.17 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.0-alpha.17 - '@tailwindcss/oxide-linux-arm64-gnu': 4.0.0-alpha.17 - '@tailwindcss/oxide-linux-arm64-musl': 4.0.0-alpha.17 - '@tailwindcss/oxide-linux-x64-gnu': 4.0.0-alpha.17 - '@tailwindcss/oxide-linux-x64-musl': 4.0.0-alpha.17 - '@tailwindcss/oxide-win32-x64-msvc': 4.0.0-alpha.17 - - '@tailwindcss/postcss@4.0.0-alpha.17(postcss@8.5.3)': + '@tailwindcss/node@4.1.2': dependencies: - '@tailwindcss/oxide': 4.0.0-alpha.17 + enhanced-resolve: 5.18.1 + jiti: 2.4.2 lightningcss: 1.29.2 - postcss-import: 16.1.0(postcss@8.5.3) - tailwindcss: 4.0.0-alpha.17 - transitivePeerDependencies: - - postcss + tailwindcss: 4.1.2 + + '@tailwindcss/oxide-android-arm64@4.1.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.2': + optional: true + + '@tailwindcss/oxide@4.1.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.2 + '@tailwindcss/oxide-darwin-arm64': 4.1.2 + '@tailwindcss/oxide-darwin-x64': 4.1.2 + '@tailwindcss/oxide-freebsd-x64': 4.1.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.2 + '@tailwindcss/oxide-linux-x64-musl': 4.1.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.2 + + '@tailwindcss/postcss@4.1.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.2 + '@tailwindcss/oxide': 4.1.2 + postcss: 8.5.3 + tailwindcss: 4.1.2 '@tokenizer/token@0.3.0': {} @@ -6166,10 +5006,6 @@ snapshots: dependencies: '@types/express': 5.0.0 - '@types/connect@3.4.36': - dependencies: - '@types/node': 22.13.10 - '@types/connect@3.4.38': dependencies: '@types/node': 22.13.10 @@ -6234,28 +5070,12 @@ snapshots: dependencies: '@types/node': 22.13.10 - '@types/mysql@2.15.26': - dependencies: - '@types/node': 22.13.10 - '@types/node@16.9.1': {} '@types/node@22.13.10': dependencies: undici-types: 6.20.0 - '@types/pg-pool@2.0.6': - dependencies: - '@types/pg': 8.6.1 - - '@types/pg@8.6.1': - dependencies: - '@types/node': 22.13.10 - pg-protocol: 1.8.0 - pg-types: 2.2.0 - - '@types/pug@2.0.10': {} - '@types/qs@6.9.18': {} '@types/range-parser@1.2.7': {} @@ -6273,21 +5093,15 @@ snapshots: '@types/node': 22.13.10 '@types/send': 0.17.4 - '@types/shimmer@1.2.0': {} - - '@types/tedious@4.0.14': - dependencies: - '@types/node': 22.13.10 - - '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) '@typescript-eslint/scope-manager': 8.26.1 - '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2) + '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.26.1 - eslint: 9.22.0(jiti@1.21.7) + eslint: 9.22.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -6296,14 +5110,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2)': + '@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@typescript-eslint/scope-manager': 8.26.1 '@typescript-eslint/types': 8.26.1 '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.26.1 debug: 4.4.0 - eslint: 9.22.0(jiti@1.21.7) + eslint: 9.22.0(jiti@2.4.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -6313,12 +5127,12 @@ snapshots: '@typescript-eslint/types': 8.26.1 '@typescript-eslint/visitor-keys': 8.26.1 - '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) debug: 4.4.0 - eslint: 9.22.0(jiti@1.21.7) + eslint: 9.22.0(jiti@2.4.2) ts-api-utils: 2.0.1(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: @@ -6340,13 +5154,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2)': + '@typescript-eslint/utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.26.1 '@typescript-eslint/types': 8.26.1 '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) - eslint: 9.22.0(jiti@1.21.7) + eslint: 9.22.0(jiti@2.4.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -6356,34 +5170,45 @@ snapshots: '@typescript-eslint/types': 8.26.1 eslint-visitor-keys: 4.2.0 - '@vitest/expect@1.6.1': + '@vitest/expect@3.1.1': dependencies: - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - chai: 4.5.0 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 + chai: 5.2.0 + tinyrainbow: 2.0.0 - '@vitest/runner@1.6.1': + '@vitest/mocker@3.1.1(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0))': dependencies: - '@vitest/utils': 1.6.1 - p-limit: 5.0.0 - pathe: 1.1.2 - - '@vitest/snapshot@1.6.1': - dependencies: - magic-string: 0.30.17 - pathe: 1.1.2 - pretty-format: 29.7.0 - - '@vitest/spy@1.6.1': - dependencies: - tinyspy: 2.2.1 - - '@vitest/utils@1.6.1': - dependencies: - diff-sequences: 29.6.3 + '@vitest/spy': 3.1.1 estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) + + '@vitest/pretty-format@3.1.1': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.1.1': + dependencies: + '@vitest/utils': 3.1.1 + pathe: 2.0.3 + + '@vitest/snapshot@3.1.1': + dependencies: + '@vitest/pretty-format': 3.1.1 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.1.1': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@3.1.1': + dependencies: + '@vitest/pretty-format': 3.1.1 + loupe: 3.1.3 + tinyrainbow: 2.0.0 '@xmldom/xmldom@0.7.13': {} @@ -6393,18 +5218,10 @@ snapshots: dependencies: event-target-shim: 5.0.1 - acorn-import-attributes@1.9.5(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.1 - acorn@8.14.1: {} agent-base@6.0.2: @@ -6460,11 +5277,6 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - aproba@2.0.0: {} are-we-there-yet@3.0.1: @@ -6478,11 +5290,7 @@ snapshots: array-union@2.1.0: {} - assertion-error@1.1.0: {} - - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 + assertion-error@2.0.1: {} async@3.2.6: {} @@ -6498,6 +5306,8 @@ snapshots: toml-eslint-parser: 0.10.0 yaml-eslint-parser: 1.3.0 + axe-core@4.9.1: {} + axios@1.8.3: dependencies: follow-redirects: 1.15.9 @@ -6512,12 +5322,21 @@ snapshots: base64-js@1.5.1: {} - binary-extensions@2.3.0: {} - bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 + bits-ui@1.3.19(svelte@5.25.6): + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/dom': 1.6.13 + '@internationalized/date': 3.8.0 + esm-env: 1.2.2 + runed: 0.23.4(svelte@5.25.6) + svelte: 5.25.6 + svelte-toolbelt: 0.7.1(svelte@5.25.6) + tabbable: 6.2.0 + bmp-js@0.1.0: {} boolbase@1.0.0: {} @@ -6535,15 +5354,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.4: - dependencies: - caniuse-lite: 1.0.30001704 - electron-to-chromium: 1.5.116 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) - - buffer-crc32@1.0.0: {} - buffer-equal@0.0.1: {} buffer@5.7.1: @@ -6592,32 +5402,26 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001704: {} - centra@2.7.0: dependencies: follow-redirects: 1.15.9 transitivePeerDependencies: - debug - chai@4.5.0: + chai@5.2.0: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + check-error@2.1.1: {} cheerio-select@2.1.0: dependencies: @@ -6642,26 +5446,12 @@ snapshots: undici: 6.21.2 whatwg-mimetype: 4.0.0 - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 chownr@2.0.0: {} - cjs-module-lexer@1.4.3: {} - class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -6686,14 +5476,6 @@ snapshots: clsx@2.1.1: {} - code-red@1.0.4: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 - acorn: 8.14.1 - estree-walker: 3.0.3 - periscopic: 3.1.0 - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -6728,12 +5510,8 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.8: {} - console-control-strings@1.1.0: {} - convert-source-map@2.0.0: {} - cookie-es@1.2.2: {} cookie@0.6.0: {} @@ -6792,9 +5570,7 @@ snapshots: dependencies: ms: 2.1.3 - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -6821,8 +5597,6 @@ snapshots: destr@2.0.3: {} - detect-indent@6.1.0: {} - detect-libc@1.0.3: optional: true @@ -6860,8 +5634,6 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv@16.4.7: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -6874,8 +5646,6 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.116: {} - embla-carousel-auto-scroll@8.5.2(embla-carousel@8.5.2): dependencies: embla-carousel: 8.5.2 @@ -6884,11 +5654,11 @@ snapshots: dependencies: embla-carousel: 8.5.2 - embla-carousel-svelte@8.5.2(svelte@4.2.19): + embla-carousel-svelte@8.5.2(svelte@5.25.6): dependencies: embla-carousel: 8.5.2 embla-carousel-reactive-utils: 8.5.2(embla-carousel@8.5.2) - svelte: 4.2.19 + svelte: 5.25.6 embla-carousel-wheel-gestures@8.0.1(embla-carousel@8.5.2): dependencies: @@ -6915,6 +5685,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + entities@4.5.0: {} env-paths@2.2.1: {} @@ -6938,53 +5713,53 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es6-promise@3.3.1: {} - - esbuild@0.21.5: + esbuild@0.25.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@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 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.22.0(jiti@1.21.7)): + eslint-compat-utils@0.5.1(eslint@9.22.0(jiti@2.4.2)): dependencies: - eslint: 9.22.0(jiti@1.21.7) + eslint: 9.22.0(jiti@2.4.2) semver: 7.7.1 - eslint-config-prettier@9.1.0(eslint@9.22.0(jiti@1.21.7)): + eslint-config-prettier@9.1.0(eslint@9.22.0(jiti@2.4.2)): dependencies: - eslint: 9.22.0(jiti@1.21.7) + eslint: 9.22.0(jiti@2.4.2) - eslint-plugin-svelte@2.46.1(eslint@9.22.0(jiti@1.21.7))(svelte@4.2.19): + eslint-plugin-svelte@2.46.1(eslint@9.22.0(jiti@2.4.2))(svelte@5.25.6): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@2.4.2)) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.22.0(jiti@1.21.7) - eslint-compat-utils: 0.5.1(eslint@9.22.0(jiti@1.21.7)) + eslint: 9.22.0(jiti@2.4.2) + eslint-compat-utils: 0.5.1(eslint@9.22.0(jiti@2.4.2)) esutils: 2.0.3 known-css-properties: 0.35.0 postcss: 8.5.3 @@ -6992,9 +5767,9 @@ snapshots: postcss-safe-parser: 6.0.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 semver: 7.7.1 - svelte-eslint-parser: 0.43.0(svelte@4.2.19) + svelte-eslint-parser: 0.43.0(svelte@5.25.6) optionalDependencies: - svelte: 4.2.19 + svelte: 5.25.6 transitivePeerDependencies: - ts-node @@ -7012,9 +5787,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.22.0(jiti@1.21.7): + eslint@9.22.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 '@eslint/config-helpers': 0.1.0 @@ -7050,7 +5825,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.7 + jiti: 2.4.2 transitivePeerDependencies: - supports-color @@ -7068,12 +5843,14 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - esquery@1.6.0: dependencies: estraverse: 5.3.0 + esrap@1.4.6: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -7092,20 +5869,10 @@ snapshots: events@3.3.0: {} - execa@8.0.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - exif-parser@0.1.12: {} + expect-type@1.2.1: {} + exponential-backoff@3.1.2: {} fast-deep-equal@3.1.3: {} @@ -7126,6 +5893,10 @@ snapshots: dependencies: reusify: 1.1.0 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fflate@0.4.8: {} file-entry-cache@8.0.0: @@ -7178,8 +5949,6 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - forwarded-parse@2.1.2: {} - fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 @@ -7213,12 +5982,8 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - get-func-name@2.0.2: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7237,8 +6002,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@8.0.1: {} - gifwrap@0.9.4: dependencies: image-q: 4.0.0 @@ -7278,26 +6041,15 @@ snapshots: minimatch: 5.1.6 once: 1.4.0 - glob@9.3.5: - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.11.1 - global@4.4.0: dependencies: min-document: 2.19.0 process: 0.11.10 - globals@11.12.0: {} - globals@14.0.0: {} globals@15.15.0: {} - globalyzer@0.1.0: {} - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -7307,8 +6059,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globrex@0.1.2: {} - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -7373,8 +6123,6 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@5.0.0: {} - humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -7393,9 +6141,7 @@ snapshots: image2uri@1.0.5: {} - imagetools-core@6.0.4: - dependencies: - sharp: 0.33.5 + imagetools-core@7.0.2: {} immutable@5.0.3: {} @@ -7404,13 +6150,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.13.1: - dependencies: - 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 - import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} @@ -7428,6 +6167,8 @@ snapshots: ini@5.0.0: {} + inline-style-parser@0.2.4: {} + ip-address@9.0.5: dependencies: jsbn: 1.1.0 @@ -7437,10 +6178,6 @@ snapshots: is-arrayish@0.3.2: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -7473,8 +6210,6 @@ snapshots: dependencies: '@types/estree': 1.0.6 - is-stream@3.0.0: {} - isarray@1.0.0: {} isexe@2.0.0: {} @@ -7492,6 +6227,29 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jest-axe@9.0.0: + dependencies: + axe-core: 4.9.1 + chalk: 4.1.2 + jest-matcher-utils: 29.2.2 + lodash.merge: 4.6.2 + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.2.2: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jimp@0.16.13: dependencies: '@babel/runtime': 7.26.10 @@ -7504,28 +6262,22 @@ snapshots: jiti@1.21.7: {} + jiti@2.4.2: {} + jpeg-js@0.4.4: {} - js-tokens@4.0.0: {} - - js-tokens@9.0.1: {} - js-yaml@4.1.0: dependencies: argparse: 2.0.1 jsbn@1.1.0: {} - jsesc@3.1.0: {} - json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} - json5@2.2.3: {} - jsonc-eslint-parser@2.4.0: dependencies: acorn: 8.14.1 @@ -7618,11 +6370,6 @@ snapshots: transitivePeerDependencies: - debug - local-pkg@0.5.1: - dependencies: - mlly: 1.7.4 - pkg-types: 1.3.1 - locate-character@3.0.0: {} locate-path@6.0.0: @@ -7633,38 +6380,18 @@ snapshots: lodash@4.17.21: {} - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 + loupe@3.1.3: {} - lovely-logs@1.2.2: {} + lovely-logs@2.6.0: {} lru-cache@10.4.3: {} - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - lru-cache@7.18.3: {} magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.7: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magic-string@0.30.8: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magicast@0.2.8: - dependencies: - '@babel/parser': 7.26.10 - '@babel/types': 7.26.10 - recast: 0.23.11 - make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.6.0 @@ -7721,7 +6448,14 @@ snapshots: transitivePeerDependencies: - encoding - merge-stream@2.0.0: {} + melt@0.29.2(@floating-ui/dom@1.6.13)(svelte@5.25.6): + dependencies: + '@floating-ui/dom': 1.6.13 + dequal: 2.0.3 + jest-axe: 9.0.0 + nanoid: 5.1.3 + runed: 0.23.4(svelte@5.25.6) + svelte: 5.25.6 merge2@1.4.1: {} @@ -7740,14 +6474,10 @@ snapshots: mime@1.6.0: {} - mimic-fn@4.0.0: {} - min-document@2.19.0: dependencies: dom-walk: 0.1.2 - min-indent@1.0.1: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -7756,10 +6486,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@8.0.4: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -7794,8 +6520,6 @@ snapshots: dependencies: yallist: 4.0.0 - minipass@4.2.8: {} - minipass@5.0.0: {} minipass@7.1.2: {} @@ -7811,15 +6535,6 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.7.4: - dependencies: - acorn: 8.14.1 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.5.4 - - module-details-from-path@1.0.3: {} - motion@10.18.0: dependencies: '@motionone/animation': 10.18.0 @@ -7886,22 +6601,14 @@ snapshots: node-mock-http@1.0.0: {} - node-releases@2.0.19: {} - noop2@2.0.0: {} nopt@6.0.0: dependencies: abbrev: 1.1.1 - normalize-path@3.0.0: {} - normalize.css@8.0.1: {} - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 @@ -7925,10 +6632,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - openapi-types@12.1.3: {} optionator@0.9.4: @@ -7977,10 +6680,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.2.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -8027,8 +6726,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-scurry@1.11.1: @@ -8042,28 +6739,10 @@ snapshots: pathe@2.0.3: {} - pathval@1.1.1: {} + pathval@2.0.0: {} peek-readable@4.1.0: {} - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.3 - - pg-int8@1.0.1: {} - - pg-protocol@1.8.0: {} - - pg-types@2.2.0: - dependencies: - pg-int8: 1.0.1 - postgres-array: 2.0.0 - postgres-bytea: 1.0.0 - postgres-date: 1.0.7 - postgres-interval: 1.2.0 - phin@2.9.3: {} phin@3.7.1: @@ -8078,8 +6757,6 @@ snapshots: picomatch@4.0.2: {} - pify@2.3.0: {} - pirates@4.0.6: {} piscina@4.8.0: @@ -8090,12 +6767,6 @@ snapshots: dependencies: pngjs: 3.4.0 - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - plausible-tracker@0.3.9: {} playwright-core@1.51.0: {} @@ -8108,13 +6779,6 @@ snapshots: pngjs@3.4.0: {} - postcss-import@16.1.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.10 - postcss-load-config@3.1.4(postcss@8.5.3): dependencies: lilconfig: 2.1.0 @@ -8135,24 +6799,12 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} - postcss@8.5.3: dependencies: nanoid: 3.3.9 picocolors: 1.1.1 source-map-js: 1.2.1 - postgres-array@2.0.0: {} - - postgres-bytea@1.0.0: {} - - postgres-date@1.0.7: {} - - postgres-interval@1.2.0: - dependencies: - xtend: 4.0.2 - posthog-js@1.230.4: dependencies: core-js: 3.41.0 @@ -8170,16 +6822,16 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@4.2.19): + prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.6): dependencies: prettier: 3.5.3 - svelte: 4.2.19 + svelte: 5.25.6 - prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@4.2.19))(prettier@3.5.3): + prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.6))(prettier@3.5.3): dependencies: prettier: 3.5.3 optionalDependencies: - prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@4.2.19) + prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@5.25.6) prettier@3.5.3: {} @@ -8193,8 +6845,6 @@ snapshots: process@0.11.10: {} - progress@2.0.3: {} - promise-inflight@1.0.1: {} promise-retry@2.0.1: @@ -8219,10 +6869,6 @@ snapshots: react-is@18.3.1: {} - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -8257,14 +6903,6 @@ snapshots: readdirp@4.1.2: {} - recast@0.23.11: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - regenerator-runtime@0.13.11: {} regenerator-runtime@0.14.1: {} @@ -8273,15 +6911,9 @@ snapshots: dependencies: type-fest: 4.37.0 - require-directory@2.1.1: {} + reodotdev@1.0.0: {} - require-in-the-middle@7.5.2: - dependencies: - debug: 4.4.0 - module-details-from-path: 1.0.3 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color + require-directory@2.1.1: {} resolve-from@4.0.0: {} @@ -8295,10 +6927,6 @@ snapshots: reusify@1.1.0: {} - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -8332,6 +6960,11 @@ snapshots: dependencies: queue-microtask: 1.2.3 + runed@0.23.4(svelte@5.25.6): + dependencies: + esm-env: 1.2.2 + svelte: 5.25.6 + sade@1.8.1: dependencies: mri: 1.2.0 @@ -8342,13 +6975,6 @@ snapshots: safer-buffer@2.1.2: {} - sander@0.5.1: - dependencies: - es6-promise: 3.3.1 - graceful-fs: 4.2.11 - mkdirp: 0.5.6 - rimraf: 2.7.1 - sass@1.85.1: dependencies: chokidar: 4.0.3 @@ -8359,8 +6985,6 @@ snapshots: sax@1.4.1: {} - semver@6.3.1: {} - semver@7.7.1: {} set-blocking@2.0.0: {} @@ -8399,8 +7023,6 @@ snapshots: shebang-regex@3.0.0: {} - shimmer@1.2.1: {} - siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -8434,23 +7056,8 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 - sorcery@0.11.1: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - buffer-crc32: 1.0.0 - minimist: 1.2.8 - sander: 0.5.1 - - sorcery@1.0.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - minimist: 1.2.8 - tiny-glob: 0.2.9 - source-map-js@1.2.1: {} - source-map@0.6.1: {} - split2@1.1.1: dependencies: through2: 2.0.5 @@ -8493,23 +7100,17 @@ snapshots: dependencies: ansi-regex: 6.1.0 - strip-final-newline@3.0.0: {} - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@3.1.1: {} - strip-literal@2.1.1: - dependencies: - js-tokens: 9.0.1 - strtok3@6.3.0: dependencies: '@tokenizer/token': 0.3.0 peek-readable: 4.1.0 + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -8526,27 +7127,19 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.8.6(@babel/core@7.26.10)(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(sass@1.85.1)(svelte@4.2.19): + svelte-check@4.1.5(picomatch@4.0.2)(svelte@5.25.6)(typescript@5.8.2): dependencies: '@jridgewell/trace-mapping': 0.3.25 - chokidar: 3.6.0 + chokidar: 4.0.3 + fdir: 6.4.3(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 4.2.19 - svelte-preprocess: 5.1.4(@babel/core@7.26.10)(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(sass@1.85.1)(svelte@4.2.19)(typescript@5.8.2) + svelte: 5.25.6 typescript: 5.8.2 transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss + - picomatch - svelte-eslint-parser@0.43.0(svelte@4.2.19): + svelte-eslint-parser@0.43.0(svelte@5.25.6): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -8554,65 +7147,54 @@ snapshots: postcss: 8.5.3 postcss-scss: 4.0.9(postcss@8.5.3) optionalDependencies: - svelte: 4.2.19 + svelte: 5.25.6 - svelte-hmr@0.16.0(svelte@4.2.19): + svelte-markdoc-preprocess@3.0.0: dependencies: - svelte: 4.2.19 - - svelte-markdoc-preprocess@2.1.0: - dependencies: - '@markdoc/markdoc': 0.4.0 + '@markdoc/markdoc': 0.5.1 + estree-walker: 3.0.3 html-escaper: 3.0.3 js-yaml: 4.1.0 - lovely-logs: 1.2.2 - svelte: 4.2.19 + lovely-logs: 2.6.0 + svelte: 5.25.6 typescript: 5.8.2 transitivePeerDependencies: - '@types/react' - react - svelte-markdown@0.4.1(svelte@4.2.19): + svelte-markdown@0.4.1(svelte@5.25.6): dependencies: '@types/marked': 5.0.2 marked: 5.1.2 - svelte: 4.2.19 + svelte: 5.25.6 - svelte-parse-markup@0.1.5(svelte@4.2.19): + svelte-parse-markup@0.1.5(svelte@5.25.6): dependencies: - svelte: 4.2.19 + svelte: 5.25.6 - svelte-preprocess@5.1.4(@babel/core@7.26.10)(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(sass@1.85.1)(svelte@4.2.19)(typescript@5.8.2): + svelte-toolbelt@0.7.1(svelte@5.25.6): dependencies: - '@types/pug': 2.0.10 - detect-indent: 6.1.0 - magic-string: 0.30.17 - sorcery: 0.11.1 - strip-indent: 3.0.0 - svelte: 4.2.19 - optionalDependencies: - '@babel/core': 7.26.10 - postcss: 8.5.3 - postcss-load-config: 3.1.4(postcss@8.5.3) - sass: 1.85.1 - typescript: 5.8.2 + clsx: 2.1.1 + runed: 0.23.4(svelte@5.25.6) + style-to-object: 1.0.8 + svelte: 5.25.6 - svelte@4.2.19: + svelte@5.25.6: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) '@types/estree': 1.0.6 acorn: 8.14.1 aria-query: 5.3.2 axobject-query: 4.1.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 1.4.6 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 - periscopic: 3.1.0 + zimmerframe: 1.1.2 svg-pathdata@6.0.3: {} @@ -8668,9 +7250,11 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@2.6.0: {} + tailwind-merge@3.0.2: {} - tailwindcss@4.0.0-alpha.17: {} + tailwindcss@4.1.2: {} + + tapable@2.2.1: {} tar@6.2.1: dependencies: @@ -8698,20 +7282,17 @@ snapshots: timm@1.7.1: {} - tiny-glob@0.2.9: - dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - - tiny-invariant@1.3.3: {} - tinybench@2.9.0: {} tinycolor2@1.6.0: {} - tinypool@0.8.4: {} + tinyexec@0.3.2: {} - tinyspy@2.2.1: {} + tinypool@1.0.2: {} + + tinyrainbow@2.0.0: {} + + tinyspy@3.0.2: {} to-regex-range@5.0.1: dependencies: @@ -8761,16 +7342,14 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.1.0: {} - type-fest@4.37.0: {} - typescript-eslint@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2): + typescript-eslint@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2) - '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2) - eslint: 9.22.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + eslint: 9.22.0(jiti@2.4.2) typescript: 5.8.2 transitivePeerDependencies: - supports-color @@ -8797,19 +7376,6 @@ snapshots: universalify@2.0.1: {} - unplugin@1.0.1: - dependencies: - acorn: 8.14.1 - chokidar: 3.6.0 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.5.0 - - update-browserslist-db@1.1.3(browserslist@4.24.4): - dependencies: - browserslist: 4.24.4 - escalade: 3.2.0 - picocolors: 1.1.1 - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -8822,22 +7388,24 @@ snapshots: validator@13.12.0: {} - vite-imagetools@6.2.9(rollup@4.35.0): + vite-imagetools@7.0.5(rollup@4.35.0): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.35.0) - imagetools-core: 6.0.4 + imagetools-core: 7.0.2 + sharp: 0.33.5 transitivePeerDependencies: - rollup - vite-node@1.6.1(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1): + vite-node@3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 - pathe: 1.1.2 - picocolors: 1.1.1 - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -8846,6 +7414,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml vite-plugin-dynamic-import@1.6.0: dependencies: @@ -8854,71 +7424,73 @@ snapshots: fast-glob: 3.3.3 magic-string: 0.30.17 - vite-plugin-image-optimizer@1.1.8(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)): + vite-plugin-image-optimizer@1.1.8(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)): dependencies: ansi-colors: 4.1.3 pathe: 1.1.2 - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) vite-plugin-manifest-sri@0.2.0: {} - vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1): + vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0): dependencies: - esbuild: 0.21.5 + esbuild: 0.25.2 postcss: 8.5.3 rollup: 4.35.0 optionalDependencies: '@types/node': 22.13.10 fsevents: 2.3.3 + jiti: 2.4.2 lightningcss: 1.29.2 sass: 1.85.1 + yaml: 2.7.0 - vitefu@0.2.5(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)): + vitefu@1.0.6(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)): optionalDependencies: - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) - vitest@1.6.1(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1): + vitest@3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0): dependencies: - '@vitest/expect': 1.6.1 - '@vitest/runner': 1.6.1 - '@vitest/snapshot': 1.6.1 - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - acorn-walk: 8.3.4 - chai: 4.5.0 + '@vitest/expect': 3.1.1 + '@vitest/mocker': 3.1.1(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) + '@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 + chai: 5.2.0 debug: 4.4.0 - execa: 8.0.1 - local-pkg: 0.5.1 + expect-type: 1.2.1 magic-string: 0.30.17 - pathe: 1.1.2 - picocolors: 1.1.1 + pathe: 2.0.3 std-env: 3.8.1 - strip-literal: 2.1.1 tinybench: 2.9.0 - tinypool: 0.8.4 - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) - vite-node: 1.6.1(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1) + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) + vite-node: 3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.10 transitivePeerDependencies: + - jiti - less - lightningcss + - msw - sass - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml web-vitals@4.2.4: {} webidl-conversions@3.0.1: {} - webpack-sources@3.2.3: {} - - webpack-virtual-modules@0.5.0: {} - whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -8981,8 +7553,6 @@ snapshots: y18n@5.0.8: {} - yallist@3.1.1: {} - yallist@4.0.0: {} yaml-eslint-parser@1.3.0: @@ -9020,4 +7590,4 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.0: {} + zimmerframe@1.1.2: {} diff --git a/server/main.js b/server/main.js index 1fb7bf9b1..e3842985a 100644 --- a/server/main.js +++ b/server/main.js @@ -1,12 +1,13 @@ -import { createApp, fromNodeMiddleware, toNodeListener } from 'h3'; +import { sitemaps } from './sitemap.js'; import { createServer } from 'node:http'; import { handler } from '../build/handler.js'; -import { sitemap } from './sitemap.js'; +import { createApp, fromNodeMiddleware, toNodeListener } from 'h3'; async function main() { const port = process.env.PORT || 3000; const app = createApp(); - app.use('/sitemap.xml', await sitemap()); + app.use(['/sitemap.xml', '/sitemaps'], await sitemaps()); + app.use(fromNodeMiddleware(handler)); const server = createServer(toNodeListener(app)).listen(port); server.addListener('listening', () => { diff --git a/server/sitemap.js b/server/sitemap.js index affaef02b..5d4f7686f 100644 --- a/server/sitemap.js +++ b/server/sitemap.js @@ -1,59 +1,154 @@ +import { fileURLToPath } from 'node:url'; import { createRequire } from 'node:module'; -import { defineEventHandler, setResponseHeader } from 'h3'; +import { dirname, join } from 'node:path'; +import { readFile, stat } from 'node:fs/promises'; +import { mkdirSync, writeFileSync } from 'node:fs'; +import { + defineEventHandler, + getRequestURL, + sendRedirect, + serveStatic, + setResponseHeader +} from 'h3'; -/** - * @returns {Promise} - */ -export async function sitemap() { +const MAX_THREADS_PER_FILE = 1000; +const BASE_URL = 'https://appwrite.io'; +const BASE_DIR = dirname(fileURLToPath(import.meta.url)); + +const SITEMAP_DIR = join(BASE_DIR, './sitemaps'); +const THREADS_DIR = join(SITEMAP_DIR, 'threads'); +const NAMED_GROUPS = { + blog: '/blog', + docs: '/docs', + integrations: '/integrations' +}; + +export async function sitemaps() { console.info('Preparing Sitemap...'); const { manifest } = await import('../build/server/manifest.js'); - const sveltekit_routes = manifest._.routes - .filter((route) => route.params.length === 0) - .map((route) => route.id); - const threads = collectThreads(); - const all_routes = [...sveltekit_routes, ...threads]; - const document_routes = all_routes.filter( - (route) => !['.json', '.xml'].some((ext) => route.endsWith(ext)) - ); - const routes = new Set(document_routes); - console.info(`Sitemap loaded with ${routes.length} routes!`); - console.group(); - console.info(`sveltekit: ${sveltekit_routes.length}`); - console.info(`threads: ${threads.length}`); - console.groupEnd(); + const threads = collectThreads().map((id) => `/threads/${id}`); + const otherRoutes = manifest._.routes + .filter((r) => r.params.length === 0) + .map((r) => r.id) + .filter( + (id) => !id.startsWith('/threads/') && !id.endsWith('.json') && !id.endsWith('.xml') + ); - const sitemap = ` - - - ${[...routes] + mkdirSync(SITEMAP_DIR, { recursive: true }); + mkdirSync(THREADS_DIR, { recursive: true }); + + let totalCount = 0; + const sitemapIndexOrder = []; + + const grouped = {}, + fallback = []; + + for (const route of otherRoutes) { + const match = Object.entries(NAMED_GROUPS).find(([, prefix]) => route.startsWith(prefix)); + if (match) { + const [group] = match; + grouped[group] ??= []; + grouped[group].push(route); + } else fallback.push(route); + } + + totalCount += writeSitemap('pages.xml', fallback, SITEMAP_DIR); + sitemapIndexOrder.push('pages.xml'); + + for (const group of ['docs', 'blog', 'integrations']) { + if (grouped[group]?.length) { + const filename = `${group}.xml`; + totalCount += writeSitemap(filename, grouped[group], SITEMAP_DIR); + sitemapIndexOrder.push(filename); + } + } + + const threadChunks = chunkArray(threads, MAX_THREADS_PER_FILE); + threadChunks.forEach((chunk, i) => { + const filename = `${i + 1}.xml`; + totalCount += writeSitemap(filename, chunk, THREADS_DIR); + sitemapIndexOrder.push(`threads/${filename}`); + }); + + const sitemapIndex = ` + + + ${sitemapIndexOrder .map( - (route) => ` - https://appwrite.io${route} - - ` + (name) => ` + + ${BASE_URL}/sitemaps/${name} + ` ) - .join('')} - `.trim(); + .join('\n')} + `.trim(); - return defineEventHandler((event) => { - setResponseHeader(event, 'Content-Type', 'application/xml'); + console.info(`✅ Sitemap generation complete — ${totalCount} URLs in total.\n`); - return sitemap; + return defineEventHandler(async (event) => { + const url = getRequestURL(event); + + if (url.pathname === '/sitemap.xml') { + setResponseHeader(event, 'Content-Type', 'application/xml'); + return sitemapIndex; + } + + if (url.pathname === '/sitemaps') { + return sendRedirect(event, '/sitemap.xml', 307); + } + + if (url.pathname === '/sitemaps/threads') { + return sendRedirect(event, '/sitemaps/threads/1.xml', 307); + } + + const dir = import.meta.resolve('./sitemaps'); + return serveStatic(event, { + fallthrough: true, + indexNames: undefined, + getContents: (id) => readFile(new URL(dir + id)), + getMeta: async (id) => { + const stats = await stat(new URL(dir + id)).catch(() => null); + if (!stats?.isFile()) return; + return { + size: stats.size, + mtime: stats.mtimeMs + }; + } + }); }); } -/** - * @returns {string[]} - */ -function collectThreads() { - const threads = createRequire(import.meta.url)('../build/prerendered/threads/data.json'); +function writeSitemap(filename, routes, dir) { + const body = ` + + +${routes.map((route) => ` \n ${BASE_URL}${route}\n `).join('\n')} +`.trim(); - return threads.map((id) => `/threads/${id}`); + const filepath = join(dir, filename); + writeFileSync(filepath, body); + + const label = filepath.replace(BASE_DIR + '/sitemaps', ''); + console.info(` └── Generated ${label} with ${routes.length} URLs`); + + return routes.length; +} + +function chunkArray(arr, size) { + const chunks = []; + for (let i = 0; i < arr.length; i += size) { + chunks.push(arr.slice(i, i + size)); + } + return chunks; +} + +function collectThreads() { + return createRequire(import.meta.url)('../build/prerendered/threads/data.json'); } diff --git a/src/app.css b/src/app.css index c68546be9..8894d9876 100644 --- a/src/app.css +++ b/src/app.css @@ -1,4 +1,5 @@ @import 'tailwindcss'; +@import './styles/typography.css'; @variant dark (&:is(.dark *)); @theme { @@ -6,8 +7,13 @@ --color-*: initial; /* base */ - --color-primary: hsl(var(--color-primary)); - --color-secondary: hsl(var(--color-secondary)); + --color-black: #000; + --color-white: #fff; + --color-transparent: transparent; + + /* theme */ + --color-primary: var(--color-primary); + --color-secondary: var(--color-secondary); --color-accent: var(--color-secondary); --color-smooth: var(--color-smooth); @@ -18,9 +24,9 @@ --color-pink-700: hsl(var(--color-pink-hue) 65% 36%); /* red */ - --color-red-200: calc(hsl(var(--color-red-hue) - 2) 100% 92%); + --color-red-200: hsl(calc(var(--color-red-hue) - 2) 100% 92%); --color-red-500: hsl(var(--color-red-hue) 100% 61%); - --color-red-700: calc(hsl(var(--color-red-hue) - 3) 82% 39%); + --color-red-700: hsl(calc(var(--color-red-hue) - 3) 82% 39%); /* orange */ --color-orange-200: hsl(var(--color-orange-hue) 100% 88%); @@ -29,23 +35,23 @@ /* mint */ --color-mint-200: hsl(var(--color-mint-hue) 56% 88%); - --color-mint-500: calc(hsl(var(--color-mint-hue) + 1) 54% 69%); - --color-mint-700: calc(hsl(var(--color-mint-hue) + 2) 24% 41%); + --color-mint-500: hsl(calc(var(--color-mint-hue) + 1), 54%, 69%); + --color-mint-700: hsl(calc(var(--color-mint-hue) + 2), 24%, 41%); /* purple */ --color-purple-200: hsl(var(--color-purple-hue) 100% 88%); - --color-purple-500: calc(hsl(var(--color-purple-hue) - 1) 99% 70%); - --color-purple-700: calc(hsl(var(--color-purple-hue) - 1) 42% 42%); + --color-purple-500: hsl(calc(var(--color-purple-hue) - 1), 99%, 70%); + --color-purple-700: hsl(calc(var(--color-purple-hue) - 1), 42%, 42%); /* yellow */ --color-yellow-200: hsl(var(--color-yellow-hue) 100% 88%); --color-yellow-500: hsl(var(--color-yellow-hue) 99% 70%); - --color-yellow-700: calc(hsl(var(--color-yellow-hue) + 1) 42% 42%); + --color-yellow-700: hsl(calc(var(--color-yellow-hue) + 1), 42%, 42%); /* blue */ --color-blue-200: hsl(var(--color-blue-hue) 100% 88%); - --color-blue-500: calc(hsl(var(--color-blue-hue) - 1) 99% 70%); - --color-blue-700: calc(hsl(var(--color-blue-hue) - 1) 42% 42%); + --color-blue-500: hsl(calc(var(--color-blue-hue) - 1), 99%, 70%); + --color-blue-700: hsl(calc(var(--color-blue-hue) - 1), 42%, 42%); /* green */ --color-green-700: #0a714f; @@ -55,9 +61,6 @@ --color-accent-200: hsl(var(--color-secondary-hue), 78%, 60%, 0.32); /* greyscale */ - --color-white: hsl(0 0% 100%); - --color-black: hsl(0 0% 0%); - --color-transparent: rgba(0, 0, 0, 0); --color-offset: hsl(var(--color-greyscale-hue) 2%, 11%, 0.94); --color-greyscale-25: hsl(var(--color-greyscale-hue) 11% 98%); --color-greyscale-50: hsl(var(--color-greyscale-hue) 11% 94%); @@ -74,46 +77,21 @@ --color-greyscale-850: hsl(var(--color-greyscale-hue) 3% 14%); --color-greyscale-900: hsl(var(--color-greyscale-hue) 5.7% 10.4%); - /* utility colors */ - --color-badge-bg-light: #f2c8d6; - --color-badge-border-light: #f69db7; - --color-badge-bg-dark: #2c2c2f; - --color-badge-border-dark: #39393c; - /* Easings */ - --transition-timing-function-bounce: linear( - 0, - 0.063, - 0.25 18.2%, - 1 36.4%, - 0.813, - 0.75, - 0.813, - 1, - 0.938, - 1, - 1 - ); - --transition-timing-function-spring: linear( - 0, - 0.938 16.7%, - 1.149 24.3%, - 1.154 29.9%, - 0.977 51%, - 1 - ); + --easing-bounce: linear(0, 0.063, 0.25 18.2%, 1 36.4%, 0.813, 0.75, 0.813, 1, 0.938, 1, 1); + --easing-spring: linear(0, 0.938 16.7%, 1.149 24.3%, 1.154 29.9%, 0.977 51%, 1); /* Animations */ --animate-scale-in: scale-in 200ms ease-out forwards; --animate-caret-blink: caret-blink 1s ease-in-out infinite; - --animate-text: - fade 0.75s ease-in-out both, blur 0.75s ease-in-out both, up 0.75s ease-in-out both; + --animate-enter: + fade-in 0.75s ease-in-out both, blur 0.75s ease-in-out both, up 0.75s ease-in-out both; --animate-scroll: scroll 60s linear infinite; --animate-fade-in: fade-in 0.5s ease-in-out both; --animate-marquee: marquee var(--speed, 30s) linear infinite var(--direction, forwards); - - /* Pink polyfills */ - --transition: 0.2s; + --animate-lighting: lighting 1.25s ease-out forwards; + --animate-menu-in: menu-in 0.25s ease-out forwards; + --animate-menu-out: menu-out 0.25s ease-out forwards; /* Keyframes */ @keyframes scale-in { @@ -179,63 +157,157 @@ } } + @keyframes lighting { + 0% { + opacity: 0; + clip-path: inset(5%); + transform: scale(111.11%); + } + 100% { + opacity: 1; + clip-path: inset(0); + transform: scale(1); + } + } + + @keyframes menu-in { + 0% { + opacity: 0; + filter: blur(2px); + transform: translateY(8px); + } + 100% { + opacity: 1; + filter: blur(0px); + transform: translateY(0px); + } + } + + @keyframes menu-out { + 0% { + opacity: 1; + filter: blur(0px); + transform: translateY(0px); + } + 100% { + opacity: 0; + filter: blur(2px); + transform: translateY(8px); + } + } + /* Fonts */ - --font-family-sans: 'Inter', arial, sans-serif; - --font-family-mono: 'Fira Code', monospace; - --font-family-aeonik-fono: 'Aenoik Fono', monospace; - --font-family-aeonik-pro: 'Aeonik Pro', var(--font-family-sans); - --font-family-archia: 'Archia', arial, sans-serif; + --font-sans: 'Inter', arial, sans-serif; + --font-mono: 'Fira Code', monospace; + --font-aeonik-fono: 'Aenoik Fono', monospace; + --font-aeonik-pro: 'Aeonik Pro', var(--font-sans); + --font-archia: 'Archia', arial, sans-serif; /* Font sizes */ - --font-size-x-micro: 0.625rem; - --font-size-x-micro--line-height: 0.875rem; - --font-size-x-micro--letter-spacing: var(--letter-spacing-tighter); - --font-size-micro: 0.75rem; - --font-size-micro--line-height: 1rem; - --font-size-micro--letter-spacing: var(--letter-spacing-tighter); - --font-size-caption: 0.875rem; - --font-size-caption--line-height: 1.375rem; - --font-size-caption--letter-spacing: var(--letter-spacing-tight); - --font-size-sub-body: clamp(0.875rem, 2vw, 1rem); - --font-size-sub-body--line-height: 1.375rem; - --font-size-sub-body--letter-spacing: var(--letter-spacing-tight); - --font-size-body: clamp(1rem, 2.5vw, 1.125rem); - --font-size-body--line-height: clamp(1.375rem, 3vw, 1.625rem); - --font-size-body--letter-spacing: var(--letter-spacing-tight); - --font-size-paragraph-md: 1rem; - --font-size-paragraph-md--line-height: 1.625rem; - --font-size-paragraph-md--letter-spacing: var(--letter-spacing-tight); - --font-size-paragraph-lg: 1.125rem; - --font-size-paragraph-lg--line-height: 1.75rem; - --font-size-paragraph-lg--letter-spacing: var(--letter-spacing-tight); - --font-size-description: clamp(1.125rem, 3vw, 1.25rem); - --font-size-description--line-height: clamp(1.625rem, 3.5vw, 1.75rem); - --font-size-description--letter-spacing: var(--letter-spacing-tighter); - --font-size-label: 1.5rem; - --font-size-label--line-height: 1.75rem; - --font-size-title: clamp(2rem, 5vw, 2.5rem); - --font-size-title--line-height: clamp(2.125rem, 5.5vw, 2.75rem); - --font-size-title--letter-spacing: var(--letter-spacing-squeezed); - --font-size-display: clamp(3rem, 7vw, 4rem); - --font-size-display--line-height: clamp(3.125rem, 7.5vw, 4.25rem); - --font-size-display--letter-spacing: var(--letter-spacing-compressed); - --font-size-headline: clamp(3.5rem, 8vw, 5.5rem); - --font-size-headline--line-height: clamp(3.5rem, 8.5vw, 5.75rem); - --font-size-headline--letter-spacing: var(--letter-spacing-compressed); + --text-x-micro: 0.625rem; + --text-x-micro--line-height: 0.875rem; + --text-x-micro--letter-spacing: var(--tracking-tighter); + --text-micro: 0.75rem; + --text-micro--line-height: 1rem; + --text-micro--letter-spacing: var(--tracking-tighter); + --text-caption: 0.875rem; + --text-caption--line-height: 1.375rem; + --text-caption--letter-spacing: var(--tracking-tight); + --text-sub-body: clamp(0.875rem, 2vw, 1rem); + --text-sub-body--line-height: 1.375rem; + --text-sub-body--letter-spacing: var(--tracking-tight); + --text-body: clamp(1rem, 2.5vw, 1.125rem); + --text-body--line-height: clamp(1.375rem, 3vw, 1.625rem); + --text-body--letter-spacing: var(--tracking-tight); + --text-paragraph-md: 1rem; + --text-paragraph-md--line-height: 1.625rem; + --text-paragraph-md--letter-spacing: var(--tracking-tight); + --text-paragraph-lg: 1.125rem; + --text-paragraph-lg--line-height: 1.75rem; + --text-paragraph-lg--letter-spacing: var(--tracking-tight); + --text-description: clamp(1.125rem, 3vw, 1.25rem); + --text-description--line-height: clamp(1.625rem, 3.5vw, 1.75rem); + --text-description--letter-spacing: var(--tracking-tighter); + --text-label: 1.5rem; + --text-label--line-height: 1.75rem; + --text-title: clamp(2rem, 5vw, 2.5rem); + --text-title--line-height: clamp(2.125rem, 5.5vw, 2.75rem); + --text-title--letter-spacing: var(--tracking-squeezed); + --text-display: clamp(3rem, 7vw, 4rem); + --text-display--line-height: clamp(3.125rem, 7.5vw, 4.25rem); + --text-display--letter-spacing: var(--tracking-compressed); + --text-headline: clamp(3.5rem, 8vw, 5.5rem); + --text-headline--line-height: clamp(3.5rem, 8.5vw, 5.75rem); + --text-headline--letter-spacing: var(--tracking-compressed); /* Letter spacing */ - --letter-spacing-*: initial; - --letter-spacing-compressed: -0.022em; - --letter-spacing-squeezed: -0.01em; - --letter-spacing-tighter: -0.018em; - --letter-spacing-tight: -0.0045em; - --letter-spacing-none: 0em; - --letter-spacing-loose: 0.08em; + --tracking-*: initial; + --tracking-compressed: -0.022em; + --tracking-squeezed: -0.01em; + --tracking-tighter: -0.018em; + --tracking-tight: -0.0045em; + --tracking-none: 0em; + --tracking-loose: 0.08em; +} + +@utility container { + margin-inline: auto; + padding-inline: 1.25rem; + max-width: 75rem; +} + +@utility border-gradient { + --border-gradient-before: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.16) 0%, + rgba(255, 255, 255, 0) 100% + ); + --border-gradient-after: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.12) 0%, + rgba(255, 255, 255, 0) 125.11% + ); + --border-radius: 0.5rem; + + &::before, + &::after { + content: ''; + position: absolute; + inset: 0; + border-radius: var(--border-radius); + border: 1px solid transparent; + mask: + linear-gradient(#fff 0 0) padding-box, + linear-gradient(#fff 0 0); + mask-composite: exclude; + pointer-events: none; + } + + &::before { + background: var(--border-gradient-before) border-box; + } + + &::after { + background: var(--border-gradient-after) border-box; + } +} + +@utility mask { + mask-image: linear-gradient( + to var(--mask-direction, top), + transparent, + black var(--mask-height, 32px), + black calc(100% - var(--mask-height, 32px)), + black + ); } -/* Themes */ :root, .light { + /* pink polyfills */ + --transition: 0.2s; + + /* color hues */ --color-pink-hue: 343; --color-secondary-hue: 351; --color-red-hue: 3; @@ -255,7 +327,6 @@ --color-smooth: hsl(var(--color-greyscale-hue) 6%, 10%, 0.04); } -/* dark theme */ .dark { --color-primary: var(--color-greyscale-100); --color-secondary: var(--color-greyscale-300); @@ -263,54 +334,3 @@ --color-badge-border: var(--color-badge-border-dark); --color-smooth: hsl(0 0%, 100%, 0.06); } - -/* Container */ -@layer components { - .container { - @apply mx-auto box-content max-w-[75rem] px-5; - } - - .mask { - mask-image: linear-gradient( - to var(--mask-direction, top), - transparent, - black var(--mask-height, 32px), - black calc(100% - var(--mask-height, 32px)), - black - ); - } - - .grid-bg { - position: relative; - z-index: 1; - overflow: hidden; - background-image: - repeating-linear-gradient( - 0deg, - var(--line-color, rgba(255, 255, 255, 0.02)), - var(--line-color, rgba(255, 255, 255, 0.02)) 1px, - transparent 1px, - transparent var(--size, calc(100vw / 16)) - ), - repeating-linear-gradient( - 90deg, - var(--line-color, rgba(255, 255, 255, 0.02)), - var(--line-color, rgba(255, 255, 255, 0.02)) 1px, - transparent 1px, - transparent var(--size, calc(100vw / 16)) - ); - - &::after { - content: ''; - position: absolute; - width: 100%; - height: 100%; - background-image: radial-gradient( - circle at bottom right, - var(--overlay, rgba(25, 25, 28, 0.5) 19%), - transparent 100% - ); - z-index: -2; - } - } -} diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 000000000..6c88d7a84 --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1 @@ +declare module 'reodotdev'; diff --git a/src/hooks.client.ts b/src/hooks.client.ts deleted file mode 100644 index d3a2b9446..000000000 --- a/src/hooks.client.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { dev } from '$app/environment'; -import { SENTRY_DSN } from '$lib/constants'; -import { handleErrorWithSentry } from '@sentry/sveltekit'; -import * as Sentry from '@sentry/sveltekit'; - -Sentry.init({ - enabled: !dev, - dsn: SENTRY_DSN, - allowUrls: [/appwrite\.io/], - tracesSampleRate: 1.0, - - // This sets the sample rate to be 10%. You may want this to be 100% while - // in development and sample at a lower rate in production - replaysSessionSampleRate: 0, - - // If the entire session is not sampled, use the below sample rate to sample - // sessions when an error occurs. - replaysOnErrorSampleRate: 0 -}); - -// If you have a custom error handler, pass it to `handleErrorWithSentry` -export const handleError = handleErrorWithSentry(); diff --git a/src/hooks.server.ts b/src/hooks.server.ts index c40c8e32a..2ec0f2f0a 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,17 +1,9 @@ -import * as Sentry from '@sentry/sveltekit'; import type { Handle } from '@sveltejs/kit'; import redirects from './redirects.json'; import { sequence } from '@sveltejs/kit/hooks'; -import { BANNER_KEY, SENTRY_DSN } from '$lib/constants'; +import { BANNER_KEY } from '$lib/constants'; import { dev } from '$app/environment'; -Sentry.init({ - enabled: !dev, - dsn: SENTRY_DSN, - tracesSampleRate: 1, - allowUrls: [/appwrite\.io/] -}); - const redirectMap = new Map(redirects.map(({ link, redirect }) => [link, redirect])); const redirecter: Handle = async ({ event, resolve }) => { @@ -131,5 +123,4 @@ const bannerRewriter: Handle = async ({ event, resolve }) => { return response; }; -export const handle = sequence(Sentry.sentryHandle(), redirecter, bannerRewriter, securityheaders); -export const handleError = Sentry.handleErrorWithSentry(); +export const handle = sequence(redirecter, bannerRewriter, securityheaders); diff --git a/src/icons/optimized/edge.svg b/src/icons/optimized/edge.svg new file mode 100644 index 000000000..c144fae4d --- /dev/null +++ b/src/icons/optimized/edge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/optimized/pop-locations.svg b/src/icons/optimized/pop-locations.svg new file mode 100644 index 000000000..adccef994 --- /dev/null +++ b/src/icons/optimized/pop-locations.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/optimized/regions.svg b/src/icons/optimized/regions.svg new file mode 100644 index 000000000..48427d5c2 --- /dev/null +++ b/src/icons/optimized/regions.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/scripts.js b/src/icons/scripts.js index 1d697f169..efaa26184 100644 --- a/src/icons/scripts.js +++ b/src/icons/scripts.js @@ -1,18 +1,85 @@ // @ts-expect-error missing types import SVGFixer from 'oslllo-svg-fixer'; import svgtofont from 'svgtofont'; -import { resolve } from 'path'; +import { basename, extname, resolve } from 'path'; +import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs'; const src = resolve(process.cwd(), 'src/icons/svg'); const optimized = resolve(process.cwd(), 'src/icons/optimized'); const dist = resolve(process.cwd(), 'src/icons/output'); +const outputPath = resolve(process.cwd(), 'src/lib/components/ui/icon'); + +const generateIconSprite = () => { + const files = readdirSync(optimized); + const outputDir = resolve(`${outputPath}/sprite`); + const spriteOutputPath = resolve(outputDir, 'sprite.svelte'); + + if (!existsSync(outputDir)) { + mkdirSync(outputDir, { recursive: true }); + } + + let spriteContent = `\n`; + + files.forEach((file) => { + if (!file.endsWith('.svg')) return; + + const filePath = resolve(optimized, file); + const fileName = basename(file, '.svg'); + const svgContent = readFileSync(filePath, 'utf8'); + + // Extract the SVG content (everything between and ) + const svgMatch = svgContent.match(/]*>([\s\S]*?)<\/svg>/i); + + if (svgMatch && svgMatch[1]) { + const innerContent = svgMatch[1] + .trim() + .replace(/fill=['"]([^'"]*)['"]/g, 'fill="currentColor"'); + const viewBoxMatch = svgContent.match(/viewBox=['"]([^'"]*)['"]/i); + const viewBox = viewBoxMatch ? viewBoxMatch[1] : '0 0 24 24'; + + // Add symbol with the extracted content + spriteContent += ` \n ${innerContent}\n \n`; + } + }); + + // Close the sprite + spriteContent += ''; + + // Write the sprite file + writeFileSync(spriteOutputPath, spriteContent); + console.log(`Created SVG sprite at ${spriteOutputPath}`); + + return spriteOutputPath; +}; + +const generateIconType = () => { + try { + const files = readdirSync(optimized); + + const fileNames = files + .filter((file) => extname(file) !== '') + .map((file) => basename(file, extname(file))); + + const typeDefinition = `export type IconType = ${fileNames.map((name) => `"${name}"`).join(' | ')};`; + + writeFileSync(`${outputPath}/types.ts`, typeDefinition); + + console.log(`Type generated successfully at ${outputPath}`); + console.log(`Generated type: ${typeDefinition}`); + } catch (error) { + console.error('Error generating filename type:', error); + } +}; export const optimizeSVG = async () => { const fixer = new SVGFixer(src, optimized, { showProgressBar: true }); - await fixer.fix(); + await fixer + .fix() + .then(() => generateIconSprite()) + .then(() => generateIconType()); }; export const generateIcons = async () => { diff --git a/src/icons/svg/edge.svg b/src/icons/svg/edge.svg new file mode 100644 index 000000000..455115e10 --- /dev/null +++ b/src/icons/svg/edge.svg @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/src/icons/svg/pop-locations.svg b/src/icons/svg/pop-locations.svg new file mode 100644 index 000000000..95fb2bdbc --- /dev/null +++ b/src/icons/svg/pop-locations.svg @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/src/icons/svg/regions.svg b/src/icons/svg/regions.svg new file mode 100644 index 000000000..68bcef78c --- /dev/null +++ b/src/icons/svg/regions.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index 89fca9978..db883247a 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -55,10 +55,12 @@ const analytics = Analytics({ plugins: [plausible('appwrite.io')] }); -export const trackEvent = async (platforms: { +export type TrackEventArgs = { plausible?: { name: string; data?: object }; posthog?: { name: string }; -}) => { +}; + +export const trackEvent = async (platforms: TrackEventArgs) => { if (!isTrackingAllowed()) { return; } diff --git a/src/lib/actions/animate-in-view.ts b/src/lib/actions/animate-in-view.ts new file mode 100644 index 000000000..36626eee4 --- /dev/null +++ b/src/lib/actions/animate-in-view.ts @@ -0,0 +1,21 @@ +import { inView, type InViewOptions } from 'motion'; +import { writable } from 'svelte/store'; + +export const useAnimateInView = ({ options }: { options?: InViewOptions }) => { + let animate = writable(false); + + const action = (node: HTMLElement) => { + inView( + node, + () => { + animate.set(true); + }, + { ...options } + ); + }; + + return { + animate, + action + }; +}; diff --git a/src/lib/actions/mouse-position.ts b/src/lib/actions/mouse-position.ts new file mode 100644 index 000000000..4d9dff32f --- /dev/null +++ b/src/lib/actions/mouse-position.ts @@ -0,0 +1,34 @@ +import { inView } from 'motion'; +import { type Writable, writable } from 'svelte/store'; + +export const useMousePosition = () => { + let position = writable<{ x: number; y: number }>({ + x: 0, + y: 0 + }); + + const action = (node: HTMLElement) => { + const handleMouseMove = (event: MouseEvent) => { + position.set({ + x: event.clientX, + y: event.clientY + }); + }; + + inView( + node, + () => { + node.addEventListener('mousemove', handleMouseMove); + }, + { amount: 'any' } + ); + + return { + destroy() { + node.removeEventListener('mousemove', handleMouseMove); + } + }; + }; + + return { action, position }; +}; diff --git a/src/lib/animations/AutoBox.svelte b/src/lib/animations/AutoBox.svelte index 328232490..067c71407 100644 --- a/src/lib/animations/AutoBox.svelte +++ b/src/lib/animations/AutoBox.svelte @@ -10,7 +10,7 @@ class="true-body" style:width={`${$bodyRect?.width ?? 0}px`} style:height={`${$bodyRect?.height ?? 0}px`} - /> + >
diff --git a/src/lib/animations/CodeWindow/CodeWindow.svelte b/src/lib/animations/CodeWindow/CodeWindow.svelte index abb5413fc..58d65d138 100644 --- a/src/lib/animations/CodeWindow/CodeWindow.svelte +++ b/src/lib/animations/CodeWindow/CodeWindow.svelte @@ -5,16 +5,16 @@
-
-
-
+
+
+
-
+
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index f0577c9f3..042a2bb1d 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,11 +1,18 @@ diff --git a/src/routes/blog/+layout.svelte b/src/routes/blog/+layout.svelte index fbccb02b9..30306d049 100644 --- a/src/routes/blog/+layout.svelte +++ b/src/routes/blog/+layout.svelte @@ -2,10 +2,10 @@ import { setContext } from 'svelte'; import type { AuthorData, CategoryData, PostsData } from './content.js'; - export let data; + let { data, children } = $props(); setContext('posts', data.posts); setContext('authors', data.authors); setContext('categories', data.categories); - +{@render children()} diff --git a/src/routes/blog/[[page]]/+page.svelte b/src/routes/blog/[[page]]/+page.svelte index 989c18f80..02540caf8 100644 --- a/src/routes/blog/[[page]]/+page.svelte +++ b/src/routes/blog/[[page]]/+page.svelte @@ -1,47 +1,43 @@ + + + Journal App + + +
+
+

My Journal

+
+ + {#if error} +
+

{error}

+ +
+ {/if} + + + + {#if journals.length === 0} +
+

You don't have any journal entries yet.

+ Create your first entry +
+ {:else} +
+ {#each journals as journal (journal.id)} +
+
+

{journal.title}

+
+ View + Edit + +
+
+
+ {#if journal.content.length > 150} +

{journal.content.substring(0, 150)}...

+ {:else} +

{journal.content}

+ {/if} +
+ +
+ {/each} +
+ {/if} +
+``` + +This page will trigger the creation of a local database the first time it is launched and set up replication with Appwrite. All existing journal entries will then be loaded from IndexedDB and rendered as cards on the page. Each journal entry card allows you to access pages, view, edit, or delete an entry from the database. The page will also allow you to create a new journal entry. + +### View a journal entry + +In the `src/routes` directory, create a subdirectory `journal`, within which you must create another subdirectory `[id]`, and add a `+page.svelte` file with the following code: + +```html + + + + {journal ? journal.title : 'Loading...'} | Journal App + + +
+
+ ← Back to Journal +
+ + {#if error} +
+

{error}

+ +
+ {/if} + {#if loading} +
Loading...
+ {:else if journal} +
+
+

{journal.title}

+
+ Edit + +
+
+
+
+ Created: {formatDate(journal.createdAt)} + Updated: {formatDate(journal.updatedAt)} +
+
+ +
+

{journal.content}

+
+
+ {:else} +
+

Journal entry not found

+ Return to Journal +
+ {/if} +
+``` + +When accessing this page, the `[id]` in the URL acts as a slug for fetching data pertaining to a specific journal entry and rendering it on the page. + +### Edit a journal entry + +In the `src/routes/journal/[id]` directory, create a subdirectory `edit`, and add a `+page.svelte` file with the following code: + +```html + + + + Edit Journal Entry | Journal App + + +
+
+

Edit Journal Entry

+ ← Back to Entry +
+ + {#if error} +
+

{error}

+ +
+ {/if} + {#if loading} +

Loading...

+ {:else if journal} +
+
+ + +
+
+ + +
+ +
+ + +
+
+ {:else} +
+

Journal entry not found

+ Return to Journal +
+ {/if} +
+``` + +This page will load the data for a specific journal entry and allow the user to edit its title and content. Saving the edited content will also update the entry's “updated at” time. + +### Add a new journal entry + +In the `src/routes/journal` directory, create a subdirectory `new`, and add a `+page.svelte` file with the following code: + +```html + + + + New Journal Entry + + +
+
+

New Journal Entry

+ ← Back to Journal +
+ + {#if error} +
+

{error}

+ +
+ {/if} + +
+
+ + +
+
+ + +
+ +
+ + +
+
+
+``` + +This page features a form that would allow the user to add a new journal entry to the database. + +## Configure app as a PWA + +For easier offline usage, let’s configure the web app to work as a PWA to offer an offline-first experience. For those who aren’t aware, a PWA or Progress Web App is a type of web application that can be installed on a device as a standalone app, offering a native-like experience. + +To configure our web app as a PWA, you must follow four steps. + +### Create a manifest.json file + +In the `static/` directory, create a new `manifest.json` file and add the following code: + +```json +{ + "name": "Offline Journal", + "short_name": "Journal", + "description": "A private offline-first journaling application", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#4a76a8", + "icons": [ + { + "src": "icons/icon-192-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "icons/icon-512-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ] +} +``` + +### Add app icons + +In the `static/` directory, create a subdirectory `icons/`and add two icons files of the sizes `192px x 192px` and `512px x 512px`. You can [download our demo app’s icons](https://github.com/appwrite-community/offline-journal/tree/main/static/icons) from our GitHub repo as a placeholder. Ensure that the file names for both images comply with those in the `manifest.json` file. + +### Link manifest file in the app.html file + +In the `src/` directory, open the `app.html` file and add the following code within the `` tags: + +```html + +``` + +### Create a service worker + +In the `src/` directory, create a subdirectory `service-worker`, and add a file `index.js` with the following code: + +```js +/// + +// @ts-nocheck +import { build, files, version } from '$service-worker'; + +// Create a unique cache name for this deployment +const CACHE = `cache-${version}`; + +const ASSETS = [ + ...build, // the app itself + ...files // everything in `static` +]; + +self.addEventListener('install', (event) => { + // Create a new cache and add all files to it + async function addFilesToCache() { + const cache = await caches.open(CACHE); + await cache.addAll(ASSETS); + } + + event.waitUntil(addFilesToCache()); +}); + +self.addEventListener('activate', (event) => { + // Remove previous cached data from disk + async function deleteOldCaches() { + for (const key of await caches.keys()) { + if (key !== CACHE) await caches.delete(key); + } + } + + event.waitUntil(deleteOldCaches()); +}); + +self.addEventListener('fetch', (event) => { + // ignore POST requests etc + if (event.request.method !== 'GET') return; + + async function respond() { + const url = new URL(event.request.url); + const cache = await caches.open(CACHE); + + // `build`/`files` can always be served from the cache + if (ASSETS.includes(url.pathname)) { + return cache.match(url.pathname); + } + + // for everything else, try the network first, but + // fall back to the cache if we're offline + try { + const response = await fetch(event.request); + + if (response.status === 200) { + cache.put(event.request, response.clone()); + } + + return response; + } catch { + return cache.match(event.request); + } + } + + event.respondWith(respond()); +}); +``` + +## Test the app + +To locally deploy and test the app, run the following command in your terminal: + +```sh +npm run dev +``` + +You can then visit `https://localhost:5173` in your browser and try out the app. + +# Next steps + +And with that, our offline-first journal app built with RxJS and SvelteKit is ready! + +We developed a more complex version of this app, featuring an authentication implementation and better styling, and deployed it publicly to try out: https://offline-journal.vercel.app/ + +You can find the source code for this application in our [GitHub repo](https://github.com/appwrite-community/offline-journal). + +Learn more about RxDB and Appwrite: + +- [RxDB docs for Appwrite](https://rxdb.info/replication-appwrite.html#do-other-things-with-the-replication-state) +- [Appwrite offline sync docs](/docs/products/databases/offline) +- [RxDB in the Integrations catalog](/integrations/replication-rxdb) \ No newline at end of file diff --git a/src/routes/blog/post/password-hashing-algorithms/+page.markdoc b/src/routes/blog/post/password-hashing-algorithms/+page.markdoc index b2108eddb..245f5fdf9 100644 --- a/src/routes/blog/post/password-hashing-algorithms/+page.markdoc +++ b/src/routes/blog/post/password-hashing-algorithms/+page.markdoc @@ -80,7 +80,7 @@ Appwrite Authentication also leverages password hashing algorithms to allow deve import { Client, Account, ID } from "appwrite"; const client = new Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); const account = new Account(client); diff --git a/src/routes/blog/post/product-update-march-2025/+page.markdoc b/src/routes/blog/post/product-update-march-2025/+page.markdoc new file mode 100644 index 000000000..28231917e --- /dev/null +++ b/src/routes/blog/post/product-update-march-2025/+page.markdoc @@ -0,0 +1,91 @@ +--- +layout: post +title: "March product update: Product Hunt launch, Appwrite MCP server, and faster backups." +description: Get a full recap of products, features and programs we released in the month of March. +date: 2025-04-11 +cover: /images/blog/product-update-march-2025/cover-image.png +timeToRead: 10 +author: dennis-ivy +category: product +featured: false +callToAction: true +--- + +Welcome back to the March product update. Here’s what happened the past month: + +- Launched the Appwrite MCP server +- Key optimizations to Appwrite cloud backups +- Update to budget limits in Appwrite Cloud + +Plus, we've got something exciting to share with you. Let’s dive in. + +![Product Hunt announcement](/images/blog/product-update-march-2025/ph.png) + +# Big announcement coming soon + +We’ve got a major announcement on the way. This time, we’re bringing the heat to Product Hunt. The Appwrite community is the first to know! + +Visit our ‘Coming Soon’ page and click Notify Me to get an email when we go live. We can't wait to share what we’ve been working on. + +[Go to Product Hunt](https://www.producthunt.com/products/appwrite) + +![Appwrite MCP server](/images/blog/product-update-march-2025/mcp.png) + +# Appwrite MCP server + +Did you know that Appwrite has launched its own MCP server? This means you can now let AI agents like Cursor or Windsurf analyze database records, access the User API, or perform actions directly on your Appwrite project. + +Not sure where to start? No worries, we’ve got you covered. + +- [Appwrite MCP documentation](https://appwrite.io/docs/tooling/mcp) +- [Appwrite MCP server practical applications](https://www.youtube.com/watch?v=83rNS6W2Nu8) +- [Learn more about MCP and how it works under the hood](https://appwrite.io/blog/post/what-is-mcp) + +The Appwrite MCP server opens up infinite possibilities, and this is just the beginning. We can't wait to see how you’ll use it in your projects. + +![Cloud improvements](/images/blog/product-update-march-2025/cloud-backups.png) + +# Appwrite Cloud backups are now faster + +Appwrite Cloud backups are now significantly faster. We’ve made key optimizations to our infrastructure, reducing backup times by up to 7x. With quicker data recovery and improved reliability, you can spend less time waiting and more time building. + +[Learn more](https://appwrite.io/changelog/entry/2025-03-27) + +# Update to budget limits in Appwrite Cloud + +We’ve improved budget limits in Appwrite Cloud to give you better control over your organization’s scaling. + +Now, setting the budget to 0 means your organization will not exceed its allocated resources, while null will explicitly disable the budget. This update ensures clearer budget management and better control over scaling. + +[Learn more](https://appwrite.io/changelog/entry/2025-03-19) + +![Community recognitions](/images/blog/product-update-march-2025/community.png) + +# Community recognitions + +This month, we’re excited to feature Geohash as part of our Monthly Community recognitions. + +The Geohash application demonstrates how to implement geolocation-based user search with Appwrite. + +A big shout-out to [Clément](https://github.com/clementg13). Check out their product, Geohash, [here](https://github.com/clementg13/Appwrite-Nearby-GeoLocation). + +If you'd like to participate in next month's Community Recognitions, [join our Discord server](https://appwrite.io/discord) to showcase your project. + +# Engineering resources + +**Read** +- [Lynx by ByteDance vs React Native](https://appwrite.io/blog/post/bytedance-lynx-vs-react-native) +- [What exactly is MCP, and why is it trending?](https://appwrite.io/blog/post/what-is-mcp) +- [Image transformation with Appwrite Storage](https://appwrite.io/blog/post/image-transformation-with-appwrite-storage) +- [Building a backendless application with Angular and Appwrite](https://angular.love/building-a-backendless-application-with-angular-appwrite) + +**Watch** +- [Appwrite vs Supabase performance results](https://youtu.be/zWLfLxq2Ws4?si=7NaoZPb-JbDpNVfG) +- [Appwrite MCP server practical examples](https://youtu.be/83rNS6W2Nu8?si=gJUMP4VisK_kG0nE) +- [Appwrite MCP server setup with Cursor](https://www.youtube.com/watch?v=Qzikjm5H7wM) + +# What's to come + +That’s a wrap for March. We have a lot to come in the coming weeks, starting with new Cloud regions! + +Follow us on [X](https://x.com/appwrite) and check our [Changelog](https://appwrite.io/changelog) regularly, as we will release more information in the coming weeks. diff --git a/src/routes/blog/post/push-notifications-best-practices/+page.markdoc b/src/routes/blog/post/push-notifications-best-practices/+page.markdoc index 71fff0989..369d28eac 100644 --- a/src/routes/blog/post/push-notifications-best-practices/+page.markdoc +++ b/src/routes/blog/post/push-notifications-best-practices/+page.markdoc @@ -62,7 +62,7 @@ const client = new sdk.Client(); const messaging = new sdk.Messaging(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID .setKey('919c2d18fb5d4...a2ae413da83346ad2'); // Your secret API key diff --git a/src/routes/blog/post/rest-vs-graphql-websockets-which-is-best-for-your-app/+page.markdoc b/src/routes/blog/post/rest-vs-graphql-websockets-which-is-best-for-your-app/+page.markdoc index 9c755573c..ca32be10e 100644 --- a/src/routes/blog/post/rest-vs-graphql-websockets-which-is-best-for-your-app/+page.markdoc +++ b/src/routes/blog/post/rest-vs-graphql-websockets-which-is-best-for-your-app/+page.markdoc @@ -106,7 +106,7 @@ All of the Appwrite client SDKs for Web, Flutter, iOS, or Android come with buil import { Client } from "appwrite"; const client = new Client() - .setEndpoint('') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); client.subscribe('account', response => { diff --git a/src/routes/blog/post/set-up-google-auth-appwrite-react/+page.markdoc b/src/routes/blog/post/set-up-google-auth-appwrite-react/+page.markdoc index ad574a52d..4adab41ed 100644 --- a/src/routes/blog/post/set-up-google-auth-appwrite-react/+page.markdoc +++ b/src/routes/blog/post/set-up-google-auth-appwrite-react/+page.markdoc @@ -101,7 +101,7 @@ import { Client, Account, OAuthProvider } from 'appwrite' const client = new Client() client - .setEndpoint('https://cloud.appwrite.io/v1')// The Appwrite API endpoint + .setEndpoint('https://.cloud.appwrite.io/v1')// The Appwrite API endpoint .setProject('project-id')// Your Appwrite project IDexport const account = new Account(client) export { OAuthProvider } diff --git a/src/routes/blog/post/should-you-stop-using-otp-sms/+page.markdoc b/src/routes/blog/post/should-you-stop-using-otp-sms/+page.markdoc index 4f8ad1001..67d4ec96f 100644 --- a/src/routes/blog/post/should-you-stop-using-otp-sms/+page.markdoc +++ b/src/routes/blog/post/should-you-stop-using-otp-sms/+page.markdoc @@ -70,7 +70,7 @@ First, we initialize the login process by sending an email with the magic URL. I import { Client, Account, ID } from "appwrite"; const client = new Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); const account = new Account(client); @@ -100,7 +100,7 @@ First, we initialize the login process by sending an email. If the email has nev import { Client, Account, ID } from "appwrite"; const client = new Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); const account = new Account(client); @@ -135,7 +135,7 @@ First, we initialize the login process by sending an SMS. If the phone number ha import 'package:appwrite/appwrite.dart'; final client = Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); final account = Account(client); diff --git a/src/routes/blog/post/simplify-messaging-twilio/+page.markdoc b/src/routes/blog/post/simplify-messaging-twilio/+page.markdoc index 802b82153..80f715d0d 100644 --- a/src/routes/blog/post/simplify-messaging-twilio/+page.markdoc +++ b/src/routes/blog/post/simplify-messaging-twilio/+page.markdoc @@ -79,7 +79,7 @@ const client = new sdk.Client(); const messaging = new sdk.Messaging(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID .setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key ; diff --git a/src/routes/blog/post/the-appwrite-network/+page.markdoc b/src/routes/blog/post/the-appwrite-network/+page.markdoc new file mode 100644 index 000000000..4a3081d46 --- /dev/null +++ b/src/routes/blog/post/the-appwrite-network/+page.markdoc @@ -0,0 +1,99 @@ +--- +layout: post +title: "Announcing the Appwrite Network: Appwrite’s vision for a global cloud infrastructure" +description: Announcing more regions for Cloud, and many more to come with the introduction of the Appwrite Network. +date: 2025-04-16 +cover: /images/blog/the-appwrite-network/network-cover-image.png +timeToRead: 05 +author: christy-jacob +category: product +featured: true +callToAction: true +--- + +We are happy to announce the launch of the Appwrite Network, a network of cloud regions and edge locations (edges) to improve Appwrite Cloud availability, performance, and compliance with local regulations. This will provide Appwrite developers and teams with the best tools and infrastructure to build, deploy, and scale your applications. This brings us closer to the Appwrite mission of making software development more accessible and enjoyable for all developers. + +Starting today, all Pro users have access to three regions of choice, including our two new regions in **New York City** ('NYC'), and **Sydney** ('SYD') that are joining our first region in **Frankfurt** ('FRA'). In the next few weeks, this will be available to all Cloud users, with more regions to come. + +![Overview of all the regions](/images/blog/the-appwrite-network/cloud-regions.png) + +# The plan + +The Appwrite Cloud beta journey began with a single region in Frankfurt, which allowed us to focus on delivering the highest quality and performance on a smaller scale. As we approach the General Availability (GA) of Appwrite Cloud, and with a growing number of developers, projects, and organizations on the platform, we are excited to share the plans to expand the network to include additional regions and edges across the globe. + +| Location | Status | Region | Edge | Timeline | +|---------------------|-----------------------|--------|------|---------------| +| Frankfurt (`FRA`) | Ready and operational | Yes | Yes | Available Now | +| Sydney (`SYD`) | Ready and operational | Yes | Yes | Available Now | +| New York City (`NYC`) | Ready and operational | Yes | Yes | Available Now | +| Singapore (`SGP`) | In work | Yes | Yes | Q4 2025 | +| San Francisco (`SFO`) | In work | Yes | Yes | Q4 2025 | +| Bangalore (`BLR`) | In plans | Yes | Yes | TBD | +| Amsterdam (`AMS`) | In plans | Yes | Yes | TBD | +| London (`LON`) | In plans | Yes | Yes | TBD | +| Toronto (`TOR`) | In plans | Yes | Yes | TBD | + + +# Addressing the latency problem + +Latency is a critical factor in the performance of both web and mobile applications. High latency can lead to slow response times, poor user experience, and ultimately, loss of revenue. There are several primary causes of latency: + +- **Physical distance:** The further the data has to travel, the longer it takes. This is known as propagation delay. +- **Network congestion:** Overloaded networks can slow down data transmission. +- **Routing and switching:** Each hop a packet takes through the network can add delays. +- **Server processing time:** The time it takes for a server to process a request and send a response. + +Establishing a global network of regions and edges can significantly reduce latency. For example, without a global network, a request from a user in Sydney to a server in New York could experience latency upwards of 250 milliseconds. With a global network, routing that same request through an edge in Singapore and a region in Frankfurt can reduce latency to under 100 milliseconds. + +A global network allows us to distribute data and processing power closer to the end-users, minimizing the distance that data needs to travel and thus reducing the time it takes for requests and responses to be processed. This results in faster load times, improved performance, and a better overall user experience. + +# Why build the Appwrite Network? + +Building a fully fledged network from scratch is not a decision we take lightly. Here are the key reasons behind this approach: + +**1. Innovation and quality**: By owning the network, we can innovate and optimize in ways that would be impossible with off-the-shelf solutions. This control allows us to deliver a superior developer experience explicitly tailored to your needs. + +**2. Security and trust**: Maintaining control over the infrastructure to ensure the highest standards of security and privacy for Appwrite developers. This helps us ensure you always own and control your data. + +**3. Flexibility and customization**: Having a network allows us to be more agile and responsive to the evolving needs of Appwrite developers. We can quickly adapt and introduce new features and improvements without being constrained by third-party limitations. + +**4. Cost efficiency**: By building and managing the network, we can reduce costs and pass those savings on to Appwrite developers. By maintaining independence, we can ensure predictable costs for compute, and this helps us make Appwrite more affordable for teams of all sizes. + +**5. It’s fun**: At the core of Appwrite, we are geeks who love technology and building stuff from scratch, so you don’t have to. Building a network is not just a business decision but also a passion. It's an opportunity to push the boundaries of what's possible and share that excitement with the Appwrite community of developers. + +# Regions vs Edges vs PoPs + +![Regions vs Edges vs PoPs](/images/blog/the-appwrite-network/regions-edges-pops.png) + +In Appwrite, Regions are where all your core data and services live. This includes your databases, auth, functions, messaging, and storage. Regions are the source of truth, handling heavy workloads and ensuring your application runs reliably while keeping your data compliant with local regulations. + +Edges are about speed. They process requests closer to your users using smart geo-routing, reducing latency by handling compute tasks at the nearest edge location. Edges are perfect for serving cached content, executing lightweight computations, and optimizing user interactions. + +Our global CDN leverages strategically positioned Points of Presence (PoPs) to cache and deliver your content from locations nearest to your users, ensuring rapid load times and enhanced performance. + +In short, a region hosts your data, and the edge executes your functions close to your users. Both regions and edges take advantage of the Appwrite CDN to optimize delivery and security. + +# Data storage and global availability + +One of the key features of the Appwrite Network is the ability to choose where your project's data is stored. You can select your preferred region, ensuring compliance with local data regulations and optimizing performance for your primary user base. However, thanks to the global network of edges, your data will be accessible worldwide on the Appwrite network, ensuring fast and reliable access for users regardless of their location. + +Each region will also function as an edge for other regions, enhancing network coverage and reducing latency. This interconnected approach ensures that we can deliver the best possible performance and reliability for all Appwrite developers and your end-users. + +# Global CDN with integrated DDoS protection + +All Appwrite’s Cloud projects are served by Appwrite’s built-in CDN. Our new global CDN is designed to serve your content rapidly and reliably worldwide. By leveraging a network of strategically located points of presence (PoPs), the CDN ensures that every user request is delivered from the closest possible location, drastically reducing latency and enhancing the overall user experience. + +Moreover, the CDN includes integrated DDoS protection that combines standard traffic analysis, rate limiting, and filtering techniques to help mitigate potential threats in real time. This balanced approach helps maintain solid performance while providing a reliable level of security for your applications. + +# Web application firewall (WAF) + +Our [Web Application Firewall](/docs/products/network/waf) (WAF) is now available exclusively to enterprise customers, providing a crucial protective layer for your applications. Operating at OSI Layer 7, the WAF inspects and filters all HTTP/HTTPS traffic in real time, effectively blocking common web vulnerabilities such as SQL injection, XSS, and CSRF, while also mitigating application-level DDoS attacks. + +Customizable rulesets allow you to tailor the WAF to your application's specific needs, with detailed analysis of request headers, payloads, and query strings to identify and neutralize threats before they reach your infrastructure. Setup and configuration are managed through your dedicated Appwrite success manager, ensuring that the WAF adapts to evolving security challenges and compliance requirements. To learn more about our enterprise plan, you can [contact us](/contact-us/enterprise). + +# The road ahead + +We welcome you to visit the docs to learn more about the [Appwrite Network](/docs/products/network) and how Appwrite handle's other topics like [secure transportation](/docs/products/network/tls), [compression](/docs/products/network/compression), [caching](/docs/products/network/caching) and more. + +We are excited about the future of the Appwrite network and the endless possibilities it will unlock for developers worldwide. Stay tuned for more updates as we continue to build and expand the network. Thank you for being part of the Appwrite community and for your ongoing support. Together, we are building the future of cloud platforms designed for developers. + diff --git a/src/routes/blog/post/understand-data-queries/+page.markdoc b/src/routes/blog/post/understand-data-queries/+page.markdoc index 26c328b3e..5f74da1bb 100644 --- a/src/routes/blog/post/understand-data-queries/+page.markdoc +++ b/src/routes/blog/post/understand-data-queries/+page.markdoc @@ -77,7 +77,7 @@ One of the data retrieval APIs the Appwrite Database offers is a list documents import { Client, Databases, Query } from "appwrite"; const client = new Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); const databases = new Databases(client); diff --git a/src/routes/blog/post/vibe-coding-security-best-practices/+page.markdoc b/src/routes/blog/post/vibe-coding-security-best-practices/+page.markdoc new file mode 100644 index 000000000..ddf0c7392 --- /dev/null +++ b/src/routes/blog/post/vibe-coding-security-best-practices/+page.markdoc @@ -0,0 +1,426 @@ +--- +layout: post +title: 20 security best practices for vibe coding +description: Vibe coding is becoming popular, but it's not always safe. Follow these best practices to secure your apps when using AI-generated code. +date: 2025-04-01 +cover: /images/blog/vibe-coding-security-best-practices/cover.png +timeToRead: 15 +author: ebenezer-don +category: tutorial +featured: false +callToAction: true +--- + +Vibe coding is changing the way developers build software. Instead of manually writing every function, many developers are beginning to rely on AI-assisted tools to generate code based on natural language instructions. This approach can significantly speed up development and allow teams to create applications faster. But... the convenience of vibe coding comes with significant security risks. + +AI-generated code is not inherently secure, and without proper oversight, it can introduce vulnerabilities that lead to data breaches, unauthorized access, and critical system failures. + +Security must be a top priority for vibe coders, and as a developer, you must take responsibility for reviewing, testing, and securing AI-generated code. In this article, we'll explore **20 essential security best practices** you must follow as a vibe coder to ensure your applications remain safe. + +# 1. Always review and understand AI-generated code + +One of the most common mistakes developers make when using AI-generated code is assuming that it is correct and secure by default. AI models do not "think" like humans. They generate code based on patterns from their training data. **They don't have feelings, and therefore, cannot feel responsible for the code they generate.** This means they can produce insecure, inefficient, or completely incorrect solutions that may work at first glance but introduce serious risks. + +For example, an AI-generated authentication system might include a password-checking function but fail to enforce proper hashing standards. A vibe coder might copy this code into their project without realizing it stores passwords in plaintext, a serious security vulnerability. + +To avoid such issues, always review AI-generated code line by line, understand each function's purpose and ensure it aligns with security best practices. If the AI generates a complex piece of logic that you do not fully understand, take the time to research and test it before integrating it into your application. + +# 2. Rely on proven authentication patterns + +Authentication is one of the most critical security components of any application. AI-generated code might create a login system that appears functional, but without proper security measures, it could expose user credentials, enable unauthorized access, or fail under real-world attack scenarios. + +AI can very easily generate a function that checks passwords against stored values in a database but can also easily fail to implement proper password hashing. If as a developer, you are unaware of best practices, there'll be nothing stopping you from using this insecure function to store passwords in plaintext. If an attacker gains access to the database, they would have full visibility into user credentials, leading to massive security breaches. + +Instead of relying on AI-generated authentication logic, go for **widely adopted** authentication solutions and libraries. A straightforward choice is a platform like [Appwrite](https://appwrite.io/), which provides a secure authentication flow out of the box with several authentication patterns including email/password, social login, magic link/passwordless login, and more. For Node.js applications, you can also use **Passport.js** or **NextAuth** to provide secure authentication flows. For web applications, **Auth0** exists as well, and can ensure that authentication is handled correctly with industry-standard security measures like OpenID Connect, and multi-factor authentication (MFA). + +You should also ensure that password hashing follows modern best practices. Use **bcrypt** or **Argon2** for hashing rather than outdated methods like MD5 or SHA-1, which are vulnerable to brute-force attacks. When AI generates authentication code, always verify that it follows these principles before deploying it to production. + +# 3. Validate and sanitize all user inputs + +User input is one of the most common attack vectors in web applications. AI-generated code may not properly validate inputs, leaving applications vulnerable to **SQL injection, cross-site scripting (XSS), and remote code execution (RCE)**. These vulnerabilities allow attackers to manipulate data, execute malicious scripts, or gain unauthorized access. + +Consider a scenario where AI generates a search function for a database query: + +```js +app.get('/search', async (req, res) => { + const query = `SELECT * FROM users WHERE name = '${req.query.name}'` + const result = await db.query(query) + res.json(result) +}) +``` + +This function directly inserts user input (`req.query.name`) into an SQL query, making it vulnerable to SQL injection. An attacker could send: + +``` +/search?name=' OR '1'='1 +``` + +This would return all user records, exposing sensitive data. To prevent this, always **validate input** and use **parameterized queries**: + +```js +app.get('/search', async (req, res) => { + const name = req.query.name?.trim() + if (!name || /[^a-zA-Z0-9 ]/.test(name)) { + return res.status(400).json({ error: 'Invalid input' }) + } + + const result = await db.query('SELECT * FROM users WHERE name = ?', [name]) + res.json(result) +}) +``` + +Using an **ORM** like Prisma, Sequelize, or TypeORM can further reduce risks by abstracting query handling. Alternatively, [Appwrite's Database API](https://appwrite.io/docs/references/1.6.x/client-web/databases) provides built-in query filtering, eliminating the need to construct raw SQL queries. + +Beyond SQL injection, user inputs should be validated for **length, type, and format**. Use libraries like **Zod (TypeScript)** or **Joi (JavaScript)** to enforce strict validation rules before processing any user data. Sanitization is equally important. Removing or escaping dangerous characters in user inputs prevents attacks like XSS and command injection. + +# 4. Store secrets securely and avoid hardcoding credentials + +AI-generated code sometimes suggests using API keys, database credentials, or other sensitive information **directly within source files**. **This is a serious security risk.** Hardcoded secrets can be accidentally pushed to public repositories, where attackers can easily retrieve them and exploit access to your systems. + +For example, AI-generated code might include: + +```js +const apiKey = 'sk_test_1234567890abcdef' // DO NOT DO THIS +fetch(`https://api.example.com/data?key=${apiKey}`) + .then((response) => response.json()) + .then((data) => console.log(data)) +``` + +Instead of hardcoding secrets, always store them in **environment variables** or a **secrets manager**. Services like **AWS Secrets Manager, Azure Key Vault, and HashiCorp Vault** provide secure storage and controlled access to sensitive credentials. In a Node.js application, use environment variables like this: + +```js +const apiKey = process.env.API_KEY +``` + +Then, store credentials in a `.env` file, which should be **excluded from version control**: + +``` +API_KEY=sk_test_1234567890abcdef +``` + +Proper secret management ensures that sensitive data is never exposed in public repositories, reducing the risk of unauthorized access. + +# 5. Do not store API keys in env files of frontend frameworks + +One of the most common security mistakes developers make is storing API keys, secrets, or sensitive credentials inside environment files of frontend frameworks like Next.js, React, or Vue.js. While environment variables are a good practice for server-side applications, using them incorrectly in frontend projects can expose sensitive credentials to attackers. + +## Why frontend environment variables are insecure + +In frontend frameworks like React and Vue, environment variables are usually bundled at build time, meaning they are part of the JavaScript files served to users. If a key is included in a .env file like this: + +``` +REACT_APP_API_KEY=sk_test_1234567890abcdef +``` + +And referenced in a component: + +```js +const apiKey = process.env.REACT_APP_API_KEY +``` + +This key will be visible in browser developer tools, the network tab, and even the compiled JavaScript files. An attacker can easily obtain it by inspecting the page source or opening the developer console. + +This applies to any frontend framework that bundles environment variables into client-side JavaScript, including: + +- React (`REACT_APP_*` variables) +- Vue (`VUE_APP_*` variables) +- Next.js (`NEXT_PUBLIC_*` variables) + +Any environment variable prefixed with PUBLIC or specifically required for client-side code is not secure and should never contain sensitive data. + +## How to securely store API keys in frontend projects + +API keys should always be stored on a **backend server**, not in frontend code. Instead of making direct API calls from the frontend, the recommended approach is to **create a backend proxy that securely handles requests** and appends the API key before forwarding the request to the external service. + +This way, **the API key is never exposed to the browser**, and attackers cannot extract it from the client-side code. + +## Environment variables in server-side frameworks + +Some frameworks, like **Next.js and Nuxt.js**, offer built-in support for environment variables that are only accessible on the server. For example, in Next.js, any environment variable **without** the `NEXT_PUBLIC_` prefix is only available on the server: + +``` +API_KEY=sk_test_1234567890abcdef +``` + +This allows the API key to be used **only in API routes or server-side functions**, preventing it from being bundled into frontend JavaScript. + +# 6. Implement strong authorization and access control + +AI-generated code might not enforce proper authorization checks, which can allow users to access resources they shouldn't. A common mistake is assuming that authentication alone is sufficient for security. However, without granular **role-based access control (RBAC)** or **attribute-based access control (ABAC)**, attackers or unauthorized users might exploit missing checks to escalate privileges. + +For example, you might use AI to generate an API that allows users to delete a record from your database. Without checking if the logged-in user has the necessary permissions, any user could delete **any** account, leading to a major security issue. + +To prevent this, implement **role-based access control (RBAC)** to restrict access to only authorized users. + +Every function that modifies or deletes data should enforce strict authorization rules. Always verify user roles and enforce **least privilege access**, ensuring users only have permissions necessary for their role. + +If using Appwrite, ensure that your database collections are [configured with the correct permissions](https://appwrite.io/docs/products/databases/permissions) and that you are using the correct roles to restrict access. + +# 7. Secure all communications with HTTPS + +AI-generated code might not enforce HTTPS, leaving applications vulnerable to **man-in-the-middle (MITM) attacks**, where attackers intercept and modify sensitive data exchanged between clients and servers. If login credentials or API keys are transmitted over HTTP, an attacker monitoring the network can easily steal them. + +To enforce HTTPS, configure your web server to **redirect all HTTP traffic to HTTPS** using **HSTS (HTTP Strict Transport Security)** headers. + +For Express.js applications, force HTTPS using middleware: + +```js +const express = require('express') +const helmet = require('helmet') + +const app = express() +app.set('trust proxy', true) // Trust reverse proxy + +// Redirect HTTP to HTTPS +app.use((req, res, next) => { + if (req.protocol !== 'https') { + return res.redirect(301, `https://${req.headers.host}${req.url}`) + } + next() +}) + +// Enable HSTS +app.use( + helmet.hsts({ + maxAge: 31536000, + includeSubDomains: true, + preload: true, + }), +) + +app.listen(3000) +``` + +For production, always use **TLS (Transport Layer Security)** certificates from **Let's Encrypt** or another trusted Certificate Authority (CA). + +# 8. Regularly scan dependencies for vulnerabilities + +AI-generated code often suggests using external libraries without verifying their security. Vulnerable dependencies are one of the most exploited attack vectors in modern applications. Attackers frequently target outdated libraries with known security flaws. + +To protect against this, **regularly audit dependencies** using: + +- `npm audit` (for JavaScript/Node.js projects) +- `pip-audit` (for Python projects) +- `cargo audit` (for Rust projects) +- `mvn dependency:check` (for Java/Maven projects) + +For example, in a Node.js project, running: + +``` +npm audit fix +``` + +automatically updates vulnerable dependencies. However, **always test updates thoroughly**, as they may introduce breaking changes. Consider using automated dependency monitoring services like **Snyk** or **Dependabot**, which notify you about security vulnerabilities in your project dependencies. + +# 9. Secure API endpoints to prevent unauthorized access + +One of the most overlooked risks in AI-generated code is weak API security. AI models might generate API endpoints without proper authentication or authorization, exposing sensitive data and operations to anyone with access to the endpoint. Attackers often scan public-facing APIs for security misconfigurations, making this a critical area to secure. + +Always ensure that your API endpoints are protected by authentication and authorization. + +Beyond authentication, API security should include: + +- **Rate limiting:** Prevent brute-force attacks by restricting the number of requests per minute using middleware like `express-rate-limit`. +- **CORS policies:** Restrict which domains can make API calls to prevent unauthorized cross-origin requests. +- **API gateways:** Use API management platforms like Kong or AWS API Gateway to enforce security at scale. + +API security must be a priority from the start, as weak APIs are one of the most common entry points for attackers. + +# 10. Implement secure session management + +AI-generated authentication flows might create session-handling logic that lacks proper security controls. Poor session management can lead to **session hijacking, session fixation, or replay attacks**, where attackers steal valid session tokens and gain unauthorized access. + +A common mistake is using weak session identifiers or storing session tokens in insecure locations, such as local storage in the browser. Attackers can steal these tokens using **XSS (Cross-Site Scripting) attacks**. Instead, sessions should be managed securely: + +- **Use HTTP-only cookies for session storage**, which prevents JavaScript from accessing session tokens. +- **Set secure flags on cookies** (`Secure`, `HttpOnly`, and `SameSite=strict`) to prevent cross-site access. +- **Regenerate session IDs after authentication** to prevent session fixation attacks. +- **Set session expiration times** to minimize risk if a token is compromised. + +For example, in Express.js with `express-session`: + +```js +app.use( + session({ + secret: process.env.SESSION_SECRET, + resave: false, + saveUninitialized: false, + cookie: { + httpOnly: true, + secure: true, + sameSite: 'strict', + maxAge: 3600000, // 1 hour + }, + }), +) +``` + +Just like we discussed before, an even better approach is to go with well-established solutions for auth and session management. Appwrite helps you with this out of the box. You can also go with other popular solutions that are specifically designed for this purpose. + +# 11. Secure file uploads to prevent malware execution + +AI-generated file upload handlers may accept any file type without validation, opening the door to **remote code execution (RCE) attacks, malware uploads, and denial-of-service (DoS) exploits**. Attackers can upload malicious scripts disguised as images or PDFs, executing them once they reach the server. + +For example, an insecure file upload endpoint might look like this: + +```js +app.post('/upload', upload.single('file'), (req, res) => { + res.send('File uploaded') +}) +``` + +This accepts **any file type**, which is dangerous. To secure file uploads: + +- **Limit allowed file types** (e.g., only allow `.jpg`, `.png`, `.pdf`). +- **Scan uploaded files for malware** using antivirus tools like ClamAV. +- **Store files outside the web root directory** to prevent direct access. +- **Rename uploaded files** to prevent executing malicious filenames. + +To secure file uploads and prevent malware execution, implement a comprehensive validation strategy. Rather than accepting any file type, explicitly whitelist allowed formats (like JPG, PNG, PDF) and verify file types through MIME checking. + +Set reasonable file size limits (e.g., 5MB) to prevent denial-of-service attacks. Consider using libraries like `multer` in Node.js to handle these security controls, and remember to scan uploads for malware using tools like ClamAV before processing them. + +If using Appwrite Storage, you can easily configure all these in your [bucket settings](https://appwrite.io/docs/products/storage/buckets). + +This approach drastically reduces the risk of attackers uploading malicious scripts disguised as harmless files. + +By enforcing strict upload rules, you protect your system from dangerous file exploits. + +# 12. Apply the principle of least privilege (PoLP) + +AI-generated code, especially with the growing popularity of [MCP (Model Context Protocol)](https://appwrite.io/blog/post/what-is-mcp?doFollow=true), might grant excessive permissions to users, database connections, or cloud services. This violates the **principle of least privilege**, which states that every system component should have **only the minimum level of access necessary to perform its function**. + +For example, if an AI-generated database connection uses **a root account with full privileges**, an attacker who gains access to the application could execute **DROP DATABASE** or **modify any table**. Instead, create a dedicated database user with **read-only access** for non-administrative operations. + +Apply PoLP principles across: + +- **Cloud services:** Use IAM roles to restrict permissions in AWS, GCP, or Azure. +- **API keys:** Limit API scopes to necessary actions only. +- **User roles:** Define admin, editor, and viewer roles with different access levels. + +By limiting access, even if an attacker gains access to a compromised system, the damage they can do is minimized. + +# 13. Monitor security logs and enable real-time threat detection + +One of the biggest risks with AI-generated code is the lack of built-in logging and monitoring. Without proper logging, security incidents go unnoticed until it's too late. AI-generated functions often lack detailed audit trails, making it difficult to investigate breaches, detect unauthorized access, or analyze unusual activity. + +For example, if an AI generates an authentication function, it may successfully verify user credentials but fail to log login attempts, failed authentications, or suspicious behavior. Without this data, you won't know if someone is attempting a brute-force attack or if an attacker has successfully exploited a vulnerability. + +To mitigate this, implement a comprehensive **logging and monitoring** system. + +Beyond logging, enable **real-time threat detection** using **SIEM (Security Information and Event Management)** tools such as Splunk, Datadog, or Elastic Security. These tools analyze logs for suspicious activity, like repeated failed login attempts or access from unusual locations. + +Additionally, consider integrating **intrusion detection systems (IDS)** like **OSSEC** or **Wazuh** to monitor system logs and detect threats before they escalate. + +# 14. Secure cryptographic operations and avoid AI-suggested weak algorithms + +AI-generated code often suggests outdated or insecure cryptographic algorithms due to limitations in training data. For example, an AI might suggest using **MD5** or **SHA-1** for password hashing, both of which are no longer secure against modern brute-force attacks. + +To ensure secure cryptographic operations: + +- Use **bcrypt** or **Argon2** for password hashing. +- For encryption, use **AES-256-GCM** instead of older ciphers like DES or Blowfish. +- For digital signatures, prefer **ECDSA (Elliptic Curve Digital Signature Algorithm)** over RSA-1024. + +Remember that AI-generated code can easily skip fundamental steps like salting passwords, making them vulnerable to rainbow table attacks. Always verify cryptographic implementations and ensure they follow modern security standards. + +# 15. Rate-limit API requests to prevent brute-force and DoS attacks + +AI-generated API endpoints often lack protection against excessive requests, making them susceptible to brute-force attacks and **Denial of Service (DoS)** attacks. If an attacker floods your login API with thousands of authentication attempts, they may crack weak passwords or overload your server, making the service unavailable to legitimate users. + +To prevent this, implement **rate limiting** at the API level using middleware like `express-rate-limit`: + +```js +const rateLimit = require('express-rate-limit') + +const limiter = rateLimit({ + windowMs: 15 * 60 * 1000, // 15 minutes + max: 100, // limit each IP to 100 requests per window + message: 'Too many requests, please try again later', +}) + +app.use('/login', limiter) + +``` + +This limits users to **100 login attempts per 15 minutes**, significantly reducing the risk of brute-force attacks while ensuring legitimate users can still access the service. + +For more advanced protection, use **Web Application Firewalls (WAFs)** like **Cloudflare, AWS WAF, or Imperva**, which provide intelligent traffic filtering and automated threat detection against DoS attacks. + +# 16. Implement proper CORS policies to prevent cross-origin exploits + +We mentioned CORS briefly, but it's important to address it in detail. Cross-Origin Resource Sharing (CORS) controls which external domains can make requests to your API. AI-generated APIs may not enforce strict CORS policies, leading to **cross-origin request forgery (CSRF) and unauthorized API access**. + +For example, a poorly implemented CORS policy might allow requests from **any** domain (`*`): + +```js +app.use(cors({ origin: '*' })) +``` + +This is dangerous because it allows **any website** to make API requests on behalf of an authenticated user, potentially exposing sensitive data. + +A better approach is to define **allowed origins explicitly**: + +```js +const corsOptions = { + origin: [''], + methods: ['GET', 'POST'], + allowedHeaders: ['Content-Type', 'Authorization'], +} + +app.use(cors(corsOptions)) +``` + +This will help ensure that only trusted websites can interact with your API, reducing the risk of **cross-site request forgery (CSRF) attacks**. + +# 17. Secure cloud deployments and lock down publicly exposed services + +AI-generated cloud deployment configurations may leave services **publicly accessible**, creating a major security risk. If you use AI-generated Terraform, Kubernetes, or AWS configurations, you must carefully review security settings. + +In AWS, GCP, or Azure environments, always: + +- **Disable default public access** for storage, databases, and VMs. +- **Enforce IAM roles and least-privilege permissions** for cloud services. +- **Enable multi-factor authentication (MFA)** for all cloud accounts. + +# 18. Ensure regular security audits and penetration testing + +Vibe coding is not a replacement for **manual security audits and penetration testing**. Even if AI generates seemingly correct code, vulnerabilities can exist in the business logic, integrations, or configurations. + +To ensure ongoing security: + +- Perform **static analysis** (SAST) using tools like **SonarQube**. +- Conduct **dynamic analysis** (DAST) with penetration testing tools like **Burp Suite**. +- Schedule **manual penetration tests** at least **twice a year** to uncover logic flaws. + +Security audits help identify overlooked risks and improve the security posture of vibe coding. + +# 19. Educate developers on AI security risks + +AI-generated code is **only as secure as the developer using it**. Many developers assume AI-generated code is flawless, but without security knowledge, they might integrate insecure solutions. + +If you're reading this as a manager, CTO, or organization leader, you should: + +- Train developers in **secure coding principles**. +- Educate teams on **AI-generated code risks** and common mistakes. +- Require **peer reviews** for all code before deployment. + +Security awareness is the first defense against AI-related vulnerabilities. + +# 20. Use updated AI models and validate their outputs + +AI-generated code will continue to improve, but as a developer, you must ensure you use **updated models**. Older AI models may lack awareness of recent security best practices, and might more easily generate outdated or vulnerable code. + +Regularly review: + +- AI-generated **dependencies** and libraries. +- Security patches and updates for AI-assisted or vibe coding development tools. +- AI-generated security policies and configurations. + +By staying up to date, you can use AI safely while mitigating risks. + +# Final thoughts + +Vibe coding can be a great advantage if done correctly, but AI-generated code **must never be blindly trusted**. Security remains a human responsibility, requiring carefulness, un-rushed review, and adherence to best practices to ensure applications are protected. Many software applications can seriously affect people's lives, and therefore, security should never be taken lightly. + +By following these **security principles**, you can take proper advantage of vibe coding and ai-assisted development. \ No newline at end of file diff --git a/src/routes/blog/post/what-is-mcp/+page.markdoc b/src/routes/blog/post/what-is-mcp/+page.markdoc index bb3d8e77a..b964791ba 100644 --- a/src/routes/blog/post/what-is-mcp/+page.markdoc +++ b/src/routes/blog/post/what-is-mcp/+page.markdoc @@ -7,7 +7,8 @@ cover: /images/blog/what-is-mcp/cover.png timeToRead: 7 author: ebenezer-don category: tutorial -featured: true +featured: false +callToAction: true --- If you've ever tried using an AI assistant for something practical, like pulling real data from your work files, checking a database, or sending a message, then you've probably hit a frustrating wall. diff --git a/src/routes/blog/post/why-multi-cloud-is-taking-over/+page.markdoc b/src/routes/blog/post/why-multi-cloud-is-taking-over/+page.markdoc new file mode 100644 index 000000000..e6ba8f81e --- /dev/null +++ b/src/routes/blog/post/why-multi-cloud-is-taking-over/+page.markdoc @@ -0,0 +1,84 @@ +--- +layout: post +title: Why multi-cloud is taking over +description: Multi-cloud is becoming the go-to solution for organizations of all sizes. Learn how it offers better flexibility, control, and performance. +date: 2025-04-17 +cover: /images/blog/why-multi-cloud-is-taking-over/cover.png +timeToRead: 4 +author: aditya-oberai +category: product +callToAction: true +--- + +Choosing the right cloud provider can be challenging, which is why more businesses are turning to **multi-cloud,** using services from multiple cloud providers instead of relying on just one. + +The newly announced Appwrite Network is a prime example, with its multi-cloud, global, and vendor-agnostic approach. Why multi-cloud? It's simple: it offers better flexibility, control, and performance. + +Let's break down why multi-cloud is becoming the go-to solution for organizations of all sizes. + +# What is multi-cloud? + +Multicloud means using more than one cloud provider, like AWS, Google Cloud, or Microsoft Azure, for different services. Instead of putting all your eggs in one basket, you spread them out, using the strengths of each provider. + +This approach lets you select the best features from different vendors to meet your business needs, reducing the risk of vendor lock-in. + +More organizations are adopting multi-cloud strategies because they allow applications to run where needed without adding unnecessary complexity. + +# Benefits of going multi-cloud + +Appwrite Network uses a multi-cloud, agnostic approach for several key reasons. By leveraging multiple clouds, Appwrite can distribute its services globally, reducing latency and ensuring a more reliable and faster user experience across different regions. + +## 1. **No vendor lock-In** + +Relying on one cloud provider can be risky. What if their prices go up? Or their services start to slow down? Multicloud keeps your options open. You're free to switch things up whenever you want without being tied to one vendor's rules or pricing. + +## 2. **Better performance and cost savings** + +Every cloud platform has its strengths. Some are great at handling data, while others excel at running applications. With multi-cloud, you can pick the best tool for each job. This means you get better performance and can even save money by optimizing your cloud use. + +For instance, you could use Google Cloud for your AI projects while letting AWS handle your data storage—getting the best of both worlds without overspending. + +## 3. **Global reach** + +With multi-cloud, your business isn't limited to the geographical reach of a single provider. You can leverage multiple cloud providers to have a truly **global presence**. Need a data center in Asia, Europe, and North America? No problem. By using different cloud services in different regions, you can reach users wherever they are—faster and more reliably. + +This also comes in handy when dealing with data sovereignty laws, which often require data to be stored in specific countries. With multi-cloud, you can easily store data in compliance with local regulations while still maintaining a global footprint. + +## 4. **Reduced latency** + +One of the biggest challenges in cloud computing is **latency**—the delay between a user making a request and the system responding. When your cloud provider's data center is far from your user, that lag can be noticeable. With multi-cloud, you can strategically place your services on data centers that are closest to your users, reducing latency and speeding up performance. + +For example, if your app has users in Europe and Asia, you can deploy servers in both regions through different providers. This reduces the time it takes for data to travel, resulting in a smoother, faster experience for your users. + +## 5. Data compliance and security + +If your business operates in multiple regions, you probably have to deal with different rules about where data is stored. With multi-cloud, you can store data in different locations using multiple providers, ensuring you meet all those pesky legal requirements. + +For example, you might store European data on a cloud provider that complies with GDPR while using another provider for data in the US. + +## 6. Flexibility + +Multi-cloud gives you access to a wider range of tools and technologies. Need a feature that one cloud offers but another doesn't? No problem. You can combine them. This flexibility allows you to stay agile and adapt quickly to changes in your business or technology needs. + +No single cloud provider is perfect at everything. Some excel at certain things, like AWS for scalability or Google Cloud for AI tools. By using multi-cloud, you get access to the best features each platform offers, helping you stay ahead of the competition. + +# Cons of multi-cloud + +While multi-cloud offers plenty of benefits, it also comes with some challenges that businesses need to consider: + +1. **Increased complexity**: Managing multiple cloud platforms can quickly become complicated. Each provider has its own set of tools, services, and interfaces, which require more time and expertise to manage efficiently. +2. **Higher costs**: Multicloud setups can lead to higher costs, as you may need to pay for additional services, data transfers, or even specialized management tools to keep everything running smoothly across providers. +3. **Security risks**: As more platforms are used, the attack surface expands, making security management more difficult. Businesses need to ensure strong security practices across all providers to avoid vulnerabilities. +4. **Data integration challenges**: Moving data between different cloud providers can be tricky. Ensuring seamless integration and preventing data silos is a common challenge in a multi-cloud environment. + +# Multicloud is the future + +Multicloud isn't just a trend. It's a smart strategy for businesses that want flexibility, reliability, and the best tools at their disposal. It frees you from vendor lock-in, optimizes performance, and gives you peace of mind with backup options. + +Multicloud is taking over because it puts the power back in the hands of businesses, letting them choose the right tools, minimize risks, and deliver a better user experience. + +If you'd like to learn more about how the Appwrite Network makes best use of the multi-cloud approach, take a look at these resources: + +- [Appwrite Network announcement](/blog/post/appwrite-network-announcement?doFollow=true) +- [How to reduce cloud latency](/blog/post/how-to-reduce-cloud-latency?doFollow=true) +- [Introducing Database Backups](/blog/post/introducing-database-backups?doFollow=true) diff --git a/src/routes/changelog/(entries)/2025-04-16.markdoc b/src/routes/changelog/(entries)/2025-04-16.markdoc new file mode 100644 index 000000000..e8d8c5e6b --- /dev/null +++ b/src/routes/changelog/(entries)/2025-04-16.markdoc @@ -0,0 +1,22 @@ +--- +layout: changelog +title: "Announcing the Appwrite Network: Appwrite’s vision for a global cloud infrastructure" +date: 2025-04-16 +cover: /images/changelog/2025-04-15.png +--- + +We’re excited to launch the **Appwrite Network**, a global network of cloud regions and edge locations designed to enhance Appwrite Cloud’s availability, performance, and regulatory compliance. + +Starting today, all Pro users can access three regions: **Frankfurt (FRA)**, our first region, and two new regions in **New York City (NYC)** and **Sydney (SYD)**. These new regions will be available to all Cloud users in the coming weeks, with more regions to follow. + +# Key features of the Appwrite Network + +- **Reduced latency with global coverage:** By distributing regions and edge locations worldwide, we minimize physical distance and routing delays, ensuring faster response times and better user experiences. + +- **Regional data control with global access:** Choose where your data resides to meet local regulations and optimize for performance, while still ensuring global availability through Appwrite’s interconnected network. + +- **Global CDN with built-in DDoS protection:** Deliver content faster with our CDN powered by strategically placed PoPs, and stay secure with integrated DDoS mitigation that filters threats in real-time. + +We’re just getting started with the Appwrite Network and can’t wait to share what’s next. Thanks for being part of the journey, together, we’re shaping the future of cloud platforms for developers. + +[Read the announcement to learn more](/blog/post/the-appwrite-network). diff --git a/src/routes/changelog/[[page]]/+page.svelte b/src/routes/changelog/[[page]]/+page.svelte index b96b5b266..0377391f0 100644 --- a/src/routes/changelog/[[page]]/+page.svelte +++ b/src/routes/changelog/[[page]]/+page.svelte @@ -5,11 +5,12 @@ import { DEFAULT_DESCRIPTION, DEFAULT_HOST } from '$lib/utils/metadata'; import { onMount } from 'svelte'; import ChangelogEntry from '../ChangelogEntry.svelte'; - import { page } from '$app/stores'; + import { page } from '$app/state'; import { CHANGELOG_KEY } from '../utils'; import { TITLE_SUFFIX } from '$routes/titles'; + import { Button } from '$lib/components/ui'; - export let data; + let { data } = $props(); const seo = { title: 'Changelog' + TITLE_SUFFIX, @@ -23,7 +24,7 @@ } onMount(() => { - localStorage.setItem(CHANGELOG_KEY, $page.data.changelogEntries.toString()); + localStorage.setItem(CHANGELOG_KEY, page.data.changelogEntries.toString()); }); @@ -48,22 +49,24 @@
-
+

Changelog

    {#each data.entries as entry}
  • -
    +
    - +
  • {/each}
{#if data.nextPage} - Load more {/if}
@@ -128,12 +131,6 @@ } } - button { - margin-block-start: 5rem; - margin-inline: auto; - min-inline-size: 10.9375rem; - } - @media screen and (max-width: 512px) { ul { padding-inline-start: 0; diff --git a/src/routes/changelog/entry/[entry]/+page.svelte b/src/routes/changelog/entry/[entry]/+page.svelte index 49e8d7e5a..ce5f8062c 100644 --- a/src/routes/changelog/entry/[entry]/+page.svelte +++ b/src/routes/changelog/entry/[entry]/+page.svelte @@ -1,15 +1,15 @@ @@ -50,16 +48,18 @@ import MetricCard from '$lib/components/MetricCard.svelte'; import { newsletter } from '$lib/components/Newsletter.svelte'; import PreFooter from '$lib/components/PreFooter.svelte'; - import { GITHUB_REPO_LINK, GITHUB_STARS } from '$lib/constants'; import { Main } from '$lib/layouts'; import { DEFAULT_HOST } from '$lib/utils/metadata'; import { TITLE_SUFFIX } from '$routes/titles'; - import type { EventCardProps } from './EventCard.svelte'; import EventCard from './EventCard.svelte'; import type { ProjectCardProps } from './ProjectCard.svelte'; import ProjectCard from './ProjectCard.svelte'; - export let data; + import { SOCIAL_STATS } from '$lib/constants'; + import { Button, Icon } from '$lib/components/ui'; + import InlineTag from '$lib/components/ui/inline-tag.svelte'; + + let { data } = $props(); const projects: ProjectCardProps[] = [ { @@ -93,21 +93,21 @@ ]; const metrics = [ - { metric: `${GITHUB_STARS}+`, description: 'GitHub Stars' }, - { metric: '3K+', description: 'Pull Requests' }, - { metric: '21K+', description: 'Commits' }, - { metric: '3K+', description: 'Issues' }, - { metric: '500+', description: 'Open Issues' }, - { metric: '2.5K+', description: 'Closed Issues' }, - { metric: '3.5K+', description: 'Forks' }, - { metric: '800+', description: 'Contributors' } + { metric: SOCIAL_STATS.GITHUB.STAT, description: 'GitHub Stars' }, + { metric: SOCIAL_STATS.GITHUB.EXTRA!.PULL_REQUESTS, description: 'Pull Requests' }, + { metric: SOCIAL_STATS.GITHUB.EXTRA!.COMMITS, description: 'Commits' }, + { metric: SOCIAL_STATS.GITHUB.EXTRA!.ISSUES, description: 'Issues' }, + { metric: SOCIAL_STATS.GITHUB.EXTRA!.OPEN_ISSUES, description: 'Open Issues' }, + { metric: SOCIAL_STATS.GITHUB.EXTRA!.CLOSED_ISSUES, description: 'Closed Issues' }, + { metric: SOCIAL_STATS.GITHUB.EXTRA!.FORKS, description: 'Forks' }, + { metric: SOCIAL_STATS.GITHUB.EXTRA!.CONTRIBUTORS, description: 'Contributors' } ]; - let name = ''; - let email = ''; - let submitted = false; - let error: string | undefined; - let submitting = false; + let name = $state(''); + let email = $state(''); + let submitted = $state(false); + let error: string | undefined = $state(); + let submitting = $state(false); async function submit() { submitting = true; @@ -157,7 +157,7 @@
-
+

Built by a community of 800+ contributors @@ -169,24 +169,25 @@ worldwide.

@@ -207,8 +208,8 @@
-
-
+
+
-
+

The power of open source benefits us all @@ -237,14 +238,15 @@ start contributing.

@@ -277,22 +279,23 @@

Anyone can join and help Appwrite become better.

- - +
Issue #
-
+
- + {#snippet header()}

Upcoming Events

-
+ {/snippet} {#each events as event}
  • - View all projects - +
    • {#each projects as project} @@ -489,7 +493,7 @@
      • @@ -630,7 +634,10 @@ {:else}
        { + e.preventDefault(); + submit(); + }} class="flex flex-col gap-4" >
        @@ -657,9 +664,7 @@ bind:value={email} />
        - + {#if error} Something went wrong. Please try again later. diff --git a/src/routes/community/EventCard.svelte b/src/routes/community/EventCard.svelte index cd7d6baa3..1a8d3adc7 100644 --- a/src/routes/community/EventCard.svelte +++ b/src/routes/community/EventCard.svelte @@ -15,6 +15,8 @@ @@ -10,20 +11,20 @@
        - {$page.status} + {page.status}

        - {$page.error?.message ?? 'An error has occured'} + {page.error?.message ?? 'An error has occured'}

        - {#if $page.status === 404} + {#if page.status === 404}

        Sorry, it seems that the page you are looking for does not exist. Feel free to use our navigation menu or the button below to explore more of Appwrite's documentation.

        {/if} - +
        diff --git a/src/routes/docs/+page.svelte b/src/routes/docs/+page.svelte index 85cd851d8..eb3c3b075 100644 --- a/src/routes/docs/+page.svelte +++ b/src/routes/docs/+page.svelte @@ -1,6 +1,7 @@ + + + + + diff --git a/src/routes/docs/products/network/+page.markdoc b/src/routes/docs/products/network/+page.markdoc new file mode 100644 index 000000000..764faabe0 --- /dev/null +++ b/src/routes/docs/products/network/+page.markdoc @@ -0,0 +1,78 @@ +--- +layout: article +title: Network +description: Discover Appwrite's network architecture with global regions, edge nodes, and optimized routing. Explore how it ensures low latency, reliable performance, and scalable infrastructure for modern applications. +--- + +Appwrite's network is designed to deliver low-latency, high-performance experiences for developers and end-users alike. It leverages a robust Content Delivery Network (CDN) with edge locations across multiple regions to ensure fast and reliable data delivery. + +With distributed infrastructure and multiple deployment regions, Appwrite enables developers to build globally scalable applications while maintaining data sovereignty. Its architecture integrates seamlessly with APIs, storage, and databases, optimizing both speed and availability. + +{% only_dark %} +![Network map](/images/docs/network/dark/all-maps.png) +{% /only_dark %} +{% only_light %} +![Network map](/images/docs/network/all-maps.png) +{% /only_light %} + +# Components {% #components %} +The Appwrite Network is composed of multiple components that work together to deliver a seamless experience for developers and end-users. These components include: + +{% cards %} +{% cards_item href="/docs/products/network/regions" title="Regions" %} +Multi-region deployments for geo-redundancy, compliance and low-latency. +{% /cards_item %} +{% cards_item href="/docs/products/network/edges" title="Edges" %} +Edge nodes for fast request processing and reduced round-trip times. +{% /cards_item %} +{% cards_item href="/docs/products/network/cdn" title="CDN" %} +Global infrastructure for optimized routing, enabling faster and more consistent data delivery. +{% /cards_item %} +{% cards_item href="/docs/products/network/endpoints" title="Endpoints" %} +Dedicated endpoints for region-specific, edge, and compute workloads. +{% /cards_item %} +{% /cards %} + +## Region vs Edge {% #region-vs-edge %} + +In Appwrite, Regions are where all your core data and services live. This includes your databases, auth, functions, messaging, and storage. Regions are the source of truth, handling heavy workloads and ensuring your application runs reliably while keeping your data compliant with local regulations. + +Edges are about speed. They process requests closer to your users using smart geo-routing, reducing latency by handling compute tasks at the nearest edge location. Edges are perfect for serving cached content, executing lightweight computations, and optimizing user interactions. + +{% info title="Where to execute?" %} +The Appwrite Network is designed for flexibility. You can choose to run your serverless compute workload in your project's home region by using the `[ID].[REGION].appwrite.run` endpoint, or on the edge using the `[ID].appwrite.network` endpoint. Both your region and edge endpoints can be customized to use your own custom domain. +{% /info %} + +# Architecture {% #architecture %} + +Appwrite's network is designed to provide a balance between centralized compute and distributed delivery: +- Regions: Core infrastructure and data resides in global regions, where all services like databases, auth, functions, messaging, and storage operate. These regions ensure data sovereignty, compliance, and high availability for critical workloads. +- Edges: Distributed edge locations process requests closer to end-users, leveraging smart geo-routing to minimize latency. These edge handle tasks like caching, static content delivery, and lightweight compute to improve performance. +- Private Routing: Data moves between edge nodes and regions through optimized, low-latency connections to ensure fast and reliable communication. + +This setup separates heavy backend processing in regions from latency-sensitive tasks at the edge, enabling efficient handling of global workloads with minimal performance trade-offs. + +{% info title="Self-Hosting?" %} +Appwrite's self-hosted setup is designed and optimized for straightforward, single-region environments - making it an ideal choice for small to medium-scale workloads. +All Cloud users have access to the Appwrite Network. If you need to scale your self-hosted deployment or require additional solutions, please [contact us](/contact-us/enterprise). +{% /info %} + +# Features {% #features %} + +{% cards %} +{% cards_item href="/docs/products/network/ddos" title="DDoS mitigation" %} +Protects against distributed denial-of-service attacks, ensuring uninterrupted access. +{% /cards_item %} +{% cards_item href="/docs/products/network/tls" title="Transport Layer Security (TLS)" %} +Encrypts data in transit for secure and private communication. +{% /cards_item %} +{% cards_item href="/docs/products/network/waf" title="Web Application Firewall (WAF)" %} +Shields applications from common web vulnerabilities and attacks on the application layer. +{% /cards_item %} +{% cards_item href="/docs/products/network/compression" title="Compression" %} +Reduces data size in transit to improve transfer speed and efficiency. +{% /cards_item %} +{% cards_item href="/docs/products/network/caching" title="Caching" %} +Stores frequently accessed data for faster retrieval and lower latency. +{% /cards_item %} +{% /cards %} \ No newline at end of file diff --git a/src/routes/docs/products/network/caching/+page.markdoc b/src/routes/docs/products/network/caching/+page.markdoc new file mode 100644 index 000000000..3efd96ef2 --- /dev/null +++ b/src/routes/docs/products/network/caching/+page.markdoc @@ -0,0 +1,61 @@ +--- +layout: article +title: Caching +description: Learn how Appwrite uses smart caching strategies at the region, edge, and CDN levels to optimize performance and protect dynamic APIs, with advanced options for enterprise customers. +--- + +Appwrite employs a multi-layered caching approach to enhance the performance of your applications. By utilizing caching at the **region**, **edge**, and **CDN** levels, Appwrite ensures faster response times, optimized resource usage, and efficient handling of dynamic workloads. + +# Region-level {% #region-level %} + +At the region level, Appwrite provides smart in-memory caching for various resources: + +- **Documents**: Frequently accessed documents are cached in memory and automatically purged when updated, ensuring data consistency without manual intervention. +- **Storage files**: Frequently accessed files are cached in memory to reduce disk reads and improve performance. +- **Image transformations**: Processed images (e.g., resized or converted) are cached in memory for faster repeated requests, reducing processing overhead. + +Region-level caching is tightly integrated with Appwrite's APIs, optimizing performance while preserving data integrity. + +# Edge-level {% #edge-level %} + +At the edge, Appwrite employs smart caching for specific use cases: + +- **Compute builds**: Caches build artifacts for faster deployments and reduced latency during function executions. +- **Cold starts**: Pre-loads frequently accessed resources, reducing latency for new requests and improving application responsiveness. + +Edge-level caching complements region-level caching, ensuring optimal performance for globally distributed applications. + +# Private caching {% #cdn-caching %} +Appwrite's CDN layer includes **private caching**, a caching strategy designed to handle the dynamic and permission-sensitive nature of Appwrite's APIs and resources securely. + +**What is private caching?** + +In the HTTP context, private caching allows responses to be cached but ensures they are only served to the specific user or client that requested them. This is achieved using HTTP headers that control caching behavior. For example: + +- `Cache-Control: private, max-age=3600` + Indicates that the response can be cached, but only in a private cache (e.g., the user's browser). + +- `Cache-Control: no-store` + Ensures that no part of the response is cached, useful for highly sensitive or frequently changing data. + +- `Vary: Authorization` + Signals that the cached response varies based on the `Authorization` header, ensuring permission-specific responses are cached and served appropriately. + +**Why use private caching?** + +Appwrite's APIs often deliver personalized or restricted content based on user roles and permissions. Private caching ensures: + +- **Security**: Sensitive resources are securely cached and only served to the correct user. +- **Permission awareness**: API responses are tailored to each user's permissions, ensuring consistent behavior. +- **Performance**: By caching user-specific responses, private caching reduces backend load while maintaining secure and accurate data delivery. + +This approach prevents the accidental exposure of user-specific or restricted data through shared caches while still enabling performance optimizations where possible. + +# Caching rules {% #custom-caching %} + +Enterprise customers can collaborate with their Appwrite success manager to define custom caching rules tailored to their applications. This includes: +- Setting custom caching durations for specific resources. +- Defining exclusion rules for sensitive or frequently changing data. +- Optimizing cache invalidation strategies for complex workflows. + +For more information on upgrading to the enterprise plan, [contact sales](https://appwrite.io/contact-us/enterprise). \ No newline at end of file diff --git a/src/routes/docs/products/network/cdn/+page.markdoc b/src/routes/docs/products/network/cdn/+page.markdoc new file mode 100644 index 000000000..bc9d6c549 --- /dev/null +++ b/src/routes/docs/products/network/cdn/+page.markdoc @@ -0,0 +1,34 @@ +--- +layout: article +title: Content Delivery Network (CDN) +description: Learn about Appwrite's CDN, designed to optimize content delivery with compression, and edge optimization for improved performance and reduced latency. +--- + +Appwrite's CDN (Content Delivery Network) is a globally distributed system designed to enhance the speed, reliability, and security of your application's content delivery. With points of presence (PoPs) in over 120 cities worldwide, the CDN ensures low latency and consistent performance for users, no matter their location. + +{% only_dark %} +![PoPs map](/images/docs/network/dark/pops-map.png) +{% /only_dark %} +{% only_light %} +![PoPs map](/images/docs/network/pops-map.png) +{% /only_light %} + +# Key features {% #key-features %} + +- Global coverage: Fast access to content for users across continents through over 120 PoPs worldwide. Available on all projects. +- Reduced latency: By caching static content at edge nodes, the CDN minimizes the distance between the user and the requested data, significantly reducing latency. +- Dynamic content: The CDN supports both static and dynamic content delivery, seamlessly integrating with backend services hosted in Appwrite regions. +- Content optimization: Appwrite's CDN uses advanced compression algorithms to reduce data transfer sizes, further improving delivery times. +- High availability: Distributed edge nodes and redundant routing ensure that content remains accessible even during regional outages or high traffic loads. + +{% info title="Self-Hosting?" %} +Appwrite's self-hosted setup is optimized for local content delivery in single-region environments. Cloud users benefit from the global CDN with 120+ points of presence worldwide. If your self-hosted deployment requires distributed CDN capabilities, please [contact us](/contact-us/enterprise) to discuss custom solutions. +{% /info %} + +# Design {% #design %} + +- Caching strategy: Configurable cache policies for control over TTL and content invalidation. +- Secure delivery: All content is transmitted over TLS for secure, encrypted connections. +- Integration: The CDN works seamlessly with the Appwrite edges and backend regions, providing a unified experience for developers. + +By combining global caching, smart routing, and content optimization, the Appwrite CDN is built to handle the demands of modern, high-performance applications. \ No newline at end of file diff --git a/src/routes/docs/products/network/compression/+page.markdoc b/src/routes/docs/products/network/compression/+page.markdoc new file mode 100644 index 000000000..f588bda1d --- /dev/null +++ b/src/routes/docs/products/network/compression/+page.markdoc @@ -0,0 +1,110 @@ +--- +layout: article +title: Compression +description: +--- + +Appwrite is leveraging compression algorithms to both boost the performance of your app and to reduce and optimize bandwidth and storage costs for Appwrite developers. This page provides an in-depth explanation of the compression algorithms supported by Appwrite for API responses, image transformations, and storage buckets. + +# API {% #api %} + +Appwrite supports two primary algorithms for text-based responses: **Brotli** and **Gzip**. These algorithms are integral for improving data transfer speeds across the HTTP based APIs, especially when dealing with textual content, which tends to be highly compressible. + +- **Brotli**: Chosen for its superior compression efficiency, especially for smaller files. Brotli performs best in HTTP/2 and HTTP/3 environments, where smaller payloads mean faster transfers and lower bandwidth consumption. Its efficiency also allows for quicker decompression on modern clients. +- **Gzip**: Gzip remains supported for backward compatibility and for clients that do not yet fully support Brotli. Though Gzip has a lower compression ratio compared to Brotli, it is still a reliable fallback for older browsers and HTTP/1.1 connections. +- **Zstd**: Zstd offers very high compression ratios and significantly faster decompression speeds, making it ideal for server-to-server communication and large data transfers. While its browser support is limited compared to Brotli and Gzip, Zstd excels in scenarios where performance and efficiency are critical for backend processes. + +## Conditions {% #conditions %} +Compression in Appwrite is triggered dynamically based on several conditions. This ensures that we only compress data when it is beneficial for performance and that we avoid unnecessary overhead for small payloads or non-textual data. + +1. **MIME types**: Only text-based MIME types are eligible for compression. These include: +- `text/plain` +- `text/css` +- `text/javascript` +- `application/javascript` +- `text/html` +- `application/json` +- `image/svg+xml` +- `application/xml+rss` + +This selection is based on the nature of these content types being easily compressible, resulting in significant size reductions without loss of information. + +2. **Response size**: Compression is applied when the size of the response exceeds **1KB**. This threshold has been selected based on testing to minimize the CPU overhead of compression for small payloads, where the gains in bandwidth reduction are negligible. + +3. **Client-side support**: Clients indicate their support for specific compression algorithms via the `Accept-Encoding` HTTP header. Appwrite prioritizes compression based on the following client-provided values: + - `br`: Indicates support for Brotli compression. + - `zstd`: Indicates support for Zstandard compression. + - `gzip`: Indicates support for Gzip compression. + - `identity`: Indicates that no compression is supported or requested. + +## Prioritizations {% #prioritizations %} +Appwrite prioritizes Brotli over Gzip due to Brotli’s more efficient compression ratio, especially when dealing with text-based content like HTML, CSS, and JSON files. Brotli uses a sliding window dictionary that results in higher compression ratios at slower speeds, but in an HTTP/2 or HTTP/3 environment, the benefits outweigh the costs. Gzip is used as a fallback when Brotli is not supported by the client. + +| Algorithm {% width=120 %} | Ratio {% width=120 %} | Browsers | Notes | +|-----------|-------------------|-----------------------|---------------------------------------------------| +| Brotli | High | All modern browsers | Optimal for small text files; highly efficient. | +| Gzip | Medium | Universal | Broad compatibility with older and modern clients.| +| Zstd | Very High | Limited | High performance with faster decompression speeds, ideal for server-to-server communication. | +| Identity | None | Universal | Used when no compression is applied or supported. | + +## Enabling compression {% #enabling-compression-1 %} +Compression is enabled by default for eligible API responses in Appwrite. You do not need to manually enable it; Appwrite dynamically selects the best algorithm based on the client’s `Accept-Encoding` headers and the MIME type of the response. + +# Image transformations {% #image-transformations %} +Appwrite's API supports the [compression of image files](/docs/products/storage/images) during manipulation and preview generation. The primary reason for compressing images is to minimize file sizes while maintaining visual quality, thus reducing both bandwidth usage and storage costs. + +Appwrite supports both legacy and modern image formats, including: + +- **PNG**, **JPEG**, **GIF**: These are traditional formats supported for compatibility reasons. PNG supports lossless compression, while JPEG and GIF are lossy but optimized for small sizes. +- **WebP**: A modern format developed by Google, offering better compression rates than JPEG, PNG, or GIF while maintaining equivalent quality. +- **AVIF**: The most modern image format supported by Appwrite, which offers even higher compression rates than WebP. AVIF is based on the AV1 video codec and is optimized for high-performance image rendering with minimal bandwidth use. + +## Supported API endpoints {% #supported-api-endpoints %} + +Appwrite applies image compression exclusively through the Image Preview API. This ensures that any dynamic operations, such as generating previews, resizing images, or converting between formats, are optimized for performance and reduced file size. Images uploaded through the Storage API remain in their original format and quality without automatic compression to preserve your source of truth. + +## Prioritization {% #prioritization %} + +Appwrite does not apply any image compression by default. Developers have full control over the output compression by specifying it in the query string when using the Image Preview API. This allows for precise customization to suit various use cases. + +Appwrite supports modern image formats like WebP and AVIF for their exceptional compression rates and compatibility with most browsers. While WebP is often the default choice for conversions, AVIF is recommended when seeking optimal performance and minimal file sizes. + +```javascript +import { Client, Storage } from "appwrite"; + +const client = new Client(); +const storage = new Storage(client); + +client + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID +; + +const result = storage.getFilePreview( + 'photos', // bucket ID + 'sunset.png', // file ID + 1800, // width, will be resized using this value. + 0, // height, ignored when 0 + 'center', // crop center + '90', // slight compression + 5, // border width + 'CDCA30', // border color + 15, // border radius + 1, // full opacity + 0, // no rotation + 'FFFFFF', // background color + 'webp' // output jpg format +); + +console.log(result.href); +``` + +| Algorithm {% width=120 %} | Formats | Ratio {% width=120 %} | Notes | +| --------- | ----------------- | ----------------- | -------------------- | +| WebP | PNG, JPEG, GIF | High | Great balance of compression efficiency and visual quality | +| AVIF | PNG, JPEG, GIF | Best | Highest compression rate for modern use cases | +| JPEG | JPEG | Medium | Legacy support for lossy compression | +| PNG | PNG | Lossless | Necessary for lossless compression requirements | + +## Enabling compression {% #enabling-compression-2 %} +You can enable image compression through the **Image Preview API** by specifying the desired output format in API calls. For example, requesting a WebP or AVIF conversion automatically triggers Appwrite's compression algorithms to optimize the image size. diff --git a/src/routes/docs/products/network/ddos/+page.markdoc b/src/routes/docs/products/network/ddos/+page.markdoc new file mode 100644 index 000000000..5d9b53662 --- /dev/null +++ b/src/routes/docs/products/network/ddos/+page.markdoc @@ -0,0 +1,33 @@ +--- +layout: article +title: DDoS mitigation +description: Learn how Appwrite protects your applications from Distributed Denial-of-Service (DDoS) attacks with built-in, always-on protection for all Appwrite Cloud plans. +--- + +Distributed Denial-of-Service (DDoS) attacks are one of the most common threats to online applications, aimed at overwhelming servers with malicious traffic to disrupt services. Appwrite provides robust, always-on DDoS protection across all Appwrite Cloud plans to ensure the reliability and security of your applications. + +Appwrite's network is designed to detect and mitigate malicious traffic before it reaches your application. Using a combination of automated filtering and intelligent traffic analysis, our DDoS protection: + +- Identifies and blocks large-scale attack patterns in real-time. +- Ensures legitimate traffic continues to flow uninterrupted. +- Prevents application downtime and minimizes performance impacts. + +# Design {% #design %} + +Appwrite's DDoS protection operates across multiple OSI layers to provide comprehensive coverage: + +- **Network Layer (Layer 3)**: Detects and mitigates large-scale attacks such as ICMP floods and UDP amplification. +- **Transport Layer (Layer 4)**: Protects against attacks like SYN floods and TCP-based exploits by identifying anomalous traffic patterns. +- **Application Layer (Layer 7)**: Blocks high-level attacks, such as HTTP floods, by filtering malicious requests while allowing legitimate user traffic. + +# Benefits {% #benefits %} + +- **Cost control**: Malicious traffic blocked by DDoS protection does not count towards your bandwidth or request usage, saving you from unnecessary charges. +- **Reliability**: Keeps your application online and responsive, even during attempted attacks. +- **Zero configuration**: DDoS protection is fully managed by Appwrite and requires no manual setup or maintenance. Protection is enabled by default on all Cloud plans. + +# Availability {% #availability %} + +DDoS mitigation is automatically enabled by default for all Appwrite Cloud plans, ensuring every application hosted on Appwrite benefits from this safeguard without additional costs. This includes: + +This protection is integrated directly into Appwrite's console, edge and region infrastructure, providing seamless coverage without requiring additional setup from developers. \ No newline at end of file diff --git a/src/routes/docs/products/network/edges/+page.markdoc b/src/routes/docs/products/network/edges/+page.markdoc new file mode 100644 index 000000000..5d5434fec --- /dev/null +++ b/src/routes/docs/products/network/edges/+page.markdoc @@ -0,0 +1,61 @@ +--- +layout: article +title: Edges +description: Learn about Appwrite edges, where lightweight compute tasks like caching, request routing, and content delivery are handled. Understand how edges enhance performance by bringing operations closer to end-users. +--- + +Appwrite edges are strategically distributed locations designed to process requests closer to your users. These edge nodes handle latency-sensitive operations, such as caching, routing, and quick computations, to deliver faster, more efficient interactions while reducing the load on your application's core infrastructure. + +{% only_dark %} +![Edges map](/images/docs/network/dark/edges-map.png) +{% /only_dark %} +{% only_light %} +![Edges map](/images/docs/network/edges-map.png) +{% /only_light %} + +{% info title="We're expanding!" %} +Currently, Appwrite's edge network includes 3 locations. We are actively working to expand the number of edge locations globally. New locations will be strategically prioritized to ensure the best possible global coverage and performance for all users. +{% /info %} + +# List {% #list %} + +Appwrite edges are globally distributed, ensuring low-latency interactions for users around the world. Here's a list of locations with active or upcoming edge support: + +| Location | Code{% width=120 %} | Status {% width=120 %} | +|---------------------|--------|-----------------| +| Frankfurt | FRA | Available | +| New York | NYC | Available | +| Sydney | SYD | Available | +| Singapore | SGP | 2025 | +| San Francisco | SFO | 2025 | +| Bangalore | BLR | 2025 | +| Amsterdam | AMS | 2025 | +| London | LON | 2025 | +| Toronto | TOR | 2025 | + +Edges complement Appwrite regions, working together to provide fast, reliable, and scalable application performance. + +# Routing {% #routing %} + +Appwrite's edges handle geo-aware routing to balance traffic across the network efficiently. When a user makes a request, it is directed to the nearest available edge node based on their geographic location. This ensures optimal performance by minimizing latency and distributing traffic evenly across edge nodes. + +Geo-aware routing helps handle high traffic loads by intelligently directing requests to the best-performing edge, reducing congestion and maintaining consistent response times. By leveraging this approach, Appwrite ensures that your application delivers fast and reliable experiences to users worldwide. + +{% info title="Edge vs Region" %} +Use an edge when compute needs to happen close to your users, like serving static content, doing local computation or data processing. Use a region when compute needs to happen closer to your data, such as frequent access to your Appwrite database or storage. +{% /info %} + +# Design {% #design %} + +Edges are optimized to reduce latency and improve user experience by processing operations closer to the source of requests. Key aspects include: + +- Geo-routing: Smart routing ensures user requests are served by the optimal edge node. +- Caching: Frequently accessed data is cached at edges to reduce round-trips to core regions. +- Lightweight compute: Handles quick, resource-efficient computations for real-time tasks. +- Optimization: The edge network planned locations are strategically designed with fewer, high-capacity edges to maximize cache efficiency and achieve higher cache-hit ratios. + +Edges enhance Appwrite's ability to deliver fast, reliable experiences by optimizing interactions and reducing latency for end-users. Together with regions, they create a robust infrastructure designed for modern, globally distributed applications. + +{% info title="Self-Hosting?" %} +Appwrite's self-hosted deployments operate in a single region by default. The geo-distributed edge network with its routing features is available to Cloud users. For edge infrastructure in self-hosted environments or multi-region setups, please [contact us](/contact-us/enterprise) to explore enterprise options. +{% /info %} \ No newline at end of file diff --git a/src/routes/docs/products/network/endpoints/+page.markdoc b/src/routes/docs/products/network/endpoints/+page.markdoc new file mode 100644 index 000000000..09cff0900 --- /dev/null +++ b/src/routes/docs/products/network/endpoints/+page.markdoc @@ -0,0 +1,60 @@ +--- +layout: article +title: Endpoints +description: Understand the differences between Appwrite's endpoints, including geo-balanced edges, region-specific services, and custom domains for compute processes. +--- + +Appwrite offers multiple endpoints to access its services, each designed to optimize specific aspects of performance, routing, and compute. Understanding these endpoints helps you determine the most efficient way to interact with your Appwrite project. + +# Edge {% #edge %} + +The **`appwrite.network`** domain provides geo-balanced endpoints that route traffic to the nearest edge node based on the user's geographic location. + +{% info title="Availability" %} +The `appwrite.network` endpoints will be available in Q2 2025. Currently, you can use the `appwrite.run` domains to run functions in your region of choice. +{% /info %} + +The edge network endpoints are designed for: +- **Latency-sensitive operations**: Quickly serving cached content, routing requests, or performing lightweight edge computations. +- **Global traffic distribution**: Automatically balancing traffic across the edge network for consistent performance. + +Example: +- `https://[ID].appwrite.network` + +Use this endpoint when optimizing for low-latency and global availability is critical for your functions. + +# Region {% #region %} + +The **`[REGION].cloud.appwrite.io`** domain directs traffic specifically to the region hosting your Appwrite project's services. This endpoint ensures that requests are processed close to your core data and infrastructure, making it ideal for: + +- **Data-intensive operations**: Frequent access to databases, storage, authentication, and other region-hosted services. +- **Regulatory compliance**: Ensuring data residency requirements are met by targeting specific regions. + +Example: +- `https://fra.cloud.appwrite.io` +- `https://nyc.cloud.appwrite.io` + +Use this endpoint when direct access to region-specific infrastructure is required, this is the endpoint you will use to access your Appwrite API or if you want to execute functions directly from your Appwrite SDK. + +# Compute {% #compute %} + +The **`[ID].[REGION].appwrite.run`** domain is designed for running server-side functions and compute-heavy tasks directly in the region where your services are hosted. It supports custom domains for seamless integration into your workflows. The `appwrite.run` subdomains are auto-generated for each function you create. This endpoint is best suited for: + +- **Compute-Intensive Tasks**: Executing server-side functions, handling APIs, or processing asynchronous jobs. +- **Custom Domain Support**: Enabling custom domains for specific function endpoints. + +Examples: +- `https://fra.appwrite.run` +- `https://[custom-domain]` + +Use this endpoint for scenarios where compute needs to happen close to your data or for deploying APIs under your own domain. + +# Summary {% #summary %} + +| Endpoint | Use Case | +|--------------------------------------|------------------------------------------------------| +| `https://[ID].appwrite.network` | Geo-balanced edges for low-latency operations | +| `https://[REGION].cloud.appwrite.io` | Direct access to region services | +| `https://[ID].[REGION].appwrite.run` | Region-based compute and function execution | + +Knowing how these endpoints work helps you choose the right one for your needs, ensuring better performance and alignment with your application's compliance requirements. \ No newline at end of file diff --git a/src/routes/docs/products/network/regions/+page.markdoc b/src/routes/docs/products/network/regions/+page.markdoc new file mode 100644 index 000000000..8146d3a30 --- /dev/null +++ b/src/routes/docs/products/network/regions/+page.markdoc @@ -0,0 +1,54 @@ +--- +layout: article +title: Regions +description: Learn about Appwrite regions, where core services like databases, auth, functons, sites and storage are hosted. Understand data sovereignty, fault isolation, and scalability for compliant, high-performance deployments +--- + +Appwrite regions are geographic locations where all your application's core infrastructure is deployed. Each region operates as an independent, highly available cluster, managing the storage, processing, and serving of your data and Appwrite services. + +{% only_dark %} +![Regions map](/images/docs/network/dark/regions-map.png) +{% /only_dark %} +{% only_light %} +![Regions map](/images/docs/network/regions-map.png) +{% /only_light %} + +# List {% #list %} + +Appwrite is currently available in the following list of regions: + +| Region {% width=120 %} | Code{% width=120 %} | Endpoint | Status{% width=120 %} | +|---------------------|--------|-----------------------------------------|-----------------| +| Frankfurt | FRA | `https://fra.cloud.appwrite.io/v1` | Available | +| New York | NYC | `https://nyc.cloud.appwrite.io/v1` | Available | +| Sydney | SYD | `https://syd.cloud.appwrite.io/v1` | Available | +| Singapore | SGP | `coming soon` | Q4 2025 | +| San Francisco | SFO | `coming soon` | Q4 2025 | +| Bangalore | BLR | `coming soon` | TBD | +| Amsterdam | AMS | `coming soon` | TBD | +| London | LON | `coming soon` | TBD | +| Toronto | TOR | `coming soon` | TBD | + +Regions are designed to be entirely independent unless explicitly connected, which provides control over data replication and compliance. We're constantly working to add new regions to our network to provide developers with more options for deploying their applications. + +# Choosing a region {% #choosing-a-region %} + +Selecting a region impacts both your application’s performance and its compliance with local regulations. Regions are isolated from each other, so your data and services remain contained within the selected location. When choosing a region, consider proximity to your primary user base to reduce latency and improve response times. Additionally, ensure the region aligns with legal requirements for data residency and sovereignty specific to your application's domain. + +{% info title="Region vs Edge" %} +Use a region when compute needs to happen close to your data, such as frequent access to your Appwrite database or storage. Use an edge when compute needs to happen closer to your users, like serving static content, performing local computations, or handling data processing at the edge. +{% /info %} + + +# Design {% #design %} + +Regions are isolated environments designed for predictable performance and data security. Key aspects include: + +- Data storage: All data remains within the region and adheres to local data residency laws. +- Fault isolation: Each region is self-contained, so failures in one region do not impact others. +- Scalability: Resources within a region scale dynamically to meet application demands. +- Networking: Regions connect via secure, low-latency private networks. +- High availability: Redundant power, networking, and hardware configurations in data centers. +- Cache efficiency: Fewer, data-dense regions boost hit probability, ensuring popular content is readily available. + +Regions provide the foundation for running scalable, reliable applications with full control over data locality and compliance. \ No newline at end of file diff --git a/src/routes/docs/products/network/tls/+page.markdoc b/src/routes/docs/products/network/tls/+page.markdoc new file mode 100644 index 000000000..920b0fd67 --- /dev/null +++ b/src/routes/docs/products/network/tls/+page.markdoc @@ -0,0 +1,31 @@ +--- +layout: article +title: Transport Layer Security (TLS) +description: Learn how Appwrite uses TLS to encrypt data in transit, ensuring secure and private communication between clients and servers. +--- + +Transport Layer Security (TLS) is a critical feature of the Appwrite Network, ensuring that all data exchanged between clients and servers is encrypted and secure. By using TLS, Appwrite protects sensitive information from interception, tampering, and unauthorized access during transit. + +TLS operates at the **transport layer** of the OSI model (Layer 4), encrypting all data before it is transmitted over the network. This includes securing HTTP traffic via HTTPS. When a client connects to Appwrite services, a TLS handshake is performed to establish a secure connection. This process ensures: + +- **Encryption**: Data is encrypted to prevent unauthorized access during transmission. +- **Integrity**: Ensures that data cannot be tampered with or altered. +- **Authentication**: Verifies the identity of the server to protect against impersonation or spoofing. + +# Key features {% #key-features %} + +1. **Modern protocols** + Appwrite supports TLS 1.2 and TLS 1.3, offering the latest in encryption standards and performance optimization. + +2. **Automatic certificates** + TLS certificates are automatically managed and renewed, ensuring that your applications always run on secure connections without manual intervention. + +3. **Strong ciphers** + Only strong, industry-standard cipher suites are used to ensure robust encryption. + +4. **End-to-end security** + TLS secures every connection in Appwrite's network, including communication between edge nodes and regions, protecting your data at every step. + +# Getting started {% #getting-started %} + +TLS is enabled by default on all Appwrite endpoints, requiring no additional configuration from developers. Simply use HTTPS when interacting with Appwrite services, and your data will be secured automatically. \ No newline at end of file diff --git a/src/routes/docs/products/network/waf/+page.markdoc b/src/routes/docs/products/network/waf/+page.markdoc new file mode 100644 index 000000000..36c13c0dd --- /dev/null +++ b/src/routes/docs/products/network/waf/+page.markdoc @@ -0,0 +1,114 @@ +--- +layout: article +title: Web application firewall (WAF) +description: Appwrite's Web Application Firewall (WAF) provides enterprise-grade protection against web vulnerabilities like SQL injection, XSS, and DDoS attacks. +--- + +The Web Application Firewall (WAF) is a critical feature of the Appwrite Network, designed to protect applications from common web vulnerabilities and attacks. Available exclusively to enterprise customers, WAF can be configured through your Appwrite success manager to meet the specific security needs of your application. + +{% info title="Availability" %} +The WAF feature is available exclusively to enterprise customers as part of the Appwrite enterprise offering. Setup and configuration are managed through your dedicated Appwrite success manager, who ensures that the WAF aligns with your application's requirements and evolves with emerging security threats. +{% /info %} + +The WAF functions as a protective barrier at the application layer (Layer 7) of the OSI model, where it inspects and filters HTTP/HTTPS traffic in real-time. It is specifically designed to safeguard your application by analyzing request headers, payloads, and query strings to identify malicious patterns or anomalies. The WAF intercepts traffic before it reaches your application, blocking threats such as: + +- SQL injection: Malicious input targeting database queries is identified and neutralized by inspecting payloads and request parameters. +- Cross-site scripting (XSS): WAF detects and blocks scripts attempting to manipulate or steal client-side data through injection into the DOM or other contexts. +- Cross-site request forgery (CSRF): By analyzing session headers and request origins, the WAF ensures only legitimate actions are processed. +- DDoS attacks: Although primarily focused on Layer 7 attacks, the WAF works in tandem with other mitigation systems to handle floods of application-level requests. + +# Design {% #design %} + +1. **Traffic inspection** + The WAF analyzes all incoming HTTP/HTTPS requests in real-time, matching them against a dynamic set of security rules. + +2. **Threat mitigation** + Suspicious requests are blocked before they reach your application, ensuring uninterrupted service and secure user interactions. + +3. **Custom rules** + Enterprise customers can work with their success manager to define custom rules tailored to their specific application requirements. + +# Key features {% #key-features %} + +- Real-time protection: Continuous monitoring and blocking of malicious traffic. +- Customizable rulesets: Configure WAF policies to align with your application's unique architecture. +- Compliance support: Meet security standards and regulatory requirements by safeguarding sensitive data. +- Seamless integration: Fully integrated into the Appwrite network, ensuring optimal performance and low-latency security enforcement. + +# Getting started {% #getting-started %} + +If you're an enterprise customer, reach out to your success manager to enable WAF for your applications. They'll guide you through the setup process, help configure custom rules, and ensure your application is fully protected. + +For more information on upgrading to the enterprise plan, [contact sales](https://appwrite.io/contact-us/enterprise). + +## Configuration {% #configuration %} + +Appwrite's WAF is designed to adapt to the specific needs of your applications. Tailored rules and actions can be implemented to address evolving security threats and traffic patterns effectively. + +### Rules {% #rules %} + +The WAF supports the creation of fine-grained rules using logical expressions. These rules define how incoming traffic is inspected and handled. + +1. **Expression-based rules** + Use logical expressions to create granular filters for incoming requests. These expressions operate on HTTP request fields, headers, cookies, and metadata. + + Examples of configurable expressions: + - **URL matching**: Block or allow traffic based on URL patterns (e.g., `/v1/functions/*`). + - **Request method**: Filter traffic based on HTTP methods (e.g., `GET`, `POST`, `PUT`). + - **Header inspection**: Inspect headers like `User-Agent`, `Authorization`, or `X-Forwarded-For`. + - **Cookie validation**: Check for specific cookies or validate their values to identify bot or malicious traffic. + - **Rate limiting**: Match requests based on IP or session-level rate thresholds. + - **Geolocation rules**: Allow or block traffic based on the geographic location of the user. + +2. **Regular expressions (Regex)** + Use regex patterns for more advanced filtering, such as matching complex URL structures, payloads, or specific query parameters. + +3. **IP Filtering** + Define rules to block, allow, or challenge traffic from specific IP ranges or CIDR blocks. + +### Actions {% #actions %} + +Based on the defined rules, the WAF can perform various actions to handle traffic appropriately. + +1. **Allow** + Allows the request to pass through to the backend without modification. + +2. **Block** + Rejects the request entirely, responding with an appropriate HTTP status code (e.g., `403 Forbidden`). + +3. **Challenge** + Issues a challenge (e.g., CAPTCHA) to validate whether the request originates from a legitimate user. + +4. **Redirect** + Redirects the request to a specified URL. Useful for handling deprecated endpoints or re-routing unauthorized traffic. + +5. **Log** + Records the request in detailed logs for further analysis without altering the request flow. + +6. **Rate limiting** + Throttles traffic from specific IPs or sessions that exceed defined thresholds, reducing the risk of abuse or overload. + +7. **Modify request** + Dynamically alters request components, such as headers, query parameters, or cookies. + +### Examples {% #examples %} + +#### Blocking malicious bots +- **Expression**: Match requests with suspicious `User-Agent` strings or invalid headers. +- **Action**: Block or issue a CAPTCHA challenge to confirm legitimate traffic. + +#### Preventing SQL injection +- **Expression**: Match payloads or query strings containing SQL keywords like `SELECT`, `DROP`, or `--`. +- **Action**: Block the request and log it for analysis. + +#### Rate limiting by endpoint +- **Expression**: Limit requests to sensitive endpoints (e.g., `/login`) to prevent abuse. +- **Action**: Throttle or temporarily block repeated requests from the same IP. + +#### Geo-based blocking +- **Expression**: Match requests originating from specific regions or countries. +- **Action**: Block or redirect users to a region-specific notice page. + +#### Header enforcement +- **Expression**: Check for required headers (e.g., `Authorization`) on API requests. +- **Action**: Block requests missing critical headers. \ No newline at end of file diff --git a/src/routes/docs/products/storage/buckets/+page.markdoc b/src/routes/docs/products/storage/buckets/+page.markdoc index 456b7605a..59b0fb67d 100644 --- a/src/routes/docs/products/storage/buckets/+page.markdoc +++ b/src/routes/docs/products/storage/buckets/+page.markdoc @@ -36,7 +36,7 @@ const client = new sdk.Client(); const storage = new sdk.Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID .setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key ; @@ -58,7 +58,7 @@ let client = new sdk.Client(); let storage = new sdk.Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID .setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key ; @@ -81,7 +81,7 @@ use Appwrite\Services\Storage; $client = new Client(); $client - ->setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + ->setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint ->setProject('') // Your project ID ->setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key ; @@ -97,7 +97,7 @@ from appwrite.services.storage import Storage client = Client() (client - .set_endpoint('https://cloud.appwrite.io/v1') # Your API Endpoint + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint .set_project('') # Your project ID .set_key('919c2d18fb5d4...a2ae413da83346ad2') # Your secret API key ) @@ -112,7 +112,7 @@ require 'Appwrite' include Appwrite client = Client.new - .set_endpoint('https://cloud.appwrite.io/v1') # Your API Endpoint + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint .set_project('') # Your project ID .set_key('919c2d18fb5d4...a2ae413da83346ad2') # Your secret API key @@ -128,7 +128,7 @@ using Appwrite.Services; using Appwrite.Models; var client = new Client() - .SetEndPoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .SetProject("") // Your project ID .SetKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key @@ -146,7 +146,7 @@ void main() { // Init SDK Storage storage = Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID .setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key ; @@ -169,7 +169,7 @@ import io.appwrite.Client import io.appwrite.services.Storage val client = Client(context) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key @@ -186,7 +186,7 @@ import io.appwrite.coroutines.CoroutineCallback; import io.appwrite.services.Storage; Client client = new Client() - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key @@ -209,7 +209,7 @@ storage.createBucket( import Appwrite let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key diff --git a/src/routes/docs/products/storage/images/+page.markdoc b/src/routes/docs/products/storage/images/+page.markdoc index 6b687a5c0..72b4aeab9 100644 --- a/src/routes/docs/products/storage/images/+page.markdoc +++ b/src/routes/docs/products/storage/images/+page.markdoc @@ -47,7 +47,7 @@ const client = new Client(); const storage = new Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; @@ -77,7 +77,7 @@ void main() { // Init SDK Storage storage = Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; // downloading file @@ -123,7 +123,7 @@ import Appwrite func main() async throws { let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID let storage = Storage(client) let byteBuffer = try await storage.getFilePreview( @@ -159,7 +159,7 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) val client = Client(applicationContext) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID val storage = Storage(client) diff --git a/src/routes/docs/products/storage/quick-start/+page.markdoc b/src/routes/docs/products/storage/quick-start/+page.markdoc index f18492247..ed69ca390 100644 --- a/src/routes/docs/products/storage/quick-start/+page.markdoc +++ b/src/routes/docs/products/storage/quick-start/+page.markdoc @@ -23,7 +23,7 @@ To upload a file, add this to your app. For web apps, you can use the File objec import { Client, Storage } from "appwrite"; const client = new Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); const storage = new Storage(client); @@ -66,7 +66,7 @@ To upload a file, add this to your app. For web apps, you can use the File objec void main() { // Init SDK final client = Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); final storage = Storage(client); @@ -83,7 +83,7 @@ To upload a file, add this to your app. For web apps, you can use the File objec func main() async throws { let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("") let storage = Storage(client) @@ -104,7 +104,7 @@ To upload a file, add this to your app. For web apps, you can use the File objec suspend fun main() { val client = Client(applicationContext) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID val storage = Storage(client) @@ -155,7 +155,7 @@ const client = new Client(); const storage = new Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; @@ -171,7 +171,7 @@ void main() { // Init SDK Storage storage = Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; // downloading file @@ -206,7 +206,7 @@ import Appwrite func main() async throws { let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID let storage = Storage(client) let byteBuffer = try await storage.getFileDownload( @@ -231,7 +231,7 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) val client = Client(applicationContext) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID val storage = Storage(client) diff --git a/src/routes/docs/products/storage/upload-download/+page.markdoc b/src/routes/docs/products/storage/upload-download/+page.markdoc index 28916089f..d4be63b95 100644 --- a/src/routes/docs/products/storage/upload-download/+page.markdoc +++ b/src/routes/docs/products/storage/upload-download/+page.markdoc @@ -19,7 +19,7 @@ You can also upload files programmatically using our SDKs: import { Client, Storage } from "appwrite"; const client = new Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); const storage = new Storage(client); @@ -62,7 +62,7 @@ You can also upload files programmatically using our SDKs: void main() { // Init SDK final client = Client() - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); final storage = Storage(client); @@ -81,7 +81,7 @@ You can also upload files programmatically using our SDKs: suspend fun main() { val client = Client(applicationContext) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID val storage = Storage(client) @@ -99,7 +99,7 @@ You can also upload files programmatically using our SDKs: func main() async throws { let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("") let storage = Storage(client) @@ -305,7 +305,7 @@ const client = new Client(); const storage = new Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; @@ -325,7 +325,7 @@ void main() { // Init SDK Storage storage = Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; // downloading file @@ -360,7 +360,7 @@ import Appwrite func main() async throws { let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID let storage = Storage(client) let byteBuffer = try await storage.getFile( @@ -385,7 +385,7 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) val client = Client(applicationContext) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID val storage = Storage(client) @@ -412,7 +412,7 @@ const client = new Client(); const storage = new Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; @@ -428,7 +428,7 @@ void main() { // Init SDK Storage storage = Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; // downloading file @@ -463,7 +463,7 @@ import Appwrite func main() async throws { let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID let storage = Storage(client) let byteBuffer = try await storage.getFileDownload( @@ -488,7 +488,7 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) val client = Client(applicationContext) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID val storage = Storage(client) @@ -515,7 +515,7 @@ const client = new Client(); const storage = new Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; @@ -531,7 +531,7 @@ void main() { // Init SDK Storage storage = Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; // downloading file @@ -566,7 +566,7 @@ import Appwrite func main() async throws { let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID let storage = Storage(client) let byteBuffer = try await storage.getFilePreview( @@ -591,7 +591,7 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) val client = Client(applicationContext) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID val storage = Storage(client) @@ -619,7 +619,7 @@ const client = new Client(); const storage = new Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; @@ -635,7 +635,7 @@ void main() { // Init SDK Storage storage = Storage(client); client - .setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint .setProject('') // Your project ID ; // downloading file @@ -670,7 +670,7 @@ import Appwrite func main() async throws { let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID let storage = Storage(client) let byteBuffer = try await storage.getFileView( @@ -695,7 +695,7 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) val client = Client(applicationContext) - .setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID val storage = Storage(client) diff --git a/src/routes/docs/quick-starts/+layout.svelte b/src/routes/docs/quick-starts/+layout.svelte index 7cffa98cf..02125ac0e 100644 --- a/src/routes/docs/quick-starts/+layout.svelte +++ b/src/routes/docs/quick-starts/+layout.svelte @@ -1,10 +1,10 @@ - + diff --git a/src/routes/docs/quick-starts/+page.svelte b/src/routes/docs/quick-starts/+page.svelte index 55f7a578d..6f3f2713b 100644 --- a/src/routes/docs/quick-starts/+page.svelte +++ b/src/routes/docs/quick-starts/+page.svelte @@ -202,7 +202,7 @@

        Quick start

        -
        +
        {#each quickStarts as category} @@ -219,7 +219,7 @@

        {quickStart.title}

        diff --git a/src/routes/docs/quick-starts/android/+page.markdoc b/src/routes/docs/quick-starts/android/+page.markdoc index a0d13f726..07059dc6a 100644 --- a/src/routes/docs/quick-starts/android/+page.markdoc +++ b/src/routes/docs/quick-starts/android/+page.markdoc @@ -102,7 +102,7 @@ object Appwrite { fun init(context: Context) { client = Client(context) - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("[PROJECT_ID]") account = Account(client) diff --git a/src/routes/docs/quick-starts/angular/+page.markdoc b/src/routes/docs/quick-starts/angular/+page.markdoc index a5cdc77a3..b14880e5d 100644 --- a/src/routes/docs/quick-starts/angular/+page.markdoc +++ b/src/routes/docs/quick-starts/angular/+page.markdoc @@ -74,7 +74,7 @@ import { Client, Account} from 'appwrite'; export const client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account = new Account(client); diff --git a/src/routes/docs/quick-starts/apple/+page.markdoc b/src/routes/docs/quick-starts/apple/+page.markdoc index 37a633ab9..efb7fdb89 100644 --- a/src/routes/docs/quick-starts/apple/+page.markdoc +++ b/src/routes/docs/quick-starts/apple/+page.markdoc @@ -110,7 +110,7 @@ class Appwrite { public init() { self.client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("[PROJECT_ID]") self.account = Account(client) diff --git a/src/routes/docs/quick-starts/dart/+page.markdoc b/src/routes/docs/quick-starts/dart/+page.markdoc index 352ef4e4b..3a8a30d69 100644 --- a/src/routes/docs/quick-starts/dart/+page.markdoc +++ b/src/routes/docs/quick-starts/dart/+page.markdoc @@ -78,7 +78,7 @@ var client = Client(); Future main() async { client - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("") .setKey(""); } @@ -200,7 +200,7 @@ Finally, revisit the `main()` function and call the functions created in previou ```dart Future main() async { client - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("") .setKey(""); diff --git a/src/routes/docs/quick-starts/deno/+page.markdoc b/src/routes/docs/quick-starts/deno/+page.markdoc index 705741288..df89a95c1 100644 --- a/src/routes/docs/quick-starts/deno/+page.markdoc +++ b/src/routes/docs/quick-starts/deno/+page.markdoc @@ -81,7 +81,7 @@ import { Client, ID, Databases, Models } from "https://deno.land/x/appwrite/mod. const client: Client = new Client(); client - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("") .setKey(""); ``` diff --git a/src/routes/docs/quick-starts/dotnet/+page.markdoc b/src/routes/docs/quick-starts/dotnet/+page.markdoc index 00b2a85b8..8d61182db 100644 --- a/src/routes/docs/quick-starts/dotnet/+page.markdoc +++ b/src/routes/docs/quick-starts/dotnet/+page.markdoc @@ -83,7 +83,7 @@ using Appwrite.Services; var client = new Client(); client - .SetEndpoint("https://cloud.appwrite.io/v1") + .SetEndpoint("https://.cloud.appwrite.io/v1") .SetProject("") .SetKey(""); ``` diff --git a/src/routes/docs/quick-starts/flutter/+page.markdoc b/src/routes/docs/quick-starts/flutter/+page.markdoc index 20de921ea..2e3d8c611 100644 --- a/src/routes/docs/quick-starts/flutter/+page.markdoc +++ b/src/routes/docs/quick-starts/flutter/+page.markdoc @@ -183,7 +183,7 @@ import 'package:appwrite/models.dart' as models; void main() { WidgetsFlutterBinding.ensureInitialized(); Client client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject(""); Account account = Account(client); diff --git a/src/routes/docs/quick-starts/kotlin/+page.markdoc b/src/routes/docs/quick-starts/kotlin/+page.markdoc index 7ba712996..195b7fc23 100644 --- a/src/routes/docs/quick-starts/kotlin/+page.markdoc +++ b/src/routes/docs/quick-starts/kotlin/+page.markdoc @@ -91,7 +91,7 @@ import io.appwrite.models.Collection import kotlinx.coroutines.coroutineScope val client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("") .setKey(""); ``` diff --git a/src/routes/docs/quick-starts/nextjs/+page.markdoc b/src/routes/docs/quick-starts/nextjs/+page.markdoc index c8c953b32..63e3bc5cc 100644 --- a/src/routes/docs/quick-starts/nextjs/+page.markdoc +++ b/src/routes/docs/quick-starts/nextjs/+page.markdoc @@ -74,7 +74,7 @@ import { Client, Account } from 'appwrite'; export const client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account = new Account(client); diff --git a/src/routes/docs/quick-starts/node/+page.markdoc b/src/routes/docs/quick-starts/node/+page.markdoc index 7736aec23..c50d4ee0a 100644 --- a/src/routes/docs/quick-starts/node/+page.markdoc +++ b/src/routes/docs/quick-starts/node/+page.markdoc @@ -76,7 +76,7 @@ const sdk = require("node-appwrite"); const client = new sdk.Client(); client - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("") .setKey(""); ``` diff --git a/src/routes/docs/quick-starts/nuxt/+page.markdoc b/src/routes/docs/quick-starts/nuxt/+page.markdoc index cb7680626..9fd449f7c 100644 --- a/src/routes/docs/quick-starts/nuxt/+page.markdoc +++ b/src/routes/docs/quick-starts/nuxt/+page.markdoc @@ -67,7 +67,7 @@ import { Client, Account} from 'appwrite'; export const client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account = new Account(client); diff --git a/src/routes/docs/quick-starts/php/+page.markdoc b/src/routes/docs/quick-starts/php/+page.markdoc index 758617349..4b2359bd5 100644 --- a/src/routes/docs/quick-starts/php/+page.markdoc +++ b/src/routes/docs/quick-starts/php/+page.markdoc @@ -81,7 +81,7 @@ use Appwrite\ID; $client = new Client(); $client - ->setEndpoint('https://cloud.appwrite.io/v1') + ->setEndpoint('https://.cloud.appwrite.io/v1') ->setProject('') ->setKey(''); ``` diff --git a/src/routes/docs/quick-starts/python/+page.markdoc b/src/routes/docs/quick-starts/python/+page.markdoc index cd6e3e052..eba0d3157 100644 --- a/src/routes/docs/quick-starts/python/+page.markdoc +++ b/src/routes/docs/quick-starts/python/+page.markdoc @@ -97,7 +97,7 @@ from appwrite.services.databases import Databases from appwrite.id import ID client = Client() -client.set_endpoint('https://cloud.appwrite.io/v1') +client.set_endpoint('https://.cloud.appwrite.io/v1') client.set_project('') client.set_key('') ``` diff --git a/src/routes/docs/quick-starts/react-native/+page.markdoc b/src/routes/docs/quick-starts/react-native/+page.markdoc index f03abf61a..322359825 100644 --- a/src/routes/docs/quick-starts/react-native/+page.markdoc +++ b/src/routes/docs/quick-starts/react-native/+page.markdoc @@ -103,7 +103,7 @@ let account: Account; client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject('66e943139f030e2feaf8') // Your Project ID .setPlatform('com.example.my-app'); // Your package name / bundle identifier diff --git a/src/routes/docs/quick-starts/react/+page.markdoc b/src/routes/docs/quick-starts/react/+page.markdoc index 71900462c..c66e5659c 100644 --- a/src/routes/docs/quick-starts/react/+page.markdoc +++ b/src/routes/docs/quick-starts/react/+page.markdoc @@ -64,7 +64,7 @@ import { Client, Account} from 'appwrite'; export const client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account = new Account(client); diff --git a/src/routes/docs/quick-starts/ruby/+page.markdoc b/src/routes/docs/quick-starts/ruby/+page.markdoc index c7c9f0807..355a99685 100644 --- a/src/routes/docs/quick-starts/ruby/+page.markdoc +++ b/src/routes/docs/quick-starts/ruby/+page.markdoc @@ -79,7 +79,7 @@ include Appwrite client = Client.new() client - .set_endpoint('https://cloud.appwrite.io/v1') # Your Appwrite Endpoint + .set_endpoint('https://.cloud.appwrite.io/v1') # Your Appwrite Endpoint .set_project('') # Your project ID .set_key('') # Your secret API key ``` diff --git a/src/routes/docs/quick-starts/solid/+page.markdoc b/src/routes/docs/quick-starts/solid/+page.markdoc index be51229a1..f0e0ee406 100644 --- a/src/routes/docs/quick-starts/solid/+page.markdoc +++ b/src/routes/docs/quick-starts/solid/+page.markdoc @@ -70,7 +70,7 @@ import { Client, Account } from 'appwrite'; export const client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account = new Account(client); diff --git a/src/routes/docs/quick-starts/sveltekit/+page.markdoc b/src/routes/docs/quick-starts/sveltekit/+page.markdoc index 2b4e0a13c..36d68d3c3 100644 --- a/src/routes/docs/quick-starts/sveltekit/+page.markdoc +++ b/src/routes/docs/quick-starts/sveltekit/+page.markdoc @@ -63,7 +63,7 @@ import { Client, Account } from 'appwrite'; export const client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account = new Account(client); diff --git a/src/routes/docs/quick-starts/swift/+page.markdoc b/src/routes/docs/quick-starts/swift/+page.markdoc index bcae01478..42728715b 100644 --- a/src/routes/docs/quick-starts/swift/+page.markdoc +++ b/src/routes/docs/quick-starts/swift/+page.markdoc @@ -85,7 +85,7 @@ import Appwrite import AppwriteModels let client = Client() - .setEndpoint("https://cloud.appwrite.io/v1") + .setEndpoint("https://.cloud.appwrite.io/v1") .setProject("") .setKey("") ``` diff --git a/src/routes/docs/quick-starts/vue/+page.markdoc b/src/routes/docs/quick-starts/vue/+page.markdoc index b5502e54a..acb9bece4 100644 --- a/src/routes/docs/quick-starts/vue/+page.markdoc +++ b/src/routes/docs/quick-starts/vue/+page.markdoc @@ -65,7 +65,7 @@ import { Client, Account} from 'appwrite'; export const client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account = new Account(client); diff --git a/src/routes/docs/quick-starts/web/+page.markdoc b/src/routes/docs/quick-starts/web/+page.markdoc index 11e2bb237..bb46c4623 100644 --- a/src/routes/docs/quick-starts/web/+page.markdoc +++ b/src/routes/docs/quick-starts/web/+page.markdoc @@ -55,7 +55,7 @@ import { Client, Account } from 'appwrite'; export const client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account = new Account(client); @@ -89,7 +89,7 @@ import { type Models } from 'appwrite'; const client: Client = new Client(); client - .setEndpoint('https://cloud.appwrite.io/v1') + .setEndpoint('https://.cloud.appwrite.io/v1') .setProject(''); // Replace with your project ID export const account: Account = new Account(client); diff --git a/src/routes/docs/references/+layout.svelte b/src/routes/docs/references/+layout.svelte index f345e9f60..d9bd7015d 100644 --- a/src/routes/docs/references/+layout.svelte +++ b/src/routes/docs/references/+layout.svelte @@ -1,21 +1,21 @@ @@ -152,10 +209,10 @@ - {#if $page.params.version !== 'cloud'} + {#if page.params.version !== 'cloud'} {/if} @@ -201,7 +258,7 @@

        Use Appwrite messaging to send email, SMS, and push @@ -100,7 +101,8 @@ height="32" />

        Functions

        -
      - Terminal
      @@ -96,20 +100,22 @@
      - 1 -
      {/each}
      Coupon code Apply
      GET30OFF Develop your functions locally -

      +

      Code and test your functions locally with Appwrite Functions, ensuring full control over your development.

      - Learn moreLearn more
      diff --git a/src/routes/products/functions/(components)/Languages.svelte b/src/routes/products/functions/(components)/Languages.svelte index ecd7bce9a..86559c94c 100644 --- a/src/routes/products/functions/(components)/Languages.svelte +++ b/src/routes/products/functions/(components)/Languages.svelte @@ -1,4 +1,5 @@ -
      +
      {$headingValue}
      - +
      diff --git a/src/routes/products/messaging/(components)/Send.svelte b/src/routes/products/messaging/(components)/Send.svelte index d7a9c0ab2..84e4320ac 100644 --- a/src/routes/products/messaging/(components)/Send.svelte +++ b/src/routes/products/messaging/(components)/Send.svelte @@ -7,7 +7,7 @@
      -
      +
      @@ -18,7 +18,7 @@ Pick one or more channels for you to deliver your message to your user.

      -
      +
      diff --git a/src/routes/products/messaging/(components)/Step.svelte b/src/routes/products/messaging/(components)/Step.svelte index 88886f8bb..388f91329 100644 --- a/src/routes/products/messaging/(components)/Step.svelte +++ b/src/routes/products/messaging/(components)/Step.svelte @@ -4,7 +4,7 @@
      -
      +

      {title}

      diff --git a/src/routes/products/messaging/(components)/Target.svelte b/src/routes/products/messaging/(components)/Target.svelte index 351bb8c2c..fa922bbdf 100644 --- a/src/routes/products/messaging/(components)/Target.svelte +++ b/src/routes/products/messaging/(components)/Target.svelte @@ -10,6 +10,7 @@ import { onMount } from 'svelte'; import { inView } from 'motion'; import { sleep } from '$lib/animations'; + import { Button } from '$lib/components/ui'; /* Variables & Contstants */ const width = 2000; @@ -361,7 +362,7 @@ {users.filter((u) => !!u.devices.some((d) => d.checked)).length} Users selected - +
      diff --git a/src/routes/products/messaging/+page.svelte b/src/routes/products/messaging/+page.svelte index 41b206f50..0a42f1d70 100644 --- a/src/routes/products/messaging/+page.svelte +++ b/src/routes/products/messaging/+page.svelte @@ -10,6 +10,7 @@ import MultiCodeContextless from '$lib/components/MultiCodeContextless.svelte'; import { Platform } from '$lib/utils/references'; import { getAppwriteDashboardUrl } from '$lib/utils/dashboard'; + import { Button } from '$lib/components/ui'; const title = 'Messaging' + TITLE_SUFFIX; const description = @@ -269,9 +270,9 @@ messaging.create_email( directly to your users.

      - Get started - DocumentationGet started +
      @@ -293,7 +294,7 @@ messaging.create_email(
      - capabilities_

      @@ -320,7 +321,8 @@ messaging.create_email( class="web-interactive-tag" href="/docs/products/messaging/fcm" > -

      Manage your files' project, using convenient APIs and utilities. @@ -633,7 +641,8 @@ messaging.create_email( height="32" />

      Realtime

      -

      Utilize realtime information from all Appwrite services. diff --git a/src/routes/products/storage/(components)/OpenSource.svelte b/src/routes/products/storage/(components)/OpenSource.svelte index cf027ce5c..5821dd305 100644 --- a/src/routes/products/storage/(components)/OpenSource.svelte +++ b/src/routes/products/storage/(components)/OpenSource.svelte @@ -1,4 +1,5 @@ +

      diff --git a/src/routes/products/storage/(components)/Permissions.svelte b/src/routes/products/storage/(components)/Permissions.svelte index 6c06381d0..601e0ba5c 100644 --- a/src/routes/products/storage/(components)/Permissions.svelte +++ b/src/routes/products/storage/(components)/Permissions.svelte @@ -1,4 +1,5 @@ @@ -13,9 +14,10 @@

      Set up file encryption and granular user permissions in your storage infrastructure

      - Learn moreLearn more
      diff --git a/src/routes/products/storage/(components)/PreviewFiles.svelte b/src/routes/products/storage/(components)/PreviewFiles.svelte index 228784cde..0a568a908 100644 --- a/src/routes/products/storage/(components)/PreviewFiles.svelte +++ b/src/routes/products/storage/(components)/PreviewFiles.svelte @@ -3,6 +3,7 @@ import ProductPreview from '../(assets)/product-preview.png'; import { Platform } from '$lib/utils/references'; + import { Button } from '$lib/components/ui'; const snippet = [ { @@ -24,7 +25,7 @@

      @@ -35,12 +36,13 @@ managing different formats and compression algorithms.

      diff --git a/src/routes/products/storage/(components)/ProductShot.svelte b/src/routes/products/storage/(components)/ProductShot.svelte index 718f0dabb..af08eafc1 100644 --- a/src/routes/products/storage/(components)/ProductShot.svelte +++ b/src/routes/products/storage/(components)/ProductShot.svelte @@ -1,5 +1,6 @@ -
      +
      {#each tabs as tab} diff --git a/src/routes/products/storage/(components)/multicode-tabs/Tabs.svelte b/src/routes/products/storage/(components)/multicode-tabs/Tabs.svelte index bec6e6cab..48e5c3df3 100644 --- a/src/routes/products/storage/(components)/multicode-tabs/Tabs.svelte +++ b/src/routes/products/storage/(components)/multicode-tabs/Tabs.svelte @@ -39,7 +39,7 @@ )} > - Learn more - +
      @@ -169,14 +171,14 @@ Appwrite's Storage APIs allow you to create and update your files, apply image transformations, and more.

      - View docs - +
      diff --git a/src/routes/products/storage/EventCard.svelte b/src/routes/products/storage/EventCard.svelte index 5aa7b3fc2..4e7d1d85c 100644 --- a/src/routes/products/storage/EventCard.svelte +++ b/src/routes/products/storage/EventCard.svelte @@ -15,6 +15,8 @@ + + + + {title} + + + + + + + + + + + + + + + {@html getInlinedScriptTag(softwareAppSchema())} + + + {@html getInlinedScriptTag(organizationJsonSchema())} + + +
      +
      +
      + Read the announcement +

      + {#each heading.split(' ') as word, i} + {word} + {/each} +

      +
      + +
      +
      + +
      +
      +
      diff --git a/src/routes/threads/+page.svelte b/src/routes/threads/+page.svelte index abbf17f07..c8b5a06d0 100644 --- a/src/routes/threads/+page.svelte +++ b/src/routes/threads/+page.svelte @@ -1,8 +1,9 @@ +
      @@ -8,19 +12,17 @@

      Get community support by joining our Discord server.

      - - - Join Discord - +

      Get premium support

      Join Appwrite Pro and get email support from our team.

      - - Learn more - +
      diff --git a/src/routes/threads/TagsDropdown.svelte b/src/routes/threads/TagsDropdown.svelte index 8d4d6221c..5a59b2e78 100644 --- a/src/routes/threads/TagsDropdown.svelte +++ b/src/routes/threads/TagsDropdown.svelte @@ -12,7 +12,7 @@ {#if open} @@ -34,7 +34,7 @@ >
      {#if checked} - + {/if}
      {tag} diff --git a/src/routes/threads/ThreadCard.svelte b/src/routes/threads/ThreadCard.svelte index a90ea627b..1af268633 100644 --- a/src/routes/threads/ThreadCard.svelte +++ b/src/routes/threads/ThreadCard.svelte @@ -13,7 +13,7 @@

      {thread.title} @@ -41,7 +41,7 @@ class="web-icon-button is-more-content web-u-pointer-events-none flex items-center" aria-label="Replies" > -

      diff --git a/src/routes/threads/[id]/+page.svelte b/src/routes/threads/[id]/+page.svelte index f309b01fa..0a7505848 100644 --- a/src/routes/threads/[id]/+page.svelte +++ b/src/routes/threads/[id]/+page.svelte @@ -2,6 +2,7 @@ import { Main } from '$lib/layouts'; import { DEFAULT_DESCRIPTION } from '$lib/utils/metadata'; import { TITLE_SUFFIX } from '$routes/titles'; + import { Button, Icon } from '$lib/components/ui'; import FooterNav from '$lib/components/FooterNav.svelte'; import MainFooter from '$lib/components/MainFooter.svelte'; @@ -9,7 +10,7 @@ import PreFooter from '../PreFooter.svelte'; import MessageCard from './MessageCard.svelte'; - export let data; + let { data } = $props(); const title = data.title + ' - Threads' + TITLE_SUFFIX; const description = DEFAULT_DESCRIPTION; @@ -36,17 +37,17 @@
      -
      +
      -

      {data.title}

      • - + {data.vote_count}
      • {#each data.tags ?? [] as tag} @@ -57,10 +58,10 @@
      - - - View on Discord - +
      @@ -82,10 +83,10 @@

      Reply to this thread by joining our Discord

      - - - Reply on Discord - +