diff --git a/db/migrations/001-schema.sql b/db/migrations/001-schema.sql deleted file mode 100644 index a1e50b3..0000000 --- a/db/migrations/001-schema.sql +++ /dev/null @@ -1,83 +0,0 @@ -CREATE TABLE IF NOT EXISTS users ( - id UUID PRIMARY KEY, - name TEXT NOT NULL, - created_at TIMESTAMPTZ NOT NULL -); -ALTER TABLE users ENABLE ELECTRIC; - -CREATE TABLE IF NOT EXISTS pots ( - id UUID PRIMARY KEY, - name TEXT NOT NULL, - owner UUID REFERENCES users(id), - created_at TIMESTAMPTZ NOT NULL -); -ALTER TABLE pots ENABLE ELECTRIC; - -CREATE TABLE IF NOT EXISTS threads ( - id UUID PRIMARY KEY, - author UUID REFERENCES users(id), - pot_id UUID REFERENCES pots(id) ON DELETE CASCADE, - parent_id UUID, - fractional_index TEXT NOT NULL, - title TEXT NOT NULL, - created_at TIMESTAMPTZ NOT NULL, - updated_at TIMESTAMPTZ NOT NULL, - deleted BOOLEAN NOT NULL -); -CREATE INDEX threads_title_idx ON threads(title); -CREATE INDEX threads_parent_id_idx ON threads(parent_id); -ALTER TABLE threads ENABLE ELECTRIC; - -CREATE TABLE IF NOT EXISTS thread_checkpoints ( - id UUID PRIMARY KEY, - thread_id UUID REFERENCES threads(id) NOT NULL, - fractional_index TEXT NOT NULL, - title TEXT NOT NULL -); -CREATE INDEX thread_checkpoints_thread_id_idx ON thread_checkpoints(thread_id); -ALTER TABLE thread_checkpoints ENABLE ELECTRIC; - -CREATE TABLE IF NOT EXISTS cards ( - id UUID PRIMARY KEY, - author UUID REFERENCES users(id), - pot_id UUID REFERENCES pots(id) ON DELETE CASCADE, - thread_id UUID NOT NULL, - fractional_index TEXT NOT NULL, - content TEXT NOT NULL, - last_materialized_hash TEXT NOT NULL, - created_at TIMESTAMPTZ NOT NULL, - updated_at TIMESTAMPTZ NOT NULL, - deleted BOOLEAN NOT NULL -); -CREATE INDEX cards_thread_id_idx ON cards(thread_id); -ALTER TABLE cards ENABLE ELECTRIC; - -CREATE TABLE IF NOT EXISTS card_ydoc_updates ( - id UUID PRIMARY KEY, - card_id UUID REFERENCES cards(id) ON DELETE CASCADE NOT NULL, - data BYTEA NOT NULL, - checkpoint BOOLEAN NOT NULL, - created_at TIMESTAMPTZ NOT NULL -); -CREATE INDEX card_ydoc_updates_card_id_idx ON card_ydoc_updates(card_id); -ALTER TABLE card_ydoc_updates ENABLE ELECTRIC; - -CREATE TABLE IF NOT EXISTS card_checkpoints ( - id UUID PRIMARY KEY, - card_id UUID REFERENCES cards(id) ON DELETE CASCADE NOT NULL, - ydoc_id UUID REFERENCES card_ydoc_updates(id) ON DELETE CASCADE NOT NULL, - fractional_index TEXT NOT NULL, - content TEXT NOT NULL -); -CREATE INDEX card_checkpoints_card_id_idx ON card_checkpoints(card_id); -ALTER TABLE card_checkpoints ENABLE ELECTRIC; - - -CREATE TABLE IF NOT EXISTS thread_card_checkpoints ( - thread_checkpoint_id UUID REFERENCES thread_checkpoints(id) ON DELETE CASCADE NOT NULL, - card_checkpoint_id UUID REFERENCES card_checkpoints(id) ON DELETE CASCADE NOT NULL, - PRIMARY KEY (thread_checkpoint_id, card_checkpoint_id) -); -CREATE INDEX thread_card_checkpoints_thread_idx ON thread_card_checkpoints(thread_checkpoint_id); -CREATE INDEX thread_card_checkpoints_card_idx ON thread_card_checkpoints(card_checkpoint_id); -ALTER TABLE thread_card_checkpoints ENABLE ELECTRIC; diff --git a/db/rebuild-schema.sh b/db/rebuild-schema.sh deleted file mode 100755 index 8e8430d..0000000 --- a/db/rebuild-schema.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -# This script nukes databases in development environment. -# Since ElectricSQL only accepts additive schema change, Resetting the entire databases is necessary during early development. - -# check whether macOS or others -if [[ "$(uname)" != "Darwin" ]]; then - echo 'This script only works with macOS' - exit 1 -fi - -docker compose -f docker/compose.dev.yml down -docker volume rm potrin_dev_pg_data -docker compose -f docker/compose.dev.yml up -d - -# wait until the containers are ready -while true; do - log=$(docker compose -f docker/compose.dev.yml logs --tail=1) - search_string='LOG: logical replication apply worker for subscription "postgres_1" has started' - if echo "$log" | grep -q "$search_string"; then - break - fi - sleep 1 -done - -pnpm pg-migrations apply --directory db/migrations --database postgresql://postgres:proxy_password@localhost:65432/postgres - -pnpm exec electric-sql generate - -# cleanup app data -rm -rf ~/Library/"Application Support"/com.potrin.dev/* diff --git a/db/test-setup.sh b/db/test-setup.sh deleted file mode 100755 index 179aea1..0000000 --- a/db/test-setup.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -docker compose -f docker/compose.test.yml down --volume -docker compose -f docker/compose.test.yml up -d - -# wait until the containers are ready -while true; do - log=$(docker compose -f docker/compose.test.yml logs --tail=1) - search_string='LOG: logical replication apply worker for subscription "postgres_1" has started' - if echo "$log" | grep -q "$search_string"; then - break - fi - sleep 1 -done - -pnpm pg-migrations apply --directory db/migrations --database postgresql://postgres:proxy_password@localhost:65433/postgres -pnpm exec electric-sql generate --proxy postgresql://postgres:proxy_password@localhost:65433/postgres -s http://localhost:5134 diff --git a/docker/compose.dev.yml b/docker/compose.dev.yml deleted file mode 100644 index 3b13243..0000000 --- a/docker/compose.dev.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: potrin_dev -version: "3.1" - -volumes: - pg_data: - -services: - pg: - image: postgres:16-alpine - environment: - POSTGRES_PASSWORD: pg_password - command: - - -c - - wal_level=logical - ports: - - 5432:5432 - restart: always - volumes: - - pg_data:/var/lib/postgresql/data - - electric: - image: electricsql/electric:0.12.1 - depends_on: - - pg - environment: - DATABASE_URL: postgresql://postgres:pg_password@pg/postgres - DATABASE_REQUIRE_SSL: false - LOGICAL_PUBLISHER_HOST: electric - PG_PROXY_PASSWORD: proxy_password - AUTH_MODE: insecure - ports: - - 5133:5133 - - 65432:65432 - restart: always diff --git a/docker/compose.test.yml b/docker/compose.test.yml deleted file mode 100644 index ddc039b..0000000 --- a/docker/compose.test.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: potrin_test -version: "3.1" - -services: - pg: - image: postgres:16-alpine - environment: - POSTGRES_PASSWORD: pg_password - command: - - -c - - wal_level=logical - ports: - - 5433:5432 - restart: always - - electric: - image: electricsql/electric:0.12.1 - depends_on: - - pg - environment: - DATABASE_URL: postgresql://postgres:pg_password@pg/postgres - DATABASE_REQUIRE_SSL: false - LOGICAL_PUBLISHER_HOST: electric - PG_PROXY_PASSWORD: proxy_password - AUTH_MODE: insecure - ports: - - 5134:5133 - - 65433:65432 - restart: always diff --git a/eslint.config.js b/eslint.config.js index f4d0b97..e28fd58 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -5,17 +5,18 @@ import eslintConfigPrettier from "eslint-config-prettier"; import eslintPluginSvelte from "eslint-plugin-svelte"; import globals from "globals"; -export default [ - eslint.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.strict, - ...eslintPluginSvelte.configs["flat/prettier"], - { - languageOptions: { - globals: { - ...globals.browser, - ...globals.node, - }, +export default tseslint.config({ + ignores: ["src/generated/**"], + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, }, }, -]; + extends: [ + eslint.configs.recommended, + eslintConfigPrettier, + ...tseslint.configs.strict, + ...eslintPluginSvelte.configs["flat/prettier"], + ], +}); diff --git a/package.json b/package.json index e1cf0c0..dd5d6dd 100644 --- a/package.json +++ b/package.json @@ -15,48 +15,36 @@ }, "license": "AGPLv3", "dependencies": { - "@prisma/client": "5.15.0", "@tauri-apps/api": "2.0.0-beta.13", - "@tauri-apps/plugin-shell": "2.0.0-beta.6", - "@tauri-apps/plugin-sql": "2.0.0-beta.5", "@tauri-apps/plugin-store": "2.0.0-beta.5", - "electric-sql": "^0.12.1", "fractional-indexing": "^3.2.0", - "globals": "^15.4.0", "ohash": "^1.1.3", - "pg": "^8.12.0", - "uuidv7": "^1.0.0", - "velona": "^0.8.0", - "yjs": "^13.6.18", - "zod": "^3.23.8" + "uuidv7": "^1.0.1", + "yjs": "^13.6.18" }, "devDependencies": { "@databases/pg-migrations": "^5.0.3", - "@eslint/js": "^9.4.0", - "@sveltejs/adapter-static": "^3.0.1", - "@sveltejs/kit": "^2.5.10", + "@eslint/js": "^9.9.0", + "@sveltejs/adapter-static": "^3.0.4", + "@sveltejs/kit": "^2.5.24", "@sveltejs/vite-plugin-svelte": "^3.1.1", "@tauri-apps/cli": "2.0.0-beta.20", - "@types/better-sqlite3": "^7.6.10", + "@types/better-sqlite3": "^7.6.11", "@types/eslint__js": "^8.42.3", - "@vitest/ui": "^2.0.2", - "better-sqlite3": "^11.0.0", - "dotenv": "^16.4.5", - "eslint": "^8.57.0", + "@vitest/ui": "^2.0.5", + "eslint": "^9.9.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.39.0", + "eslint-plugin-svelte": "^2.43.0", + "globals": "^15.9.0", "internal-ip": "^7.0.0", - "jsdom": "^24.1.0", - "prettier": "^3.3.1", - "prettier-plugin-svelte": "^3.2.4", - "prisma": "^5.15.0", + "jsdom": "^24.1.1", + "prettier": "^3.3.3", + "prettier-plugin-svelte": "^3.2.6", "svelte": "5.0.0-next.160", - "svelte-check": "^3.8.0", - "tslib": "^2.6.2", - "typescript": "^5.4.5", - "typescript-eslint": "^7.12.0", - "utility-types": "^3.11.0", - "vite": "^5.2.12", - "vitest": "^2.0.2" + "svelte-check": "^3.8.5", + "typescript": "^5.5.4", + "typescript-eslint": "^8.2.0", + "vite": "^5.4.1", + "vitest": "^2.0.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b72a54d..f7817b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,130 +8,97 @@ importers: .: dependencies: - '@prisma/client': - specifier: 5.15.0 - version: 5.15.0(prisma@5.15.0) '@tauri-apps/api': specifier: 2.0.0-beta.13 version: 2.0.0-beta.13 - '@tauri-apps/plugin-shell': - specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6 - '@tauri-apps/plugin-sql': - specifier: 2.0.0-beta.5 - version: 2.0.0-beta.5 '@tauri-apps/plugin-store': specifier: 2.0.0-beta.5 version: 2.0.0-beta.5 - electric-sql: - specifier: ^0.12.1 - version: 0.12.1(@tauri-apps/plugin-sql@2.0.0-beta.5)(pg@8.12.0)(prisma@5.15.0)(zod@3.23.8) fractional-indexing: specifier: ^3.2.0 version: 3.2.0 - globals: - specifier: ^15.4.0 - version: 15.4.0 ohash: specifier: ^1.1.3 version: 1.1.3 - pg: - specifier: ^8.12.0 - version: 8.12.0 uuidv7: - specifier: ^1.0.0 - version: 1.0.0 - velona: - specifier: ^0.8.0 - version: 0.8.0 + specifier: ^1.0.1 + version: 1.0.1 yjs: specifier: ^13.6.18 version: 13.6.18 - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: '@databases/pg-migrations': specifier: ^5.0.3 - version: 5.0.3(typescript@5.4.5) + version: 5.0.3(typescript@5.5.4) '@eslint/js': - specifier: ^9.4.0 - version: 9.4.0 + specifier: ^9.9.0 + version: 9.9.0 '@sveltejs/adapter-static': - specifier: ^3.0.1 - version: 3.0.1(@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)))(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1))) + specifier: ^3.0.4 + version: 3.0.4(@sveltejs/kit@2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)))(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1))) '@sveltejs/kit': - specifier: ^2.5.10 - version: 2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)))(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)) + specifier: ^2.5.24 + version: 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)))(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.1 - version: 3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)) + version: 3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)) '@tauri-apps/cli': specifier: 2.0.0-beta.20 version: 2.0.0-beta.20 '@types/better-sqlite3': - specifier: ^7.6.10 - version: 7.6.10 + specifier: ^7.6.11 + version: 7.6.11 '@types/eslint__js': specifier: ^8.42.3 version: 8.42.3 '@vitest/ui': - specifier: ^2.0.2 - version: 2.0.2(vitest@2.0.2) - better-sqlite3: - specifier: ^11.0.0 - version: 11.0.0 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5) eslint: - specifier: ^8.57.0 - version: 8.57.0 + specifier: ^9.9.0 + version: 9.9.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@9.9.0) eslint-plugin-svelte: - specifier: ^2.39.0 - version: 2.39.0(eslint@8.57.0)(svelte@5.0.0-next.160) + specifier: ^2.43.0 + version: 2.43.0(eslint@9.9.0)(svelte@5.0.0-next.160) + globals: + specifier: ^15.9.0 + version: 15.9.0 internal-ip: specifier: ^7.0.0 version: 7.0.0 jsdom: - specifier: ^24.1.0 - version: 24.1.0 + specifier: ^24.1.1 + version: 24.1.1 prettier: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.3.3 + version: 3.3.3 prettier-plugin-svelte: - specifier: ^3.2.4 - version: 3.2.4(prettier@3.3.1)(svelte@5.0.0-next.160) - prisma: - specifier: ^5.15.0 - version: 5.15.0 + specifier: ^3.2.6 + version: 3.2.6(prettier@3.3.3)(svelte@5.0.0-next.160) svelte: specifier: 5.0.0-next.160 version: 5.0.0-next.160 svelte-check: - specifier: ^3.8.0 - version: 3.8.0(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(svelte@5.0.0-next.160) - tslib: - specifier: ^2.6.2 - version: 2.6.2 + specifier: ^3.8.5 + version: 3.8.5(postcss-load-config@3.1.4(postcss@8.4.41))(postcss@8.4.41)(svelte@5.0.0-next.160) typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.5.4 typescript-eslint: - specifier: ^7.12.0 - version: 7.12.0(eslint@8.57.0)(typescript@5.4.5) + specifier: ^8.2.0 + version: 8.2.0(eslint@9.9.0)(typescript@5.5.4) utility-types: specifier: ^3.11.0 version: 3.11.0 vite: - specifier: ^5.2.12 - version: 5.2.12(@types/node@20.14.1) + specifier: ^5.4.1 + version: 5.4.1(@types/node@22.4.1) vitest: - specifier: ^2.0.2 - version: 2.0.2(@types/node@20.14.1)(@vitest/ui@2.0.2)(jsdom@24.1.0) + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.4.1)(@vitest/ui@2.0.5)(jsdom@24.1.1) packages: @@ -202,144 +169,140 @@ packages: '@databases/validate-unicode@1.0.0': resolution: {integrity: sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==} - '@electric-sql/prisma-generator@1.1.5': - resolution: {integrity: sha512-O7+DCq1QDmFY7Y5BfeD9e7ftUWpKLAQ+lz2qRuExtMtkfsvZPwAOmu6HhTBaLdo+/rZz1wnAEdnzksFv4LlgAw==} - hasBin: true - - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -350,35 +313,36 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.1': - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.17.1': + resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.4.0': - resolution: {integrity: sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==} + '@eslint/js@9.9.0': + resolution: {integrity: sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} - '@inquirer/figures@1.0.3': - resolution: {integrity: sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==} + '@inquirer/figures@1.0.5': + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} engines: {node: '>=18'} '@isaacs/cliui@8.0.2': @@ -397,8 +361,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -422,169 +386,97 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} - '@prisma/client@4.8.1': - resolution: {integrity: sha512-d4xhZhETmeXK/yZ7K0KcVOzEfI5YKGGEr4F5SBV04/MU4ncN/HcE28sy3e4Yt8UFW0ZuImKFQJE+9rWt9WbGSQ==} - engines: {node: '>=14.17'} - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - - '@prisma/client@5.15.0': - resolution: {integrity: sha512-wPTeTjbd2Q0abOeffN7zCDCbkp9C9cF+e9HPiI64lmpehyq2TepgXE+sY7FXr7Rhbb21prLMnhXX27/E11V09w==} - engines: {node: '>=16.13'} - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - - '@prisma/debug@4.16.2': - resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} - - '@prisma/debug@5.15.0': - resolution: {integrity: sha512-QpEAOjieLPc/4sMny/WrWqtpIAmBYsgqwWlWwIctqZO0AbhQ9QcT6x2Ut3ojbDo/pFRCCA1Z1+xm2MUy7fAkZA==} - - '@prisma/engines-version@4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe': - resolution: {integrity: sha512-MHSOSexomRMom8QN4t7bu87wPPD+pa+hW9+71JnVcF3DqyyO/ycCLhRL1we3EojRpZxKvuyGho2REQsMCvxcJw==} - - '@prisma/engines-version@5.15.0-29.12e25d8d06f6ea5a0252864dd9a03b1bb51f3022': - resolution: {integrity: sha512-3BEgZ41Qb4oWHz9kZNofToRvNeS4LZYaT9pienR1gWkjhky6t6K1NyeWNBkqSj2llgraUNbgMOCQPY4f7Qp5wA==} - - '@prisma/engines@5.15.0': - resolution: {integrity: sha512-hXL5Sn9hh/ZpRKWiyPA5GbvF3laqBHKt6Vo70hYqqOhh5e0ZXDzHcdmxNvOefEFeqxra2DMz2hNbFoPvqrVe1w==} - - '@prisma/fetch-engine@5.15.0': - resolution: {integrity: sha512-z6AY5yyXxc20Klj7wwnfGP0iIUkVKzybqapT02zLYR/nf9ynaeN8bq73WRmi1TkLYn+DJ5Qy+JGu7hBf1pE78A==} - - '@prisma/generator-helper@4.16.2': - resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} - - '@prisma/get-platform@5.15.0': - resolution: {integrity: sha512-1GULDkW4+/VQb73vihxCBSc4Chc2x88MA+O40tcZFjmBzG4/fF44PaXFxUqKSFltxU9L9GIMLhh0Gfkk/pUbtg==} - - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + '@rollup/rollup-android-arm-eabi@4.21.0': + resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + '@rollup/rollup-android-arm64@4.21.0': + resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + '@rollup/rollup-darwin-arm64@4.21.0': + resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + '@rollup/rollup-darwin-x64@4.21.0': + resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': + resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + '@rollup/rollup-linux-arm-musleabihf@4.21.0': + resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + '@rollup/rollup-linux-arm64-gnu@4.21.0': + resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + '@rollup/rollup-linux-arm64-musl@4.21.0': + resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': + resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + '@rollup/rollup-linux-riscv64-gnu@4.21.0': + resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + '@rollup/rollup-linux-s390x-gnu@4.21.0': + resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + '@rollup/rollup-linux-x64-gnu@4.21.0': + resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + '@rollup/rollup-linux-x64-musl@4.21.0': + resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + '@rollup/rollup-win32-arm64-msvc@4.21.0': + resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + '@rollup/rollup-win32-ia32-msvc@4.21.0': + resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + '@rollup/rollup-win32-x64-msvc@4.21.0': + resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} cpu: [x64] os: [win32] - '@sveltejs/adapter-static@3.0.1': - resolution: {integrity: sha512-6lMvf7xYEJ+oGeR5L8DFJJrowkefTK6ZgA4JiMqoClMkKq0s6yvsd3FZfCFvX1fQ0tpCD7fkuRVHsnUVgsHyNg==} + '@sveltejs/adapter-static@3.0.4': + resolution: {integrity: sha512-Qm4GAHCnRXwfWG9/AtnQ7mqjyjTs7i0Opyb8H2KH9rMR7fLxqiPx/tXeoE6HHo66+72CjyOb4nFH3lrejY4vzA==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.5.10': - resolution: {integrity: sha512-OqoyTmFG2cYmCFAdBfW+Qxbg8m23H4dv6KqwEt7ofr/ROcfcIl3Z/VT56L22H9f0uNZyr+9Bs1eh2gedOCK9kA==} + '@sveltejs/kit@2.5.24': + resolution: {integrity: sha512-Nr2oxsCsDfEkdS/zzQQQbsPYTbu692Qs3/iE3L7VHzCVjG2+WujF9oMUozWI7GuX98KxYSoPMlAsfmDLSg44hQ==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 @@ -672,29 +564,17 @@ packages: engines: {node: '>= 10'} hasBin: true - '@tauri-apps/plugin-shell@2.0.0-beta.6': - resolution: {integrity: sha512-g3nM9cQQGl7Iv4MvyFuco/aPTiwOI/MixcoKso3VQIg5Aqd64NqR0r+GfsB0qx52txItqzSXwmeaj1eZjO9Q6Q==} - - '@tauri-apps/plugin-sql@2.0.0-beta.5': - resolution: {integrity: sha512-EuhrMeIGmIQmGYuzxk6i+PPqIMMgT+nApNsjYbpuVwYuav60RiI0pIC76B77BfmO5J7Sj9ueJyhiugwUevsYmQ==} - '@tauri-apps/plugin-store@2.0.0-beta.5': resolution: {integrity: sha512-lF1OxZv0w45G1eRVtvplNhfsthHuJD17Lx+KDZe46WPwaLbGL9KJE+OYx7c2ek5idU2qBXtx33lWVEu6ghxGJA==} - '@types/better-sqlite3@7.6.10': - resolution: {integrity: sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw==} + '@types/better-sqlite3@7.6.11': + resolution: {integrity: sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==} '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/cross-spawn@6.0.2': - resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} - - '@types/debug@4.1.8': - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} - - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/eslint@9.6.0': + resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} '@types/eslint__js@8.42.3': resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} @@ -705,98 +585,91 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node@20.14.1': - resolution: {integrity: sha512-T2MzSGEu+ysB/FkWfqmhV3PLyQlowdptmmgD20C6QxsS8Fmv5SjpZ1ayXaEC0S21/h5UJ9iA6W/5vSNU5l00OA==} + '@types/node@22.4.1': + resolution: {integrity: sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==} '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@typescript-eslint/eslint-plugin@7.12.0': - resolution: {integrity: sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.2.0': + resolution: {integrity: sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.12.0': - resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.2.0': + resolution: {integrity: sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@7.12.0': - resolution: {integrity: sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.2.0': + resolution: {integrity: sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.12.0': - resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/type-utils@8.2.0': + resolution: {integrity: sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@7.12.0': - resolution: {integrity: sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.2.0': + resolution: {integrity: sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.12.0': - resolution: {integrity: sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.2.0': + resolution: {integrity: sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@7.12.0': - resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@8.2.0': + resolution: {integrity: sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.12.0': - resolution: {integrity: sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==} - engines: {node: ^18.18.0 || >=20.0.0} + eslint: ^8.57.0 || ^9.0.0 - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/visitor-keys@8.2.0': + resolution: {integrity: sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/expect@2.0.2': - resolution: {integrity: sha512-nKAvxBYqcDugYZ4nJvnm5OR8eDJdgWjk4XM9owQKUjzW70q0icGV2HVnQOyYsp906xJaBDUXw0+9EHw2T8e0mQ==} + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/pretty-format@2.0.2': - resolution: {integrity: sha512-SBCyOXfGVvddRd9r2PwoVR0fonQjh9BMIcBMlSzbcNwFfGr6ZhOhvBzurjvi2F4ryut2HcqiFhNeDVGwru8tLg==} + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - '@vitest/runner@2.0.2': - resolution: {integrity: sha512-OCh437Vi8Wdbif1e0OvQcbfM3sW4s2lpmOjAE7qfLrpzJX2M7J1IQlNvEcb/fu6kaIB9n9n35wS0G2Q3en5kHg==} + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} - '@vitest/snapshot@2.0.2': - resolution: {integrity: sha512-Yc2ewhhZhx+0f9cSUdfzPRcsM6PhIb+S43wxE7OG0kTxqgqzo8tHkXFuFlndXeDMp09G3sY/X5OAo/RfYydf1g==} + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} - '@vitest/spy@2.0.2': - resolution: {integrity: sha512-MgwJ4AZtCgqyp2d7WcQVE8aNG5vQ9zu9qMPYQHjsld/QVsrvg78beNrXdO4HYkP0lDahCO3P4F27aagIag+SGQ==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - '@vitest/ui@2.0.2': - resolution: {integrity: sha512-VwxFTOC2GcNPexQlR9PFb8drWCLA+nLWTWlAS4oba1xbTJYJ8H5vY8OUFOTMb7YQXF0Vsc5IfmLpYkb2dcVgOA==} + '@vitest/ui@2.0.5': + resolution: {integrity: sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==} peerDependencies: - vitest: 2.0.2 + vitest: 2.0.5 - '@vitest/utils@2.0.2': - resolution: {integrity: sha512-pxCY1v7kmOCWYWjzc0zfjGTA3Wmn8PKnlPvSrsA643P1NHl1fOyXj2Q9SaNlrlFE+ivCsxM80Ov3AR82RmHCWQ==} + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -808,13 +681,8 @@ packages: peerDependencies: acorn: '>=8.9.0' - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true @@ -870,20 +738,13 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - assert-never@1.2.1: - resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} + assert-never@1.3.0: + resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - async-mutex@0.4.1: - resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -891,31 +752,20 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axobject-query@4.0.0: - resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-64@1.0.0: - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - better-sqlite3@11.0.0: - resolution: {integrity: sha512-1NnNhmT3EZTsKtofJlMox1jkMxdedILury74PwUbQBjWgo4tL4kf7uTAjU55mgQwjdzqakSTjkf+E1imrFwjnA==} - 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==} - - bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -929,17 +779,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - - buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - - buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -979,9 +821,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -998,9 +837,6 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - code-block-writer@11.0.3: - resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1018,13 +854,6 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1036,9 +865,6 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -1048,9 +874,6 @@ packages: typescript: optional: true - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1068,38 +891,8 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - - debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1110,30 +903,6 @@ packages: decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - decompress-tar@4.1.1: - resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} - engines: {node: '>=4'} - - decompress-tarbz2@4.1.1: - resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} - engines: {node: '>=4'} - - decompress-targz@4.1.1: - resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} - engines: {node: '>=4'} - - decompress-unzip@4.0.1: - resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} - engines: {node: '>=4'} - - decompress@4.2.1: - resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} - engines: {node: '>=4'} - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -1142,10 +911,6 @@ packages: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1180,10 +945,6 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - devalue@5.0.0: resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} @@ -1191,79 +952,15 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dotenv-flow@4.1.0: - resolution: {integrity: sha512-0cwP9jpQBQfyHwvE0cRhraZMkdV45TQedA8AAUZMsFzvmLcQyc1HPv+oX0OOYwLFjIlvgVepQ+WuQHbqDaHJZg==} - engines: {node: '>= 12.0.0'} - - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electric-sql@0.12.1: - resolution: {integrity: sha512-d9THXiZSIX+B255uJwR1HFsD3RjZcQrZHAFdmIQvFSGzIrEXVhreMrrCOB+CcbETFZg1ARdZEhGSe4MBXGC6/g==} - hasBin: true - peerDependencies: - '@capacitor-community/sqlite': '>= 5.6.2' - '@electric-sql/pglite': '>= 0.1.5' - '@op-engineering/op-sqlite': '>= 2.0.16' - '@tauri-apps/plugin-sql': 2.0.0-alpha.5 - embedded-postgres: 16.1.1-beta.9 - expo-sqlite: '>= 13.0.0' - pg: ^8.11.3 - prisma: 4.8.1 - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - react-native: '>= 0.68.0' - typeorm: '>=0.3.0' - vue: '>=3.0.0' - wa-sqlite: rhashimoto/wa-sqlite#semver:^0.9.8 - zod: 3.21.1 - peerDependenciesMeta: - '@capacitor-community/sqlite': - optional: true - '@electric-sql/pglite': - optional: true - '@op-engineering/op-sqlite': - optional: true - '@tauri-apps/plugin-sql': - optional: true - embedded-postgres: - optional: true - expo-sqlite: - optional: true - pg: - optional: true - prisma: - optional: true - react: - optional: true - react-dom: - optional: true - react-native: - optional: true - typeorm: - optional: true - vue: - optional: true - wa-sqlite: - optional: true - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1271,10 +968,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -1286,23 +979,11 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -1326,12 +1007,12 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-svelte@2.39.0: - resolution: {integrity: sha512-FXktBLXsrxbA+6ZvJK2z/sQOrUKyzSg3fNWK5h0reSCjr2fjAsc9ai/s/JvSl4Hgvz3nYVtTIMwarZH5RcB7BA==} + eslint-plugin-svelte@2.43.0: + resolution: {integrity: sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 peerDependenciesMeta: svelte: optional: true @@ -1340,24 +1021,41 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.9.0: + resolution: {integrity: sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrap@1.2.2: @@ -1378,10 +1076,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1390,13 +1084,6 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -1417,30 +1104,12 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-type@3.9.0: - resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} - engines: {node: '>=0.10.0'} - - file-type@5.2.0: - resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} - engines: {node: '>=4'} - - file-type@6.2.0: - resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} - engines: {node: '>=4'} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1450,9 +1119,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -1460,8 +1129,8 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} form-data@4.0.0: @@ -1472,13 +1141,6 @@ packages: resolution: {integrity: sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==} engines: {node: ^14.13.1 || >=16.0.0} - frame-stream@3.0.1: - resolution: {integrity: sha512-Fu8Cdbt2hHfb7wp2HBG5AOfMO5qaglHoJuoiEoQKHS+mZtO/IsMiac3wEQtBVDmOLVmCmDeoutXbrfPlpwMiqg==} - engines: {node: '>=14'} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1490,10 +1152,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -1507,14 +1165,6 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} - engines: {node: '>=16'} - - get-stream@2.3.1: - resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} - engines: {node: '>=0.10.0'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1523,13 +1173,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1538,26 +1181,21 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.2: - resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globals@15.4.0: - resolution: {integrity: sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} @@ -1616,8 +1254,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} human-signals@2.1.0: @@ -1639,8 +1277,8 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -1661,11 +1299,8 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - inquirer@9.3.2: - resolution: {integrity: sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw==} + inquirer@9.3.6: + resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} engines: {node: '>=18'} internal-ip@7.0.0: @@ -1676,8 +1311,8 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} - interrogator@2.0.0: - resolution: {integrity: sha512-1qxXpxXznMEpBz4SwV6H16jlCdzDhj2Oww2IEpecZ1ouu3Hr34JOibSRmKe+8fdWZiicaAH80hUispXEuCb4Jw==} + interrogator@2.0.1: + resolution: {integrity: sha512-HPilaDW0ZSPEKhhj6NcklQi7jhYyad1r8l6tS9hYCxvVnlrrJAUMZ7GuGa5PFK3RmquLSk+iml2geBJjC+Yc9g==} ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} @@ -1713,10 +1348,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -1745,13 +1376,6 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-natural-number@4.0.1: - resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -1785,10 +1409,6 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -1805,35 +1425,18 @@ packages: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} - is2@2.0.9: - resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} - engines: {node: '>=v0.10.0'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -1843,12 +1446,8 @@ packages: isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} - - jose@4.15.5: - resolution: {integrity: sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1857,8 +1456,8 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@24.1.0: - resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} + jsdom@24.1.1: + resolution: {integrity: sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==} engines: {node: '>=18'} peerDependencies: canvas: ^2.11.2 @@ -1881,23 +1480,19 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.31.0: - resolution: {integrity: sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==} + known-css-properties@0.34.0: + resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lib0@0.2.94: - resolution: {integrity: sha512-hZ3p54jL4Wpu7IOg26uC7dnEWiMyNlUrb9KoG7+xYs45WkQwpVvKFndVq2+pqLYKe1u8Fp3+zAfZHVvTK34PvQ==} + lib0@0.2.97: + resolution: {integrity: sha512-Q4d1ekgvufi9FiHkkL46AhecfNjznSL9MRNoJRQ76gBHS9OqU2ArfQK0FvBpuxgWeJeNI0LVgAYMIpsGeX4gYg==} engines: {node: '>=16'} hasBin: true @@ -1915,63 +1510,21 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.flow@3.5.0: - resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} - - lodash.groupby@4.6.0: - resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - - lodash.mapvalues@4.6.0: - resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.omitby@4.6.0: - resolution: {integrity: sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==} - - lodash.partition@4.6.0: - resolution: {integrity: sha512-35L3dSF3Q6V1w5j6V3NhNlQjzsRDC/pYKCTdYTmwqSib+Q8ponkAmt/PwEOq3EmI38DSCl+SkIVwLd+uSlVdrg==} - - lodash.pick@4.4.0: - resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} - - lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - - lodash.uniqwith@4.5.0: - resolution: {integrity: sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - loglevel@1.9.1: - resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} - engines: {node: '>= 0.6.0'} - - long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} - lru-cache@10.3.0: - resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} - engines: {node: 14 || >=16.14} - - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2000,10 +1553,6 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2011,8 +1560,8 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -2022,9 +1571,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -2052,25 +1598,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-abi@3.63.0: - resolution: {integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==} - engines: {node: '>=10'} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2083,15 +1613,16 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nwsapi@2.2.10: - resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} + nwsapi@2.2.12: + resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} object-is@1.1.6: resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} @@ -2105,10 +1636,6 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} @@ -2203,9 +1730,6 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} @@ -2252,22 +1776,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -2300,12 +1808,12 @@ packages: peerDependencies: postcss: ^8.4.29 - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -2324,48 +1832,24 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-svelte@3.2.4: - resolution: {integrity: sha512-tZv+ADfeOWFNQkXkRh6zUXE16w3Vla8x2Ug0B/EnSmjR4EnwdwZbGgL/liSwR1kcEALU5mAAyua98HBxheCxgg==} + prettier-plugin-svelte@3.2.6: + resolution: {integrity: sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 - prettier@3.3.1: - resolution: {integrity: sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==} + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true - prisma@5.15.0: - resolution: {integrity: sha512-JA81ACQSCi3a7NUOgonOIkdx8PAVkO+HbUOxmd00Yb8DgIIEpr2V9+Qe/j6MLxIgWtE/OtVQ54rVjfYRbZsCfw==} - engines: {node: '>=16.13'} - hasBin: true - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - protobufjs@7.3.0: - resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} - engines: {node: '>=12.0.0'} - psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2376,13 +1860,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2415,13 +1892,8 @@ packages: 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 - hasBin: true - - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + rollup@4.21.0: + resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2445,20 +1917,9 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2469,17 +1930,13 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - seek-bzip@1.0.6: - resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} - hasBin: true - - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + set-cookie-parser@2.7.0: + resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -2511,25 +1968,16 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - sorcery@0.11.0: - resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + sorcery@0.11.1: + resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==} hasBin: true source-map-js@1.2.0: @@ -2540,11 +1988,6 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - squel@5.13.0: - resolution: {integrity: sha512-Fzd8zqbuqNwzodO3yO6MkX8qiDoVBuwqAaa3eKNz4idhBf24IQHbatBhLUiHAGGl962eGvPVRxzRuFWZlSf49w==} - engines: {node: '>= 0.12.0'} - deprecated: No longer maintained - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2563,20 +2006,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2588,9 +2017,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-dirs@2.1.0: - resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} - strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -2603,10 +2029,6 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2624,17 +2046,17 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - svelte-check@3.8.0: - resolution: {integrity: sha512-7Nxn+3X97oIvMzYJ7t27w00qUf1Y52irE2RU2dQAd5PyvfGp4E7NLhFKVhb6PV2fx7dCRMpNKDIuazmGthjpSQ==} + svelte-check@3.8.5: + resolution: {integrity: sha512-3OGGgr9+bJ/+1nbPgsvulkLC48xBsqsgtc8Wam281H4G9F5v3mYGa2bHRsPuwHC5brKl4AxJH95QF73kmfihGQ==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 - svelte-eslint-parser@0.36.0: - resolution: {integrity: sha512-/6YmUSr0FAVxW8dXNdIMydBnddPMHzaHirAZ7RrT21XYdgGGZMh0LQG6CZsvAFS4r2Y4ItUuCQc8TQ3urB30mQ==} + svelte-eslint-parser@0.41.0: + resolution: {integrity: sha512-L6f4hOL+AbgfBIB52Z310pg1d2QjRqm7wy3kI1W6hhdhX5bvu7+f0R6w4ykp5HoDdzq+vGhIJmsisaiJDGmVfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.115 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 peerDependenciesMeta: svelte: optional: true @@ -2689,23 +2111,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tcp-port-used@1.0.2: - resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} - - text-encoder-lite@2.0.0: - resolution: {integrity: sha512-bo08ND8LlBwPeU23EluRUcO3p2Rsb/eN5EIfOVqfRmblNDEVKK5IzM9Qfidvo+odT0hhV8mpXQcP/M5MMzABXw==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -2716,17 +2121,14 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinypool@1.0.0: - resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@1.2.0: @@ -2741,9 +2143,6 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - to-buffer@1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2756,9 +2155,6 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@5.0.0: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} @@ -2769,70 +2165,36 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typescript-eslint@7.12.0: - resolution: {integrity: sha512-D6HKNbQcnNu3BaN4HkQCR16tgG8Q2AMUWPgvhrJksOXu+d6ys07yC06ONiV2kcsEfWC22voB6C3PvK2MqlBZ7w==} - engines: {node: ^18.18.0 || >=20.0.0} + typescript-eslint@8.2.0: + resolution: {integrity: sha512-DmnqaPcML0xYwUzgNbM1XaKXpEb7BShYf2P1tkUmmcl8hyeG7Pj08Er7R9bNy6AufabywzJcOybQAtnD/c9DGw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} @@ -2851,20 +2213,17 @@ packages: resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} engines: {node: '>= 4'} - uuidv7@1.0.0: - resolution: {integrity: sha512-XkvPwTtSmYwxIE1FSYQTYg79zHL1ZWV5vM/Qyl9ahXCU8enOPPA4bTjzvafvYUB7l2+miv4EqK/qEe75cOXIdA==} + uuidv7@1.0.1: + resolution: {integrity: sha512-2noB909GbI352dKfASOY6VHHl59KvevZ1FF8gCAXCwDyrt2kkZhuFbczF9udqTfeejiRYEmO4wzUZ0WhVP+IUA==} hasBin: true - velona@0.8.0: - resolution: {integrity: sha512-faID/zMe6Tdu1VPFEcFW2UA5sc4Tkh8DwXwNiuQUJSXj+wdEHpoaA/fSqHQnSMPjsl+8lpe+bij4E6/iJ3D5oA==} - - vite-node@2.0.2: - resolution: {integrity: sha512-w4vkSz1Wo+NIQg8pjlEn0jQbcM/0D+xVaYjhw3cvarTanLLBh54oNiRbsT8PNK5GfuST0IlVXjsNRoNlqvY/fw==} + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.2.12: - resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} + vite@5.4.1: + resolution: {integrity: sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2872,6 +2231,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -2884,6 +2244,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -2899,15 +2261,15 @@ packages: vite: optional: true - vitest@2.0.2: - resolution: {integrity: sha512-WlpZ9neRIjNBIOQwBYfBSr0+of5ZCbxT2TVGKW4Lv0c8+srCFIiRdsP7U009t8mMn821HQ4XKgkx5dVWpyoyLw==} + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.2 - '@vitest/ui': 2.0.2 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2931,9 +2293,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -2950,9 +2309,6 @@ packages: resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} engines: {node: '>=18'} - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -2969,8 +2325,8 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -2993,8 +2349,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3020,9 +2376,6 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yjs@13.6.18: resolution: {integrity: sha512-GBTjO4QCmv2HFKFkYIJl7U77hIB1o22vSCSQD1Ge8ZxWbIbn8AltI4gyXbtL+g5/GJep67HCMq3Y5AmNwDSyEg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} @@ -3031,19 +2384,13 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors-cjs@2.1.1: - resolution: {integrity: sha512-c6T13b6qYcJZvck7QbEFXrFX/Mu2KOjvAGiKHmYMUg96jxNpfP6i+psGW72BOPxOIDUJrORG+Kyu7quMX9CQBQ==} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zod@3.21.1: - resolution: {integrity: sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==} - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - snapshots: '@ampproject/remapping@2.3.0': @@ -3080,17 +2427,17 @@ snapshots: '@databases/migrations-base@3.0.1': dependencies: - assert-never: 1.2.1 + assert-never: 1.3.0 chalk: 4.1.2 deep-equal: 2.2.3 - interrogator: 2.0.0 + interrogator: 2.0.1 is-interactive: 1.0.0 parameter-reducers: 2.1.0 - semver: 7.6.2 + semver: 7.6.3 - '@databases/pg-config@3.2.0(typescript@5.4.5)': + '@databases/pg-config@3.2.0(typescript@5.5.4)': dependencies: - cosmiconfig: 8.3.6(typescript@5.4.5) + cosmiconfig: 8.3.6(typescript@5.5.4) funtypes: 4.2.0 transitivePeerDependencies: - typescript @@ -3101,27 +2448,27 @@ snapshots: '@databases/pg-errors@1.0.0': {} - '@databases/pg-migrations@5.0.3(typescript@5.4.5)': + '@databases/pg-migrations@5.0.3(typescript@5.5.4)': dependencies: '@databases/migrations-base': 3.0.1 - '@databases/pg': 5.5.0(typescript@5.4.5) - '@databases/pg-config': 3.2.0(typescript@5.4.5) - assert-never: 1.2.1 + '@databases/pg': 5.5.0(typescript@5.5.4) + '@databases/pg-config': 3.2.0(typescript@5.5.4) + assert-never: 1.3.0 chalk: 4.1.2 - interrogator: 2.0.0 + interrogator: 2.0.1 is-interactive: 1.0.0 parameter-reducers: 2.1.0 - semver: 7.6.2 + semver: 7.6.3 sucrase: 3.35.0 transitivePeerDependencies: - pg-native - typescript - '@databases/pg@5.5.0(typescript@5.4.5)': + '@databases/pg@5.5.0(typescript@5.5.4)': dependencies: '@babel/code-frame': 7.24.7 '@databases/escape-identifier': 1.0.3 - '@databases/pg-config': 3.2.0(typescript@5.4.5) + '@databases/pg-config': 3.2.0(typescript@5.5.4) '@databases/pg-connection-string': 1.0.0 '@databases/pg-data-type-id': 3.0.0 '@databases/pg-errors': 1.0.0 @@ -3129,7 +2476,7 @@ snapshots: '@databases/shared': 3.1.0 '@databases/split-sql-query': 1.0.4(@databases/sql@3.3.0) '@databases/sql': 3.3.0 - assert-never: 1.2.1 + assert-never: 1.3.0 pg: 8.12.0 pg-cursor: 2.11.0(pg@8.12.0) transitivePeerDependencies: @@ -3158,98 +2505,97 @@ snapshots: '@databases/validate-unicode@1.0.0': {} - '@electric-sql/prisma-generator@1.1.5': - dependencies: - '@prisma/generator-helper': 4.16.2 - code-block-writer: 11.0.3 - lodash: 4.17.21 - zod: 3.21.1 - transitivePeerDependencies: - - supports-color - - '@esbuild/aix-ppc64@0.20.2': + '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/android-arm64@0.20.2': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm@0.20.2': + '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-x64@0.20.2': + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.20.2': + '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-x64@0.20.2': + '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/linux-arm64@0.20.2': + '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm@0.20.2': + '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-ia32@0.20.2': + '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-loong64@0.20.2': + '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.20.2': + '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-s390x@0.20.2': + '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-x64@0.20.2': + '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.20.2': + '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.20.2': + '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/win32-arm64@0.20.2': + '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-ia32@0.20.2': + '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-x64@0.20.2': + '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.0)': dependencies: - eslint: 8.57.0 + eslint: 9.9.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.1': {} + '@eslint-community/regexpp@4.11.0': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.17.1': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 + debug: 4.3.6 + espree: 10.1.0 + globals: 14.0.0 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -3257,23 +2603,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@9.9.0': {} - '@eslint/js@9.4.0': {} - - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@eslint/object-schema@2.1.4': {} '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.0': {} - '@inquirer/figures@1.0.3': {} + '@inquirer/figures@1.0.5': {} '@isaacs/cliui@8.0.2': dependencies: @@ -3287,19 +2625,19 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3318,169 +2656,96 @@ snapshots: '@polka/url@1.0.0-next.25': {} - '@prisma/client@4.8.1(prisma@5.15.0)': - dependencies: - '@prisma/engines-version': 4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe - optionalDependencies: - prisma: 5.15.0 - - '@prisma/client@5.15.0(prisma@5.15.0)': - optionalDependencies: - prisma: 5.15.0 - - '@prisma/debug@4.16.2': - dependencies: - '@types/debug': 4.1.8 - debug: 4.3.4 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - '@prisma/debug@5.15.0': {} - - '@prisma/engines-version@4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe': {} - - '@prisma/engines-version@5.15.0-29.12e25d8d06f6ea5a0252864dd9a03b1bb51f3022': {} - - '@prisma/engines@5.15.0': - dependencies: - '@prisma/debug': 5.15.0 - '@prisma/engines-version': 5.15.0-29.12e25d8d06f6ea5a0252864dd9a03b1bb51f3022 - '@prisma/fetch-engine': 5.15.0 - '@prisma/get-platform': 5.15.0 - - '@prisma/fetch-engine@5.15.0': - dependencies: - '@prisma/debug': 5.15.0 - '@prisma/engines-version': 5.15.0-29.12e25d8d06f6ea5a0252864dd9a03b1bb51f3022 - '@prisma/get-platform': 5.15.0 - - '@prisma/generator-helper@4.16.2': - dependencies: - '@prisma/debug': 4.16.2 - '@types/cross-spawn': 6.0.2 - cross-spawn: 7.0.3 - kleur: 4.1.5 - transitivePeerDependencies: - - supports-color - - '@prisma/get-platform@5.15.0': - dependencies: - '@prisma/debug': 5.15.0 - - '@protobufjs/aspromise@1.1.2': {} - - '@protobufjs/base64@1.1.2': {} - - '@protobufjs/codegen@2.0.4': {} - - '@protobufjs/eventemitter@1.1.0': {} - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - - '@protobufjs/float@1.0.2': {} - - '@protobufjs/inquire@1.1.0': {} - - '@protobufjs/path@1.1.2': {} - - '@protobufjs/pool@1.1.0': {} - - '@protobufjs/utf8@1.1.0': {} - - '@rollup/rollup-android-arm-eabi@4.18.0': + '@rollup/rollup-android-arm-eabi@4.21.0': optional: true - '@rollup/rollup-android-arm64@4.18.0': + '@rollup/rollup-android-arm64@4.21.0': optional: true - '@rollup/rollup-darwin-arm64@4.18.0': + '@rollup/rollup-darwin-arm64@4.21.0': optional: true - '@rollup/rollup-darwin-x64@4.18.0': + '@rollup/rollup-darwin-x64@4.21.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': + '@rollup/rollup-linux-arm-musleabihf@4.21.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': + '@rollup/rollup-linux-arm64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': + '@rollup/rollup-linux-arm64-musl@4.21.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': + '@rollup/rollup-linux-riscv64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': + '@rollup/rollup-linux-s390x-gnu@4.21.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': + '@rollup/rollup-linux-x64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': + '@rollup/rollup-linux-x64-musl@4.21.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': + '@rollup/rollup-win32-arm64-msvc@4.21.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': + '@rollup/rollup-win32-ia32-msvc@4.21.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': + '@rollup/rollup-win32-x64-msvc@4.21.0': optional: true - '@sveltejs/adapter-static@3.0.1(@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)))(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)))': + '@sveltejs/adapter-static@3.0.4(@sveltejs/kit@2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)))(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)))': dependencies: - '@sveltejs/kit': 2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)))(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)) + '@sveltejs/kit': 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)))(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)) - '@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)))(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1))': + '@sveltejs/kit@2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)))(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 esm-env: 1.0.0 import-meta-resolve: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.10 + magic-string: 0.30.11 mrmime: 2.0.0 sade: 1.8.1 - set-cookie-parser: 2.6.0 + set-cookie-parser: 2.7.0 sirv: 2.0.4 svelte: 5.0.0-next.160 tiny-glob: 0.2.9 - vite: 5.2.12(@types/node@20.14.1) + vite: 5.4.1(@types/node@22.4.1) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)))(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)))(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)) - debug: 4.3.5 + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)) + debug: 4.3.6 svelte: 5.0.0-next.160 - vite: 5.2.12(@types/node@20.14.1) + vite: 5.4.1(@types/node@22.4.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1))': + '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)))(svelte@5.0.0-next.160)(vite@5.2.12(@types/node@20.14.1)) - debug: 4.3.5 + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)))(svelte@5.0.0-next.160)(vite@5.4.1(@types/node@22.4.1)) + debug: 4.3.6 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.10 + magic-string: 0.30.11 svelte: 5.0.0-next.160 svelte-hmr: 0.16.0(svelte@5.0.0-next.160) - vite: 5.2.12(@types/node@20.14.1) - vitefu: 0.2.5(vite@5.2.12(@types/node@20.14.1)) + vite: 5.4.1(@types/node@22.4.1) + vitefu: 0.2.5(vite@5.4.1(@types/node@22.4.1)) transitivePeerDependencies: - supports-color @@ -3529,195 +2794,173 @@ snapshots: '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-beta.20 '@tauri-apps/cli-win32-x64-msvc': 2.0.0-beta.20 - '@tauri-apps/plugin-shell@2.0.0-beta.6': - dependencies: - '@tauri-apps/api': 2.0.0-beta.13 - - '@tauri-apps/plugin-sql@2.0.0-beta.5': - dependencies: - '@tauri-apps/api': 2.0.0-beta.13 - '@tauri-apps/plugin-store@2.0.0-beta.5': dependencies: '@tauri-apps/api': 2.0.0-beta.13 - '@types/better-sqlite3@7.6.10': + '@types/better-sqlite3@7.6.11': dependencies: - '@types/node': 20.14.1 + '@types/node': 22.4.1 '@types/cookie@0.6.0': {} - '@types/cross-spawn@6.0.2': - dependencies: - '@types/node': 20.14.1 - - '@types/debug@4.1.8': - dependencies: - '@types/ms': 0.7.34 - - '@types/eslint@8.56.10': + '@types/eslint@9.6.0': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 '@types/eslint__js@8.42.3': dependencies: - '@types/eslint': 8.56.10 + '@types/eslint': 9.6.0 '@types/estree@1.0.5': {} '@types/json-schema@7.0.15': {} - '@types/ms@0.7.34': {} - - '@types/node@20.14.1': + '@types/node@22.4.1': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 '@types/pug@2.0.10': {} - '@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0)(typescript@5.5.4))(eslint@9.9.0)(typescript@5.5.4)': dependencies: - '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/type-utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.12.0 - eslint: 8.57.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.2.0(eslint@9.9.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/type-utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.2.0 + eslint: 9.9.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@8.2.0(eslint@9.9.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.12.0 - debug: 4.3.5 - eslint: 8.57.0 + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.2.0 + debug: 4.3.6 + eslint: 9.9.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.12.0': + '@typescript-eslint/scope-manager@8.2.0': dependencies: - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/visitor-keys': 7.12.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/visitor-keys': 8.2.0 - '@typescript-eslint/type-utils@7.12.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@8.2.0(eslint@9.9.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.5 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4) + debug: 4.3.6 + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@7.12.0': {} + '@typescript-eslint/types@8.2.0': {} - '@typescript-eslint/typescript-estree@7.12.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@8.2.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/visitor-keys': 7.12.0 - debug: 4.3.5 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/visitor-keys': 8.2.0 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.12.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/utils@8.2.0(eslint@9.9.0)(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) - eslint: 8.57.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0) + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + eslint: 9.9.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.12.0': + '@typescript-eslint/visitor-keys@8.2.0': dependencies: - '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/types': 8.2.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} - - '@vitest/expect@2.0.2': + '@vitest/expect@2.0.5': dependencies: - '@vitest/spy': 2.0.2 - '@vitest/utils': 2.0.2 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/pretty-format@2.0.2': + '@vitest/pretty-format@2.0.5': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.0.2': + '@vitest/runner@2.0.5': dependencies: - '@vitest/utils': 2.0.2 + '@vitest/utils': 2.0.5 pathe: 1.1.2 - '@vitest/snapshot@2.0.2': + '@vitest/snapshot@2.0.5': dependencies: - '@vitest/pretty-format': 2.0.2 - magic-string: 0.30.10 + '@vitest/pretty-format': 2.0.5 + magic-string: 0.30.11 pathe: 1.1.2 - '@vitest/spy@2.0.2': + '@vitest/spy@2.0.5': dependencies: tinyspy: 3.0.0 - '@vitest/ui@2.0.2(vitest@2.0.2)': + '@vitest/ui@2.0.5(vitest@2.0.5)': dependencies: - '@vitest/utils': 2.0.2 + '@vitest/utils': 2.0.5 fast-glob: 3.3.2 fflate: 0.8.2 flatted: 3.3.1 pathe: 1.1.2 sirv: 2.0.4 tinyrainbow: 1.2.0 - vitest: 2.0.2(@types/node@20.14.1)(@vitest/ui@2.0.2)(jsdom@24.1.0) + vitest: 2.0.5(@types/node@22.4.1)(@vitest/ui@2.0.5)(jsdom@24.1.1) - '@vitest/utils@2.0.2': + '@vitest/utils@2.0.5': dependencies: - '@vitest/pretty-format': 2.0.2 + '@vitest/pretty-format': 2.0.5 estree-walker: 3.0.3 loupe: 3.1.1 tinyrainbow: 1.2.0 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 - acorn-typescript@1.4.13(acorn@8.12.0): + acorn-typescript@1.4.13(acorn@8.12.1): dependencies: - acorn: 8.12.0 - - acorn@8.11.3: {} + acorn: 8.12.1 - acorn@8.12.0: {} + acorn@8.12.1: {} agent-base@7.1.1: dependencies: - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -3766,57 +3009,24 @@ snapshots: array-union@2.1.0: {} - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - assert-never@1.2.1: {} + assert-never@1.3.0: {} assertion-error@2.0.1: {} - async-mutex@0.4.1: - dependencies: - tslib: 2.6.2 - asynckit@0.4.0: {} available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - axobject-query@4.0.0: - dependencies: - dequal: 2.0.3 + axobject-query@4.1.0: {} balanced-match@1.0.2: {} - base-64@1.0.0: {} - base64-js@1.5.1: {} - better-sqlite3@11.0.0: - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.2 - binary-extensions@2.3.0: {} - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bl@1.2.3: - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -3836,16 +3046,7 @@ snapshots: dependencies: fill-range: 7.1.1 - buffer-alloc-unsafe@1.1.0: {} - - buffer-alloc@1.2.0: - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - - buffer-crc32@0.2.13: {} - - buffer-fill@1.0.0: {} + buffer-crc32@1.0.0: {} buffer@5.7.1: dependencies: @@ -3899,8 +3100,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@1.1.4: {} - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -3911,8 +3110,6 @@ snapshots: clone@1.0.4: {} - code-block-writer@11.0.3: {} - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -3929,32 +3126,20 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@11.1.0: {} - - commander@2.20.3: {} - commander@4.1.1: {} concat-map@0.0.1: {} cookie@0.6.0: {} - core-util-is@1.0.3: {} - - cosmiconfig@8.3.6(typescript@5.4.5): + cosmiconfig@8.3.6(typescript@5.5.4): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.4.5 - - cross-fetch@3.1.8: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + typescript: 5.5.4 cross-spawn@7.0.3: dependencies: @@ -3973,80 +3158,12 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - debug@4.3.1: - dependencies: - ms: 2.1.2 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - debug@4.3.5: + debug@4.3.6: dependencies: ms: 2.1.2 decimal.js@10.4.3: {} - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - decompress-tar@4.1.1: - dependencies: - file-type: 5.2.0 - is-stream: 1.1.0 - tar-stream: 1.6.2 - - decompress-tarbz2@4.1.1: - dependencies: - decompress-tar: 4.1.1 - file-type: 6.2.0 - is-stream: 1.1.0 - seek-bzip: 1.0.6 - unbzip2-stream: 1.4.3 - - decompress-targz@4.1.1: - dependencies: - decompress-tar: 4.1.1 - file-type: 5.2.0 - is-stream: 1.1.0 - - decompress-unzip@4.0.1: - dependencies: - file-type: 3.9.0 - get-stream: 2.3.1 - pify: 2.3.0 - yauzl: 2.10.0 - - decompress@4.2.1: - dependencies: - decompress-tar: 4.1.1 - decompress-tarbz2: 4.1.1 - decompress-targz: 4.1.1 - decompress-unzip: 4.0.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - pify: 2.3.0 - strip-dirs: 2.1.0 - deep-eql@5.0.2: {} deep-equal@2.2.3: @@ -4070,8 +3187,6 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.15 - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -4102,136 +3217,24 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.3: {} - devalue@5.0.0: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dotenv-flow@4.1.0: - dependencies: - dotenv: 16.4.5 - - dotenv@16.4.5: {} - eastasianwidth@0.2.0: {} - electric-sql@0.12.1(@tauri-apps/plugin-sql@2.0.0-beta.5)(pg@8.12.0)(prisma@5.15.0)(zod@3.23.8): - dependencies: - '@electric-sql/prisma-generator': 1.1.5 - '@prisma/client': 4.8.1(prisma@5.15.0) - async-mutex: 0.4.1 - base-64: 1.0.0 - better-sqlite3: 11.0.0 - commander: 11.1.0 - cross-fetch: 3.1.8 - decompress: 4.2.1 - dotenv-flow: 4.1.0 - events: 3.3.0 - exponential-backoff: 3.1.1 - frame-stream: 3.0.1 - get-port: 7.1.0 - jose: 4.15.5 - lodash.flow: 3.5.0 - lodash.groupby: 4.6.0 - lodash.isequal: 4.5.0 - lodash.mapvalues: 4.6.0 - lodash.omitby: 4.6.0 - lodash.partition: 4.6.0 - lodash.pick: 4.4.0 - lodash.throttle: 4.1.1 - lodash.uniqwith: 4.5.0 - loglevel: 1.9.1 - long: 5.2.3 - object.hasown: 1.1.4 - ohash: 1.1.3 - prompts: 2.4.2 - protobufjs: 7.3.0 - squel: 5.13.0 - tcp-port-used: 1.0.2 - text-encoder-lite: 2.0.0 - ts-dedent: 2.2.0 - ws: 8.17.0 - zod: 3.23.8 - optionalDependencies: - '@tauri-apps/plugin-sql': 2.0.0-beta.5 - pg: 8.12.0 - prisma: 5.15.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - entities@4.5.0: {} error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 @@ -4250,82 +3253,64 @@ snapshots: isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - es6-promise@3.3.1: {} - esbuild@0.20.2: + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@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 escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@8.57.0): + eslint-compat-utils@0.5.1(eslint@9.9.0): dependencies: - eslint: 8.57.0 - semver: 7.6.2 + eslint: 9.9.0 + semver: 7.6.3 - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.0(eslint@9.9.0): dependencies: - eslint: 8.57.0 + eslint: 9.9.0 - eslint-plugin-svelte@2.39.0(eslint@8.57.0)(svelte@5.0.0-next.160): + eslint-plugin-svelte@2.43.0(eslint@9.9.0)(svelte@5.0.0-next.160): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@jridgewell/sourcemap-codec': 1.4.15 - debug: 4.3.5 - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0) + '@jridgewell/sourcemap-codec': 1.5.0 + eslint: 9.9.0 + eslint-compat-utils: 0.5.1(eslint@9.9.0) esutils: 2.0.3 - known-css-properties: 0.31.0 - postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38) - postcss-safe-parser: 6.0.0(postcss@8.4.38) - postcss-selector-parser: 6.1.0 - semver: 7.6.2 - svelte-eslint-parser: 0.36.0(svelte@5.0.0-next.160) + known-css-properties: 0.34.0 + postcss: 8.4.41 + postcss-load-config: 3.1.4(postcss@8.4.41) + postcss-safe-parser: 6.0.0(postcss@8.4.41) + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + svelte-eslint-parser: 0.41.0(svelte@5.0.0-next.160) optionalDependencies: svelte: 5.0.0-next.160 transitivePeerDependencies: - - supports-color - ts-node eslint-scope@7.2.2: @@ -4333,40 +3318,43 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.0.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint-visitor-keys@4.0.0: {} + + eslint@9.9.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.17.1 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.9.0 '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 + debug: 4.3.6 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -4380,19 +3368,25 @@ snapshots: esm-env@1.0.0: {} + espree@10.1.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 esrap@1.2.2: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.5 esrecurse@4.3.0: @@ -4407,8 +3401,6 @@ snapshots: esutils@2.0.3: {} - events@3.3.0: {} - execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -4433,10 +3425,6 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - expand-template@2.0.3: {} - - exponential-backoff@3.1.1: {} - external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -4461,23 +3449,11 @@ snapshots: dependencies: reusify: 1.0.4 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - fflate@0.8.2: {} - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 - - file-type@3.9.0: {} - - file-type@5.2.0: {} - - file-type@6.2.0: {} - - file-uri-to-path@1.0.0: {} + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -4488,11 +3464,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.1 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.1: {} @@ -4500,7 +3475,7 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.2.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -4513,10 +3488,6 @@ snapshots: fractional-indexing@3.2.0: {} - frame-stream@3.0.1: {} - - fs-constants@1.0.0: {} - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -4524,13 +3495,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - functions-have-names@1.2.3: {} funtypes@4.2.0: {} @@ -4545,25 +3509,10 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-port@7.1.0: {} - - get-stream@2.3.1: - dependencies: - object-assign: 4.1.1 - pinkie-promise: 2.0.1 - get-stream@6.0.1: {} get-stream@8.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - - github-from-package@0.0.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4572,11 +3521,11 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.2: + glob@10.4.5: dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 path-scurry: 1.11.1 @@ -4590,16 +3539,9 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} - globals@15.4.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 + globals@15.9.0: {} globalyzer@0.1.0: {} @@ -4608,7 +3550,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -4651,14 +3593,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.4: + https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -4676,7 +3618,7 @@ snapshots: ieee754@1.2.1: {} - ignore@5.3.1: {} + ignore@5.3.2: {} import-fresh@3.3.0: dependencies: @@ -4694,11 +3636,9 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: {} - - inquirer@9.3.2: + inquirer@9.3.6: dependencies: - '@inquirer/figures': 1.0.3 + '@inquirer/figures': 1.0.5 ansi-escapes: 4.3.2 cli-width: 4.1.0 external-editor: 3.1.0 @@ -4709,7 +3649,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.1 + yoctocolors-cjs: 2.1.2 internal-ip@7.0.0: dependencies: @@ -4724,9 +3664,9 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 - interrogator@2.0.0: + interrogator@2.0.1: dependencies: - inquirer: 9.3.2 + inquirer: 9.3.6 ip-regex@4.3.0: {} @@ -4759,10 +3699,6 @@ snapshots: is-callable@1.2.7: {} - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 @@ -4783,10 +3719,6 @@ snapshots: is-map@2.0.3: {} - is-natural-number@4.0.1: {} - - is-negative-zero@2.0.3: {} - is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -4814,8 +3746,6 @@ snapshots: dependencies: call-bind: 1.0.7 - is-stream@1.1.0: {} - is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -4828,54 +3758,34 @@ snapshots: dependencies: has-symbols: 1.0.3 - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-unicode-supported@0.1.0: {} - is-url@1.2.4: {} - is-weakmap@2.0.2: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - is2@2.0.9: - dependencies: - deep-is: 0.1.4 - ip-regex: 4.3.0 - is-url: 1.2.4 - - isarray@1.0.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} isomorphic.js@0.2.5: {} - jackspeak@3.4.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jose@4.15.5: {} - js-tokens@4.0.0: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsdom@24.1.0: + jsdom@24.1.1: dependencies: cssstyle: 4.0.1 data-urls: 5.0.0 @@ -4883,9 +3793,9 @@ snapshots: form-data: 4.0.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.10 + nwsapi: 2.2.12 parse5: 7.1.2 rrweb-cssom: 0.7.1 saxes: 6.0.0 @@ -4896,7 +3806,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.17.0 + ws: 8.18.0 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -4915,18 +3825,16 @@ snapshots: dependencies: json-buffer: 3.0.1 - kleur@3.0.3: {} - kleur@4.1.5: {} - known-css-properties@0.31.0: {} + known-css-properties@0.34.0: {} levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lib0@0.2.94: + lib0@0.2.97: dependencies: isomorphic.js: 0.2.5 @@ -4940,50 +3848,22 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.flow@3.5.0: {} - - lodash.groupby@4.6.0: {} - - lodash.isequal@4.5.0: {} - - lodash.mapvalues@4.6.0: {} - lodash.merge@4.6.2: {} - lodash.omitby@4.6.0: {} - - lodash.partition@4.6.0: {} - - lodash.pick@4.4.0: {} - - lodash.throttle@4.1.1: {} - - lodash.uniqwith@4.5.0: {} - - lodash@4.17.21: {} - log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loglevel@1.9.1: {} - - long@5.2.3: {} - loupe@3.1.1: dependencies: get-func-name: 2.0.2 - lru-cache@10.3.0: {} + lru-cache@10.4.3: {} - magic-string@0.30.10: + magic-string@0.30.11: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - - make-dir@1.3.0: - dependencies: - pify: 3.0.0 + '@jridgewell/sourcemap-codec': 1.5.0 merge-stream@2.0.0: {} @@ -5004,15 +3884,13 @@ snapshots: mimic-fn@4.0.0: {} - mimic-response@3.1.0: {} - min-indent@1.0.1: {} minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -5020,8 +3898,6 @@ snapshots: minipass@7.1.2: {} - mkdirp-classic@0.5.3: {} - mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -5042,18 +3918,8 @@ snapshots: nanoid@3.3.7: {} - napi-build-utils@1.0.2: {} - natural-compare@1.4.0: {} - node-abi@3.63.0: - dependencies: - semver: 7.6.2 - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - normalize-path@3.0.0: {} npm-run-path@4.0.1: @@ -5064,11 +3930,11 @@ snapshots: dependencies: path-key: 4.0.0 - nwsapi@2.2.10: {} + nwsapi@2.2.12: {} object-assign@4.1.1: {} - object-inspect@1.13.1: {} + object-inspect@1.13.2: {} object-is@1.1.6: dependencies: @@ -5084,12 +3950,6 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - object.hasown@1.1.4: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - ohash@1.1.3: {} once@1.4.0: @@ -5174,7 +4034,7 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.3.0 + lru-cache: 10.4.3 minipass: 7.1.2 path-type@4.0.0: {} @@ -5183,8 +4043,6 @@ snapshots: pathval@2.0.0: {} - pend@1.2.0: {} - pg-cloudflare@1.1.1: optional: true @@ -5228,41 +4086,31 @@ snapshots: picomatch@2.3.1: {} - pify@2.3.0: {} - - pify@3.0.0: {} - - pinkie-promise@2.0.1: - dependencies: - pinkie: 2.0.4 - - pinkie@2.0.4: {} - pirates@4.0.6: {} possible-typed-array-names@1.0.0: {} - postcss-load-config@3.1.4(postcss@8.4.38): + postcss-load-config@3.1.4(postcss@8.4.41): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.38 + postcss: 8.4.41 - postcss-safe-parser@6.0.0(postcss@8.4.38): + postcss-safe-parser@6.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.38 + postcss: 8.4.41 - postcss-scss@4.0.9(postcss@8.4.38): + postcss-scss@4.0.9(postcss@8.4.41): dependencies: - postcss: 8.4.38 + postcss: 8.4.41 - postcss-selector-parser@6.1.0: + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.38: + postcss@8.4.41: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -5278,86 +4126,23 @@ snapshots: dependencies: xtend: 4.0.2 - prebuild-install@7.1.2: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.63.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.2.4(prettier@3.3.1)(svelte@5.0.0-next.160): + prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@5.0.0-next.160): dependencies: - prettier: 3.3.1 + prettier: 3.3.3 svelte: 5.0.0-next.160 - prettier@3.3.1: {} - - prisma@5.15.0: - dependencies: - '@prisma/engines': 5.15.0 - - process-nextick-args@2.0.1: {} - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - protobufjs@7.3.0: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.1 - long: 5.2.3 + prettier@3.3.3: {} psl@1.9.0: {} - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - punycode@2.3.1: {} querystringify@2.2.0: {} queue-microtask@1.2.3: {} - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -5390,30 +4175,26 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rollup@4.18.0: + rollup@4.21.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.21.0 + '@rollup/rollup-android-arm64': 4.21.0 + '@rollup/rollup-darwin-arm64': 4.21.0 + '@rollup/rollup-darwin-x64': 4.21.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 + '@rollup/rollup-linux-arm-musleabihf': 4.21.0 + '@rollup/rollup-linux-arm64-gnu': 4.21.0 + '@rollup/rollup-linux-arm64-musl': 4.21.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 + '@rollup/rollup-linux-riscv64-gnu': 4.21.0 + '@rollup/rollup-linux-s390x-gnu': 4.21.0 + '@rollup/rollup-linux-x64-gnu': 4.21.0 + '@rollup/rollup-linux-x64-musl': 4.21.0 + '@rollup/rollup-win32-arm64-msvc': 4.21.0 + '@rollup/rollup-win32-ia32-msvc': 4.21.0 + '@rollup/rollup-win32-x64-msvc': 4.21.0 fsevents: 2.3.3 rrweb-cssom@0.6.0: {} @@ -5428,29 +4209,14 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 sade@1.8.1: dependencies: mri: 1.2.0 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safer-buffer@2.1.2: {} sander@0.5.1: @@ -5464,13 +4230,9 @@ snapshots: dependencies: xmlchars: 2.2.0 - seek-bzip@1.0.6: - dependencies: - commander: 2.20.3 - - semver@7.6.2: {} + semver@7.6.3: {} - set-cookie-parser@2.6.0: {} + set-cookie-parser@2.7.0: {} set-function-length@1.2.2: dependencies: @@ -5499,7 +4261,7 @@ snapshots: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.2 siginfo@2.0.0: {} @@ -5507,28 +4269,18 @@ snapshots: signal-exit@4.1.0: {} - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.25 mrmime: 2.0.0 totalist: 3.0.1 - sisteransi@1.0.5: {} - slash@3.0.0: {} - sorcery@0.11.0: + sorcery@0.11.1: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - buffer-crc32: 0.2.13 + '@jridgewell/sourcemap-codec': 1.5.0 + buffer-crc32: 1.0.0 minimist: 1.2.8 sander: 0.5.1 @@ -5536,8 +4288,6 @@ snapshots: split2@4.2.0: {} - squel@5.13.0: {} - stackback@0.0.2: {} std-env@3.7.0: {} @@ -5558,29 +4308,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -5593,10 +4320,6 @@ snapshots: dependencies: ansi-regex: 6.0.1 - strip-dirs@2.1.0: - dependencies: - is-natural-number: 4.0.1 - strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} @@ -5605,15 +4328,13 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.4.2 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -5627,17 +4348,15 @@ snapshots: dependencies: has-flag: 4.0.0 - svelte-check@3.8.0(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(svelte@5.0.0-next.160): + svelte-check@3.8.5(postcss-load-config@3.1.4(postcss@8.4.41))(postcss@8.4.41)(svelte@5.0.0-next.160): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 - fast-glob: 3.3.2 - import-fresh: 3.3.0 picocolors: 1.0.1 sade: 1.8.1 svelte: 5.0.0-next.160 - svelte-preprocess: 5.1.4(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(svelte@5.0.0-next.160)(typescript@5.4.5) - typescript: 5.4.5 + svelte-preprocess: 5.1.4(postcss-load-config@3.1.4(postcss@8.4.41))(postcss@8.4.41)(svelte@5.0.0-next.160)(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -5649,13 +4368,13 @@ snapshots: - stylus - sugarss - svelte-eslint-parser@0.36.0(svelte@5.0.0-next.160): + svelte-eslint-parser@0.41.0(svelte@5.0.0-next.160): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.38 - postcss-scss: 4.0.9(postcss@8.4.38) + postcss: 8.4.41 + postcss-scss: 4.0.9(postcss@8.4.41) optionalDependencies: svelte: 5.0.0-next.160 @@ -5663,71 +4382,37 @@ snapshots: dependencies: svelte: 5.0.0-next.160 - svelte-preprocess@5.1.4(postcss-load-config@3.1.4(postcss@8.4.38))(postcss@8.4.38)(svelte@5.0.0-next.160)(typescript@5.4.5): + svelte-preprocess@5.1.4(postcss-load-config@3.1.4(postcss@8.4.41))(postcss@8.4.41)(svelte@5.0.0-next.160)(typescript@5.5.4): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 - magic-string: 0.30.10 - sorcery: 0.11.0 + magic-string: 0.30.11 + sorcery: 0.11.1 strip-indent: 3.0.0 svelte: 5.0.0-next.160 optionalDependencies: - postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38) - typescript: 5.4.5 + postcss: 8.4.41 + postcss-load-config: 3.1.4(postcss@8.4.41) + typescript: 5.5.4 svelte@5.0.0-next.160: dependencies: '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.5 - acorn: 8.12.0 - acorn-typescript: 1.4.13(acorn@8.12.0) + acorn: 8.12.1 + acorn-typescript: 1.4.13(acorn@8.12.1) aria-query: 5.3.0 - axobject-query: 4.0.0 + axobject-query: 4.1.0 esm-env: 1.0.0 esrap: 1.2.2 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.10 + magic-string: 0.30.11 zimmerframe: 1.1.2 symbol-tree@3.2.4: {} - tar-fs@2.1.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - tar-stream@1.6.2: - dependencies: - bl: 1.2.3 - buffer-alloc: 1.2.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - readable-stream: 2.3.8 - to-buffer: 1.1.1 - xtend: 4.0.2 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tcp-port-used@1.0.2: - dependencies: - debug: 4.3.1 - is2: 2.0.9 - transitivePeerDependencies: - - supports-color - - text-encoder-lite@2.0.0: {} - text-table@0.2.0: {} thenify-all@1.6.0: @@ -5738,16 +4423,14 @@ snapshots: dependencies: any-promise: 1.3.0 - through@2.3.8: {} - tiny-glob@0.2.9: dependencies: globalyzer: 0.1.0 globrex: 0.1.2 - tinybench@2.8.0: {} + tinybench@2.9.0: {} - tinypool@1.0.0: {} + tinypool@1.0.1: {} tinyrainbow@1.2.0: {} @@ -5757,8 +4440,6 @@ snapshots: dependencies: os-tmpdir: 1.0.2 - to-buffer@1.1.1: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -5772,92 +4453,38 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - tr46@0.0.3: {} - tr46@5.0.0: dependencies: punycode: 2.3.1 - ts-api-utils@1.3.0(typescript@5.4.5): + ts-api-utils@1.3.0(typescript@5.5.4): dependencies: - typescript: 5.4.5 - - ts-dedent@2.2.0: {} + typescript: 5.5.4 ts-interface-checker@0.1.13: {} - tslib@2.6.2: {} - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 + tslib@2.6.3: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - type-fest@0.21.3: {} - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - - typescript-eslint@7.12.0(eslint@8.57.0)(typescript@5.4.5): + typescript-eslint@8.2.0(eslint@9.9.0)(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 + '@typescript-eslint/eslint-plugin': 8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0)(typescript@5.5.4))(eslint@9.9.0)(typescript@5.5.4) + '@typescript-eslint/parser': 8.2.0(eslint@9.9.0)(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.4 transitivePeerDependencies: + - eslint - supports-color - typescript@5.4.5: {} - - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - - unbzip2-stream@1.4.3: - dependencies: - buffer: 5.7.1 - through: 2.3.8 + typescript@5.5.4: {} - undici-types@5.26.5: {} + undici-types@6.19.8: {} universalify@0.2.0: {} @@ -5874,69 +4501,69 @@ snapshots: utility-types@3.11.0: {} - uuidv7@1.0.0: {} - - velona@0.8.0: {} + uuidv7@1.0.1: {} - vite-node@2.0.2(@types/node@20.14.1): + vite-node@2.0.5(@types/node@22.4.1): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.6 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.2.12(@types/node@20.14.1) + vite: 5.4.1(@types/node@22.4.1) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite@5.2.12(@types/node@20.14.1): + vite@5.4.1(@types/node@22.4.1): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.18.0 + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.21.0 optionalDependencies: - '@types/node': 20.14.1 + '@types/node': 22.4.1 fsevents: 2.3.3 - vitefu@0.2.5(vite@5.2.12(@types/node@20.14.1)): + vitefu@0.2.5(vite@5.4.1(@types/node@22.4.1)): optionalDependencies: - vite: 5.2.12(@types/node@20.14.1) + vite: 5.4.1(@types/node@22.4.1) - vitest@2.0.2(@types/node@20.14.1)(@vitest/ui@2.0.2)(jsdom@24.1.0): + vitest@2.0.5(@types/node@22.4.1)(@vitest/ui@2.0.5)(jsdom@24.1.1): dependencies: '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.2 - '@vitest/pretty-format': 2.0.2 - '@vitest/runner': 2.0.2 - '@vitest/snapshot': 2.0.2 - '@vitest/spy': 2.0.2 - '@vitest/utils': 2.0.2 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 chai: 5.1.1 - debug: 4.3.5 + debug: 4.3.6 execa: 8.0.1 - magic-string: 0.30.10 + magic-string: 0.30.11 pathe: 1.1.2 std-env: 3.7.0 - tinybench: 2.8.0 - tinypool: 1.0.0 + tinybench: 2.9.0 + tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.2.12(@types/node@20.14.1) - vite-node: 2.0.2(@types/node@20.14.1) - why-is-node-running: 2.2.2 + vite: 5.4.1(@types/node@22.4.1) + vite-node: 2.0.5(@types/node@22.4.1) + why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.14.1 - '@vitest/ui': 2.0.2(vitest@2.0.2) - jsdom: 24.1.0 + '@types/node': 22.4.1 + '@vitest/ui': 2.0.5(vitest@2.0.5) + jsdom: 24.1.1 transitivePeerDependencies: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color @@ -5950,8 +4577,6 @@ snapshots: dependencies: defaults: 1.0.4 - webidl-conversions@3.0.1: {} - webidl-conversions@7.0.0: {} whatwg-encoding@3.1.1: @@ -5965,11 +4590,6 @@ snapshots: tr46: 5.0.0 webidl-conversions: 7.0.0 - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -5997,7 +4617,7 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -6024,7 +4644,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.0: {} + ws@8.18.0: {} xml-name-validator@5.0.0: {} @@ -6034,21 +4654,12 @@ snapshots: yaml@1.10.2: {} - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yjs@13.6.18: dependencies: - lib0: 0.2.94 + lib0: 0.2.97 yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.1: {} + yoctocolors-cjs@2.1.2: {} zimmerframe@1.1.2: {} - - zod@3.21.1: {} - - zod@3.23.8: {} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 24139ff..db1449c 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + [[package]] name = "addr2line" version = "0.22.0" @@ -24,7 +30,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -219,9 +224,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.5.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -230,9 +235,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -398,7 +403,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -421,9 +426,25 @@ checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" dependencies = [ "bitflags 1.3.2", "block", - "cocoa-foundation", - "core-foundation", - "core-graphics", + "cocoa-foundation 0.1.2", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" +dependencies = [ + "bitflags 2.5.0", + "block", + "cocoa-foundation 0.2.0", + "core-foundation 0.10.0", + "core-graphics 0.24.0", "foreign-types", "libc", "objc", @@ -437,8 +458,22 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" +dependencies = [ + "bitflags 2.5.0", + "block", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", "libc", "objc", ] @@ -453,6 +488,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -475,11 +519,21 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" @@ -488,8 +542,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.5.0", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", "foreign-types", "libc", ] @@ -501,7 +568,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.5.0", + "core-foundation 0.10.0", "libc", ] @@ -730,16 +808,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.4.1" @@ -752,17 +820,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "dispatch" version = "0.2.0" @@ -878,21 +935,22 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + [[package]] name = "errno" version = "0.3.9" @@ -916,9 +974,14 @@ dependencies = [ [[package]] name = "event-listener" -version = "2.5.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] [[package]] name = "fastdivide" @@ -961,6 +1024,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "flume" version = "0.11.0" @@ -1443,9 +1515,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ "hashbrown 0.14.5", ] @@ -1455,9 +1527,6 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] [[package]] name = "heck" @@ -1701,25 +1770,6 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - [[package]] name = "itertools" version = "0.12.1" @@ -1806,15 +1856,27 @@ dependencies = [ [[package]] name = "json-patch" -version = "1.4.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" dependencies = [ + "jsonptr", "serde", "serde_json", "thiserror", ] +[[package]] +name = "jsonptr" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +dependencies = [ + "fluent-uri", + "serde", + "serde_json", +] + [[package]] name = "keyboard-types" version = "0.7.0" @@ -1901,7 +1963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1922,9 +1984,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" dependencies = [ "cc", "pkg-config", @@ -2121,11 +2183,11 @@ dependencies = [ [[package]] name = "muda" -version = "0.13.5" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b959f97c97044e4c96e32e1db292a7d594449546a3c6b77ae613dc3a5b5145" +checksum = "86c410a9d21523a819e84881603fbc00331c8001eb899964952046671deddb9c" dependencies = [ - "cocoa", + "cocoa 0.26.0", "crossbeam-channel", "dpi", "gtk", @@ -2135,7 +2197,7 @@ dependencies = [ "png", "serde", "thiserror", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2146,15 +2208,16 @@ checksum = "2195bf6aa996a481483b29d62a7663eed3fe39600c460e323f8ff41e90bdd89b" [[package]] name = "ndk" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "jni-sys", + "log", "ndk-sys", "num_enum", - "raw-window-handle 0.5.2", + "raw-window-handle", "thiserror", ] @@ -2166,9 +2229,9 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.4.1+23.1.7779620" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ "jni-sys", ] @@ -2270,23 +2333,23 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.72", ] [[package]] @@ -2437,33 +2500,12 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29" -[[package]] -name = "open" -version = "5.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb49fbd5616580e9974662cb96a3463da4476e649a7e4b258df0de065db0657" -dependencies = [ - "is-wsl", - "libc", - "pathdiff", -] - [[package]] name = "option-ext" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "os_pipe" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "overload" version = "0.1.1" @@ -2504,6 +2546,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.12.3" @@ -2524,7 +2572,7 @@ dependencies = [ "libc", "redox_syscall 0.5.1", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2533,12 +2581,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -2784,12 +2826,14 @@ dependencies = [ "macros", "serde", "serde_json", + "specta", + "specta-typescript", + "sqlx", "tantivy", "tauri", "tauri-build", - "tauri-plugin-shell", - "tauri-plugin-sql", "tauri-plugin-store", + "tauri-specta", "unicode-normalization", ] @@ -2979,12 +3023,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - [[package]] name = "raw-window-handle" version = "0.6.2" @@ -3282,6 +3320,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" +dependencies = [ + "erased-serde", + "serde", + "typeid", +] + [[package]] name = "serde_derive" version = "1.0.203" @@ -3440,16 +3489,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shared_child" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "signature" version = "2.2.0" @@ -3495,6 +3534,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -3514,7 +3556,7 @@ checksum = "d09e57a5a6b300bf917329da0ff30a58737d83abb7b14f99a419c23e83007cb8" dependencies = [ "bytemuck", "cfg_aliases", - "core-graphics", + "core-graphics 0.23.2", "foreign-types", "js-sys", "log", @@ -3522,7 +3564,7 @@ dependencies = [ "objc2-app-kit", "objc2-foundation", "objc2-quartz-core", - "raw-window-handle 0.6.2", + "raw-window-handle", "redox_syscall 0.5.1", "wasm-bindgen", "wayland-sys", @@ -3556,6 +3598,50 @@ dependencies = [ "system-deps", ] +[[package]] +name = "specta" +version = "2.0.0-rc.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ccbb212565d2dc177bc15ecb7b039d66c4490da892436a4eee5b394d620c9bc" +dependencies = [ + "paste", + "specta-macros", + "thiserror", +] + +[[package]] +name = "specta-macros" +version = "2.0.0-rc.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68999d29816965eb9e5201f60aec02a76512139811661a7e8e653abc810b8f72" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "specta-serde" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12260cbb21abb2e83a0375b1521867910e3aed8a7afa782206150ce552cd2e5a" +dependencies = [ + "specta", + "thiserror", +] + +[[package]] +name = "specta-typescript" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4472229365ceb6395487e3a60d921ad8e21f9ad06eaecc396f098902c9adc" +dependencies = [ + "specta", + "specta-serde", + "thiserror", +] + [[package]] name = "spin" version = "0.5.2" @@ -3583,20 +3669,19 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" dependencies = [ - "itertools", "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" +checksum = "27144619c6e5802f1380337a209d2ac1c431002dd74c6e60aebff3c506dc4f0c" dependencies = [ "sqlx-core", "sqlx-macros", @@ -3607,11 +3692,10 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +checksum = "a999083c1af5b5d6c071d34a708a19ba3e02106ad82ef7bbd69f5e48266b613b" dependencies = [ - "ahash", "atoi", "byteorder", "bytes", @@ -3624,6 +3708,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", + "hashbrown 0.14.5", "hashlink", "hex", "indexmap 2.2.6", @@ -3638,35 +3723,32 @@ dependencies = [ "smallvec", "sqlformat", "thiserror", - "time", - "tokio", - "tokio-stream", "tracing", "url", ] [[package]] name = "sqlx-macros" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" +checksum = "a23217eb7d86c584b8cbe0337b9eacf12ab76fe7673c513141ec42565698bb88" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 1.0.109", + "syn 2.0.72", ] [[package]] name = "sqlx-macros-core" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" +checksum = "1a099220ae541c5db479c6424bdf1b200987934033c2584f79a0e1693601e776" dependencies = [ "dotenvy", "either", - "heck 0.4.1", + "heck 0.5.0", "hex", "once_cell", "proc-macro2", @@ -3678,20 +3760,19 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 1.0.109", + "syn 2.0.72", "tempfile", - "tokio", "url", ] [[package]] name = "sqlx-mysql" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +checksum = "5afe4c38a9b417b6a9a5eeffe7235d0a106716495536e7727d1c7f4b1ff3eba6" dependencies = [ "atoi", - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.5.0", "byteorder", "bytes", @@ -3722,19 +3803,18 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", - "time", "tracing", "whoami", ] [[package]] name = "sqlx-postgres" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" +checksum = "b1dbb157e65f10dbe01f729339c06d239120221c9ad9fa0ba8408c4cc18ecf21" dependencies = [ "atoi", - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.5.0", "byteorder", "crc", @@ -3761,16 +3841,15 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", - "time", "tracing", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +checksum = "9b2cdd83c008a622d94499c0006d8ee5f821f36c89b7d625c900e5dc30b5c5ee" dependencies = [ "atoi", "flume", @@ -3783,11 +3862,10 @@ dependencies = [ "log", "percent-encoding", "serde", + "serde_urlencoded", "sqlx-core", - "time", "tracing", "url", - "urlencoding", ] [[package]] @@ -3850,9 +3928,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "swift-rs" @@ -4049,14 +4127,14 @@ dependencies = [ [[package]] name = "tao" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12a8121bd5721ebbbe0889f8286d5824673beeb04071519b68916fbed04f3093" +checksum = "6775bcf3c1da33f848ede9cff5883ed1e45a29f66533ce42ad06c93ae514ed59" dependencies = [ "bitflags 2.5.0", - "cocoa", - "core-foundation", - "core-graphics", + "cocoa 0.26.0", + "core-foundation 0.10.0", + "core-graphics 0.24.0", "crossbeam-channel", "dispatch", "dlopen2", @@ -4075,13 +4153,13 @@ dependencies = [ "objc", "once_cell", "parking_lot", - "raw-window-handle 0.6.2", + "raw-window-handle", "scopeguard", "tao-macros", "unicode-segmentation", "url", - "windows 0.56.0", - "windows-core 0.56.0", + "windows 0.58.0", + "windows-core 0.58.0", "windows-version", "x11-dl", ] @@ -4105,14 +4183,14 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tauri" -version = "2.0.0-beta.22" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a258ecc5ac7ddade525f512c4962fd01cd0f5265e917b4572579c32c027bb31" +checksum = "79776954e2cd6b6c3b56e2cd99905a3a166017495a39ac8eb4c85dd8ea8704b4" dependencies = [ "anyhow", "bytes", - "cocoa", - "dirs-next", + "cocoa 0.26.0", + "dirs", "dunce", "embed_plist", "futures-util", @@ -4128,12 +4206,13 @@ dependencies = [ "muda", "objc", "percent-encoding", - "raw-window-handle 0.6.2", + "raw-window-handle", "reqwest", "serde", "serde_json", "serde_repr", "serialize-to-javascript", + "specta", "state", "swift-rs", "tauri-build", @@ -4149,18 +4228,18 @@ dependencies = [ "webkit2gtk", "webview2-com", "window-vibrancy", - "windows 0.56.0", + "windows 0.58.0", ] [[package]] name = "tauri-build" -version = "2.0.0-beta.17" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b964bb6d03d97e24e12f896aab463b02a3c2ff76a60f728cc37b5548eb470e" +checksum = "1fc103bde77870e08d5fc8765615b9615997827550b626fbc4ebbd7a1fbfe2a2" dependencies = [ "anyhow", "cargo_toml", - "dirs-next", + "dirs", "glob", "heck 0.5.0", "json-patch", @@ -4176,9 +4255,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.0-beta.17" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3529cfa977ed7c097f2a5e8da19ecffbe61982450a6c819e6165b6d0cfd3dd3a" +checksum = "ea061e6be9b37ab455eadc189f45617deafc85c94f78f9cd584862a6deaa83d1" dependencies = [ "base64 0.22.1", "brotli", @@ -4203,9 +4282,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.0-beta.17" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f97dd80334f29314aa5f40b5fad10cb9feffd08e5a5324fd728613841e5d33" +checksum = "9e20d6f6f96f55a43339c465b3c8205d71940372d54d7c665c5329e8e4ba35d0" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -4217,9 +4296,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.0.0-beta.17" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c8385fd0a4f661f5652b0d9e2d7256187d553bb174f88564d10ebcfa6a3af53" +checksum = "ec01af01098a286d3e430c1fa947bfd77bc8011ecb209438af4444b02d82b29e" dependencies = [ "anyhow", "glob", @@ -4232,51 +4311,11 @@ dependencies = [ "walkdir", ] -[[package]] -name = "tauri-plugin-shell" -version = "2.0.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8675bf7ab71f571a99192d0685ae870eb7af1264bdbbb66a1d655609f6c7ebd" -dependencies = [ - "encoding_rs", - "log", - "open", - "os_pipe", - "regex", - "schemars", - "serde", - "serde_json", - "shared_child", - "tauri", - "tauri-plugin", - "thiserror", - "tokio", -] - -[[package]] -name = "tauri-plugin-sql" -version = "2.0.0-beta.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b30b7a66a9c7622a8b34ab6406f083030e8c3524191e00699ba2fe2d48c395b" -dependencies = [ - "futures-core", - "indexmap 2.2.6", - "log", - "serde", - "serde_json", - "sqlx", - "tauri", - "tauri-plugin", - "thiserror", - "time", - "tokio", -] - [[package]] name = "tauri-plugin-store" -version = "2.0.0-beta.8" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a714175f639b050b121c74b6281724f4b00e080a5a71c6821004c8aa89f8943" +checksum = "fb93dc0d2bb4d26e8b1738eb5030b9dd9fa79649e304cb2dc702b3f6042d72f3" dependencies = [ "dunce", "log", @@ -4289,36 +4328,36 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.0.0-beta.18" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7dc96172a43536236ab55b7da7b8461bf75810985e668589e2395cb476937cb" +checksum = "f4e736d3293f8347e5d2c5b250fe0e5b873499f5483578b139445dbbf802e2e5" dependencies = [ "dpi", "gtk", "http", "jni", - "raw-window-handle 0.6.2", + "raw-window-handle", "serde", "serde_json", "tauri-utils", "thiserror", "url", - "windows 0.56.0", + "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "2.0.0-beta.18" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4fd913b1f14a9b618c7f3ae35656d3aa759767fcb95b72006357c12b9d0b09" +checksum = "9fead81c1bd0205d5f02580e64f522704618274e784c2d1c127e4ba19acd0b79" dependencies = [ - "cocoa", + "cocoa 0.26.0", "gtk", "http", "jni", "log", "percent-encoding", - "raw-window-handle 0.6.2", + "raw-window-handle", "softbuffer", "tao", "tauri-runtime", @@ -4326,15 +4365,43 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows 0.56.0", + "windows 0.58.0", "wry", ] +[[package]] +name = "tauri-specta" +version = "2.0.0-rc.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b37d5f9a690f0c5264e5461a2cd9a273565f9a12acf642692a16ea292e32f6b" +dependencies = [ + "heck 0.5.0", + "serde", + "serde_json", + "specta", + "specta-typescript", + "tauri", + "tauri-specta-macros", + "thiserror", +] + +[[package]] +name = "tauri-specta-macros" +version = "2.0.0-rc.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a4aa93823e07859546aa796b8a5d608190cd8037a3a5dce3eb63d491c34bda8" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "tauri-utils" -version = "2.0.0-beta.17" +version = "2.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f24a9c20d676a3f025331cc1c3841256ba88c9f25fb7fae709d2b3089c50d90" +checksum = "285af18e09665ea15fdda04cb28fb579a4d71b4e1640628489fecca98838ca9a" dependencies = [ "brotli", "cargo_metadata", @@ -4354,6 +4421,7 @@ dependencies = [ "schemars", "semver", "serde", + "serde-untagged", "serde_json", "serde_with", "swift-rs", @@ -4495,17 +4563,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.11" @@ -4669,22 +4726,23 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.14.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b27516dfcfa22a9faaf192283a122bfbede38c1e59ef194e3c4db6549b419c0" +checksum = "2b92252d649d771105448969f2b2dda4342ba48b77731b60d37c93665e26615b" dependencies = [ - "cocoa", - "core-graphics", + "core-graphics 0.24.0", "crossbeam-channel", "dirs", "libappindicator", "muda", - "objc", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", "png", "serde", "thiserror", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4693,6 +4751,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + [[package]] name = "typenum" version = "1.17.0" @@ -4769,9 +4833,9 @@ dependencies = [ [[package]] name = "unicode-properties" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" [[package]] name = "unicode-segmentation" @@ -4797,12 +4861,6 @@ dependencies = [ "serde", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "urlpattern" version = "0.2.0" @@ -5065,23 +5123,23 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.30.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c914dd492a52f0377bef56fd1b6e74a79090f9ee631d625d5b505a00e4538b6" +checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.56.0", - "windows-core 0.56.0", + "windows 0.58.0", + "windows-core 0.58.0", "windows-implement", "windows-interface", ] [[package]] name = "webview2-com-macros" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", @@ -5090,13 +5148,13 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.30.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a46bcf03482ec28eeb764ca788f67998cde4213adfbbfa90462622058530f5e" +checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ "thiserror", - "windows 0.56.0", - "windows-core 0.56.0", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] @@ -5152,9 +5210,9 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33082acd404763b315866e14a0d5193f3422c81086657583937a750cdd3ec340" dependencies = [ - "cocoa", + "cocoa 0.25.0", "objc", - "raw-window-handle 0.6.2", + "raw-window-handle", "windows-sys 0.52.0", "windows-version", ] @@ -5170,12 +5228,12 @@ dependencies = [ [[package]] name = "windows" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core 0.56.0", - "windows-targets 0.52.5", + "windows-core 0.58.0", + "windows-targets 0.52.6", ] [[package]] @@ -5184,26 +5242,27 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "windows-core" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ "windows-implement", "windows-interface", "windows-result", - "windows-targets 0.52.5", + "windows-strings", + "windows-targets 0.52.6", ] [[package]] name = "windows-implement" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", @@ -5212,9 +5271,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", @@ -5223,11 +5282,21 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -5254,7 +5323,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -5289,18 +5367,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -5309,7 +5387,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -5326,9 +5404,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -5344,9 +5422,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -5362,15 +5440,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -5386,9 +5464,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -5404,9 +5482,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -5422,9 +5500,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -5440,9 +5518,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -5465,14 +5543,14 @@ dependencies = [ [[package]] name = "wry" -version = "0.40.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa597526af53f310a8e6218630c5024fdde8271f229e70d7d2fc70b52b8fb1e" +checksum = "49b8049c8f239cdbfaaea4bacb9646f6b208938ceec0acd5b3e99cd05f70903f" dependencies = [ "base64 0.22.1", "block", - "cocoa", - "core-graphics", + "cocoa 0.26.0", + "core-graphics 0.24.0", "crossbeam-channel", "dpi", "dunce", @@ -5485,13 +5563,11 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "ndk-context", - "ndk-sys", "objc", "objc_id", "once_cell", "percent-encoding", - "raw-window-handle 0.6.2", + "raw-window-handle", "sha2", "soup3", "tao-macros", @@ -5499,8 +5575,8 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.56.0", - "windows-core 0.56.0", + "windows 0.58.0", + "windows-core 0.58.0", "windows-version", "x11-dl", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index b923afe..5556556 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -2,7 +2,7 @@ name = "potrin" version = "0.0.0" description = "A Tauri App" -authors = ["you"] +authors = ["Joichiro Hayashi"] edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -12,22 +12,21 @@ name = "potrin_lib" crate-type = ["lib", "cdylib", "staticlib"] [build-dependencies] -tauri-build = { version = "2.0.0-beta.17", features = [] } +tauri-build = { version = "=2.0.0-rc.3" ,features = ["config-toml"] } [dependencies] -tauri = { version = "2.0.0-beta.22", features = [] } -tauri-plugin-shell = "2.0.0-beta.7" -tauri-plugin-store = "2.0.0-beta.8" -serde = { version = "1", features = ["derive"] } -serde_json = "1.0.120" -anyhow = "1.0.86" +tauri = { version = "=2.0.0-rc.3" ,features = ["config-toml"] } +tauri-plugin-store = "^2.0.0-rc" +specta = "=2.0.0-rc.20" +specta-typescript = "0.0.7" +tauri-specta = { version = "=2.0.0-rc.17", features = ["derive", "typescript"] } +serde = { version = "^1", features = ["derive"] } +serde_json = "^1.0" +anyhow = "^1.0" macros = { path = "macros" } -tantivy = "0.22.0" -unicode-normalization = "0.1.20" -cjk = "0.2" -diacritics = "0.2.2" +tantivy = "^0.22" +unicode-normalization = "^0.1.20" +cjk = "^0.2" +diacritics = "^0.2" +sqlx = "^0.8.0" - -[dependencies.tauri-plugin-sql] -features = ["sqlite"] # or "postgres", or "mysql" -version = "2.0.0-beta.6" diff --git a/src-tauri/Tauri.toml b/src-tauri/Tauri.toml new file mode 100644 index 0000000..7d98f03 --- /dev/null +++ b/src-tauri/Tauri.toml @@ -0,0 +1,28 @@ +productName = "potrin" +version = "0.0.0" +identifier = "com.potrin.dev" + +[build] +beforeDevCommand = "pnpm dev" +devUrl = "http://localhost:1420" +beforeBuildCommand = "pnpm build" +frontendDist = "../build" + +[[app.windows]] +title = "potrin" +width = 800 +height = 600 + +[app.security] +capabilities = [ "main-capability" ] + +[bundle] +active = true +targets = "all" +icon = [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" +] diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json deleted file mode 100644 index 2172c4a..0000000 --- a/src-tauri/capabilities/default.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "Capability for the main window", - "windows": [ - "main" - ], - "permissions": [ - "path:default", - "event:default", - "window:default", - "app:default", - "image:default", - "resources:default", - "menu:default", - "tray:default", - "shell:allow-open", - "store:default" - ] -} \ No newline at end of file diff --git a/src-tauri/capabilities/main.json b/src-tauri/capabilities/main.json deleted file mode 100644 index 3aa4520..0000000 --- a/src-tauri/capabilities/main.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "main-capability", - "description": "Capability for the main window", - "windows": ["main"], - "permissions": [ - "store:allow-get", - "store:allow-set", - "store:allow-save", - "store:allow-load" - ] -} diff --git a/src-tauri/capabilities/main.toml b/src-tauri/capabilities/main.toml new file mode 100644 index 0000000..d8243ec --- /dev/null +++ b/src-tauri/capabilities/main.toml @@ -0,0 +1,13 @@ +"$schema" = "../gen/schemas/desktop-schema.json" +identifier = "main-capability" +description = "Capability for the main window" +windows = [ "main" ] +permissions = [ + "core:app:default", + "store:default", + "store:allow-get", + "store:allow-set", + "store:allow-save", + "store:allow-load" +] + diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 22470a9..6648514 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,21 +1,31 @@ mod tantivy_interface; +use specta_typescript::Typescript; +use tauri_specta::{collect_commands, Builder}; + // Learn more about Tauri commands at https://tauri.app/v1/guides/features/command #[tauri::command] +#[specta::specta] fn greet(name: &str) -> String { format!("Hello, {}! You've been greeted from Rust!", name) } #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { + let builder = Builder::::new().commands(collect_commands![ + greet, + tantivy_interface::init, + tantivy_interface::index, + tantivy_interface::search + ]); + + #[cfg(debug_assertions)] + builder + .export(Typescript::default(), "../src/generated/tauri-commands.ts") + .expect("Failed to export typescript bindings"); + tauri::Builder::default() - .plugin(tauri_plugin_shell::init()) - .invoke_handler(tauri::generate_handler![ - greet, - tantivy_interface::init, - tantivy_interface::index, - tantivy_interface::search, - ]) + .invoke_handler(builder.invoke_handler()) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 524c5fa..7f260b8 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -5,7 +5,6 @@ fn main() { potrin_lib::run(); tauri::Builder::default() .plugin(tauri_plugin_store::Builder::new().build()) - .plugin(tauri_plugin_sql::Builder::default().build()) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/src/tantivy_interface.rs b/src-tauri/src/tantivy_interface.rs index 664cda8..8a61ccd 100644 --- a/src-tauri/src/tantivy_interface.rs +++ b/src-tauri/src/tantivy_interface.rs @@ -4,6 +4,7 @@ use anyhow::anyhow; use cjk_bigram_tokenizer::CJKBigramTokenizer; use diacritics::remove_diacritics; use serde::{Deserialize, Serialize}; +use specta::Type; use std::fs; use std::path::Path; use std::sync::{Mutex, OnceLock}; @@ -17,14 +18,16 @@ use tantivy::{Index, IndexWriter}; use tauri::{AppHandle, Manager}; use unicode_normalization::UnicodeNormalization; -#[derive(Debug, Serialize, Deserialize)] +#[cfg_attr(debug_assertions, derive(Type, Debug))] +#[derive(Serialize, Deserialize)] pub struct IndexTarget { id: String, doc_type: String, text: String, } -#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(debug_assertions, derive(Type, Debug, PartialEq))] +#[derive(Serialize, Deserialize)] pub struct SearchResult { id: String, doc_type: String, @@ -54,7 +57,8 @@ fn get_once_lock(lock: &OnceLock) -> anyhow::Result<&T> { } #[tauri::command] -pub fn init(app_handle: AppHandle) -> Result<(), String> { +#[specta::specta] +pub async fn init(app_handle: AppHandle) -> Result<(), String> { build_schema(Some(app_handle)) } @@ -129,8 +133,9 @@ fn build_schema(app_handle: Option) -> anyhow::Result<()> { } #[tauri::command] +#[specta::specta] #[macros::anyhow_to_string] -pub fn index(input: Vec) -> anyhow::Result<()> { +pub async fn index(input: Vec) -> anyhow::Result<()> { let mut writer = get_once_lock(&WRITER)? .lock() .map_err(|e| anyhow!(e.to_string()))?; @@ -156,11 +161,12 @@ pub fn index(input: Vec) -> anyhow::Result<()> { } #[tauri::command] +#[specta::specta] #[macros::anyhow_to_string] -pub fn search( +pub async fn search( query: &str, levenshtein_distance: u8, - limit: usize, + limit: u8, ) -> anyhow::Result> { let mut results: Vec = vec![]; let query = remove_diacritics(query.nfc().collect::().as_str()); @@ -178,7 +184,7 @@ pub fn search( let query_parsed = query_parser.parse_query(&query)?; - let top_docs = searcher.search(&query_parsed, &TopDocs::with_limit(limit))?; + let top_docs = searcher.search(&query_parsed, &TopDocs::with_limit(limit as usize))?; for (_, doc_addres) in top_docs { let retreived_doc = searcher.doc::(doc_addres)?; diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json deleted file mode 100644 index 46fe852..0000000 --- a/src-tauri/tauri.conf.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "productName": "potrin", - "version": "0.0.0", - "identifier": "com.tauri.dev", - "build": { - "beforeDevCommand": "pnpm dev", - "devUrl": "http://localhost:1420", - "beforeBuildCommand": "pnpm build", - "frontendDist": "../build" - }, - "app": { - "windows": [ - { - "title": "potrin", - "width": 800, - "height": 600 - } - ], - "security": { - "csp": null - } - }, - "bundle": { - "active": true, - "targets": "all", - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ] - } -} diff --git a/src/generated/tauri-commands.ts b/src/generated/tauri-commands.ts new file mode 100644 index 0000000..5d46f97 --- /dev/null +++ b/src/generated/tauri-commands.ts @@ -0,0 +1,108 @@ + +// This file was generated by [tauri-specta](https://github.com/oscartbeaumont/tauri-specta). Do not edit this file manually. + +/** user-defined commands **/ + + +export const commands = { +async greet(name: string) : Promise { + return await TAURI_INVOKE("greet", { name }); +}, +async init() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("init") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async index(input: IndexTarget[]) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("index", { input }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async search(query: string, levenshteinDistance: number, limit: number) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("search", { query, levenshteinDistance, limit }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +} +} + +/** user-defined events **/ + + + +/** user-defined constants **/ + + + +/** user-defined types **/ + +export type IndexTarget = { id: string; doc_type: string; text: string } +export type SearchResult = { id: string; doc_type: string } + +/** tauri-specta globals **/ + +import { + invoke as TAURI_INVOKE, + Channel as TAURI_CHANNEL, +} from "@tauri-apps/api/core"; +import * as TAURI_API_EVENT from "@tauri-apps/api/event"; +import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow"; + +type __EventObj__ = { + listen: ( + cb: TAURI_API_EVENT.EventCallback, + ) => ReturnType>; + once: ( + cb: TAURI_API_EVENT.EventCallback, + ) => ReturnType>; + emit: T extends null + ? (payload?: T) => ReturnType + : (payload: T) => ReturnType; +}; + +export type Result = + | { status: "ok"; data: T } + | { status: "error"; error: E }; + +function __makeEvents__>( + mappings: Record, +) { + return new Proxy( + {} as unknown as { + [K in keyof T]: __EventObj__ & { + (handle: __WebviewWindow__): __EventObj__; + }; + }, + { + get: (_, event) => { + const name = mappings[event as keyof T]; + + return new Proxy((() => {}) as any, { + apply: (_, __, [window]: [__WebviewWindow__]) => ({ + listen: (arg: any) => window.listen(name, arg), + once: (arg: any) => window.once(name, arg), + emit: (arg: any) => window.emit(name, arg), + }), + get: (_, command: keyof __EventObj__) => { + switch (command) { + case "listen": + return (arg: any) => TAURI_API_EVENT.listen(name, arg); + case "once": + return (arg: any) => TAURI_API_EVENT.once(name, arg); + case "emit": + return (arg: any) => TAURI_API_EVENT.emit(name, arg); + } + }, + }); + }, + }, + ); +} diff --git a/src/lib/DataAccess/SearchEngine.ts b/src/lib/DataAccess/SearchEngine.ts deleted file mode 100644 index ffa5a77..0000000 --- a/src/lib/DataAccess/SearchEngine.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { invoke } from "@tauri-apps/api/core"; - -type IndexTarget = { - id: string; - doc_type: "card" | "thread"; - text: string; -}; - -type SearchOption = { - levenshteinDistance?: number; - limit?: number; -}; - -type SearchResult = { - id: string; - doc_type: "card" | "thread"; -}; - -const index = async (input: IndexTarget[]): Promise => { - await invoke("index", { - input: input, - }); -}; - -const search = async ( - query: string, - option?: SearchOption, -): Promise => { - return await invoke("search", { - query, - levenshteinDistance: option?.levenshteinDistance || 2, - limit: option?.limit || 100, - }); -}; - -export const SearchEngine = { - index, - search, -} as const; diff --git a/src/lib/DataAccess/TableReconciler.ts b/src/lib/DataAccess/TableReconciler.ts index a9d0102..7c2f467 100644 --- a/src/lib/DataAccess/TableReconciler.ts +++ b/src/lib/DataAccess/TableReconciler.ts @@ -1,342 +1,342 @@ -import type { ElectricClient } from "electric-sql/client/model"; -import type { schema } from "../../generated/client"; -import { sql } from "$lib/Utils/utils"; -type Schema = typeof schema; - -const threadHooks: Array<(electric: ElectricClient) => void> = []; -const cardHooks: Array<(electric: ElectricClient) => void> = []; - -export const TableReconciler = { - init: async (electric: ElectricClient) => { - await createLogTableAndTrigger(electric); - await Promise.all([reconcileThreads(electric), reconcileCards(electric)]); - - electric.notifier.subscribeToDataChanges((notification) => { - // @ts-expect-error to avoid error in test - if (typeof process !== "undefined" && !electric.adapter.db.open) return; - - notification.changes.forEach(async (change) => { - if (!Array.isArray(change.recordChanges)) return; - switch (change.qualifiedTablename.tablename) { - case "threads": - await reconcileThreads(electric); - break; - case "cards": - await reconcileCards(electric); - break; - } - }); - }); - }, - - addHook: async ( - tableName: "threads" | "cards", - fn: (electric: ElectricClient) => void, - ) => { - switch (tableName) { - case "threads": - threadHooks.push(fn); - break; - case "cards": - cardHooks.push(fn); - break; - } - }, -} as const; - -async function createLogTableAndTrigger(electric: ElectricClient) { - await electric.adapter.runInTransaction( - { - sql: sql` - CREATE TABLE IF NOT EXISTS changed_threads ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - thread_id TEXT, - deleted BOOLEAN - ); - `, - }, - { - sql: sql` - CREATE TABLE IF NOT EXISTS changed_cards ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - card_id TEXT, - deleted BOOLEAN - ); - `, - }, - { - sql: sql` - CREATE TRIGGER IF NOT EXISTS log_thread_change_after_insert - AFTER INSERT ON threads - BEGIN - INSERT - INTO changed_threads ( - thread_id, - deleted - ) - VALUES ( - NEW.id, - 0 - ); - END; - `, - }, - { - sql: sql` - CREATE TRIGGER IF NOT EXISTS log_thread_change_after_update - AFTER UPDATE ON threads - BEGIN - INSERT - INTO changed_threads ( - thread_id, - deleted - ) - VALUES ( - NEW.id, - 0 - ); - END; - `, - }, - { - sql: sql` - CREATE TRIGGER IF NOT EXISTS log_thread_change_after_delete - AFTER DELETE ON threads - BEGIN - INSERT - INTO changed_threads ( - thread_id, - deleted - ) - VALUES ( - OLD.id, - 1 - ); - END; - `, - }, - { - sql: sql` - CREATE TRIGGER IF NOT EXISTS log_card_change_after_insert - AFTER INSERT ON cards - BEGIN - INSERT - INTO changed_cards ( - card_id, - deleted - ) - VALUES ( - NEW.id, - 0 - ); - END; - `, - }, - { - sql: sql` - CREATE TRIGGER IF NOT EXISTS log_card_change_after_update - AFTER UPDATE ON cards - BEGIN - INSERT - INTO changed_cards ( - card_id, - deleted - ) - VALUES ( - NEW.id, - 0 - ); - END; - `, - }, - { - sql: sql` - CREATE TRIGGER IF NOT EXISTS log_card_change_after_delete - AFTER DELETE ON cards - BEGIN - INSERT - INTO changed_cards ( - card_id, - deleted - ) - VALUES ( - OLD.id, - 1 - ); - END; - `, - }, - ); -} - -async function reconcileThreads(electric: ElectricClient) { - const changed_threads = await electric.db.rawQuery({ - sql: sql`SELECT id, thread_id, deleted FROM changed_threads;`, - }); - if (!changed_threads.length) return; - - const deleted_ids = new Set( - changed_threads - .filter((i) => i["deleted"]) - .map((i) => i["thread_id"] as string), - ); - - const changed_ids = new Set( - changed_threads - .filter((i) => !i["deleted"]) - .map((i) => i["thread_id"] as string) - .filter((i) => !deleted_ids.has(i)), - ); - - // delete orphans - await electric.adapter.runInTransaction( - { - sql: sql` - CREATE TEMPORARY TABLE IF NOT EXISTS tmp_thread_tree (id TEXT); - `, - }, - { - sql: sql` - WITH RECURSIVE thread_tree AS ( - SELECT threads.id, threads.parent_id - FROM threads - WHERE id IN ( - SELECT id - FROM threads - WHERE - id IN (${Array.from(changed_ids) - .map(() => "?") - .join(", ")}) - AND parent_id IS NOT NULL - AND NOT EXISTS ( - SELECT 1 - FROM threads AS t2 - WHERE t2.id = threads.parent_id - ) - ) - UNION ALL - SELECT child.id, child.parent_id - FROM thread_tree AS parent - JOIN threads AS child ON parent.id = child.parent_id - ) - INSERT INTO tmp_thread_tree (id) - SELECT id FROM thread_tree; - `, - args: [...Array.from(changed_ids)], - }, - { - sql: sql` - DELETE - FROM threads - WHERE id IN (SELECT id FROM tmp_thread_tree); - `, - }, - { - sql: sql` - DELETE - FROM cards - WHERE thread_id IN (SELECT id FROM tmp_thread_tree); - `, - }, - { - sql: sql`DROP TABLE tmp_thread_tree;`, - }, - ); - - // update duplicated title - await electric.adapter.runInTransaction({ - sql: sql` - UPDATE threads - SET - title = title || '-' || id - WHERE - id IN (${Array.from(changed_ids) - .map(() => "?") - .join(", ")}) - AND EXISTS ( - SELECT 1 - FROM threads as t2 - WHERE - t2.id <> threads.id - AND (t2.parent_id IS NULL OR t2.parent_id = threads.parent_id) - AND t2.title = threads.title - ) - AND (title, created_at) NOT IN ( - SELECT title, MIN(created_at) - FROM threads - GROUP BY title - ); - `, - args: [...Array.from(changed_ids)], - }); - - for (const fn of threadHooks) { - fn(electric); - } - - // cleanup used rows from changed_threads table - await electric.adapter.run({ - sql: sql` - DELETE - FROM changed_threads - WHERE id - IN ( - ${changed_threads.map((i) => i["id"])} - ); - `, - }); -} - -async function reconcileCards(electric: ElectricClient) { - const changed_cards = await electric.db.rawQuery({ - sql: sql`SELECT id, card_id, deleted FROM changed_cards;`, - }); - if (!changed_cards.length) return; - - const deleted_ids = new Set( - changed_cards - .filter((i) => i["deleted"]) - .map((i) => i["card_id"] as string), - ); - - const changed_ids = new Set( - changed_cards - .filter((i) => !i["deleted"]) - .map((i) => i["card_id"] as string) - .filter((i) => !deleted_ids.has(i)), - ); - - // delete orphans - await electric.adapter.run({ - sql: sql` - DELETE - FROM cards - WHERE - id IN (${Array.from(changed_ids) - .map(() => "?") - .join(", ")}) - AND NOT EXISTS ( - SELECT 1 - FROM threads - WHERE threads.id = cards.thread_id - ); - `, - args: Array.from(changed_ids), - }); - - for (const fn of cardHooks) { - fn(electric); - } - - // cleanup used rows from changed_threads table - await electric.adapter.run({ - sql: sql` - DELETE - FROM changed_cards - WHERE id - IN ( - ${changed_cards.map((i) => i["id"])} - ); - `, - }); -} +// import type { ElectricClient } from "electric-sql/client/model"; +// import type { schema } from "../../generated/client"; +// import { sql } from "$lib/Utils/utils"; +// type Schema = typeof schema; +// +// const threadHooks: Array<(electric: ElectricClient) => void> = []; +// const cardHooks: Array<(electric: ElectricClient) => void> = []; +// +// export const TableReconciler = { +// init: async (electric: ElectricClient) => { +// await createLogTableAndTrigger(electric); +// await Promise.all([reconcileThreads(electric), reconcileCards(electric)]); +// +// electric.notifier.subscribeToDataChanges((notification) => { +// // @ts-expect-error to avoid error in test +// if (typeof process !== "undefined" && !electric.adapter.db.open) return; +// +// notification.changes.forEach(async (change) => { +// if (!Array.isArray(change.recordChanges)) return; +// switch (change.qualifiedTablename.tablename) { +// case "threads": +// await reconcileThreads(electric); +// break; +// case "cards": +// await reconcileCards(electric); +// break; +// } +// }); +// }); +// }, +// +// addHook: async ( +// tableName: "threads" | "cards", +// fn: (electric: ElectricClient) => void, +// ) => { +// switch (tableName) { +// case "threads": +// threadHooks.push(fn); +// break; +// case "cards": +// cardHooks.push(fn); +// break; +// } +// }, +// } as const; +// +// async function createLogTableAndTrigger(electric: ElectricClient) { +// await electric.adapter.runInTransaction( +// { +// sql: sql` +// CREATE TABLE IF NOT EXISTS changed_threads ( +// id INTEGER PRIMARY KEY AUTOINCREMENT, +// thread_id TEXT, +// deleted BOOLEAN +// ); +// `, +// }, +// { +// sql: sql` +// CREATE TABLE IF NOT EXISTS changed_cards ( +// id INTEGER PRIMARY KEY AUTOINCREMENT, +// card_id TEXT, +// deleted BOOLEAN +// ); +// `, +// }, +// { +// sql: sql` +// CREATE TRIGGER IF NOT EXISTS log_thread_change_after_insert +// AFTER INSERT ON threads +// BEGIN +// INSERT +// INTO changed_threads ( +// thread_id, +// deleted +// ) +// VALUES ( +// NEW.id, +// 0 +// ); +// END; +// `, +// }, +// { +// sql: sql` +// CREATE TRIGGER IF NOT EXISTS log_thread_change_after_update +// AFTER UPDATE ON threads +// BEGIN +// INSERT +// INTO changed_threads ( +// thread_id, +// deleted +// ) +// VALUES ( +// NEW.id, +// 0 +// ); +// END; +// `, +// }, +// { +// sql: sql` +// CREATE TRIGGER IF NOT EXISTS log_thread_change_after_delete +// AFTER DELETE ON threads +// BEGIN +// INSERT +// INTO changed_threads ( +// thread_id, +// deleted +// ) +// VALUES ( +// OLD.id, +// 1 +// ); +// END; +// `, +// }, +// { +// sql: sql` +// CREATE TRIGGER IF NOT EXISTS log_card_change_after_insert +// AFTER INSERT ON cards +// BEGIN +// INSERT +// INTO changed_cards ( +// card_id, +// deleted +// ) +// VALUES ( +// NEW.id, +// 0 +// ); +// END; +// `, +// }, +// { +// sql: sql` +// CREATE TRIGGER IF NOT EXISTS log_card_change_after_update +// AFTER UPDATE ON cards +// BEGIN +// INSERT +// INTO changed_cards ( +// card_id, +// deleted +// ) +// VALUES ( +// NEW.id, +// 0 +// ); +// END; +// `, +// }, +// { +// sql: sql` +// CREATE TRIGGER IF NOT EXISTS log_card_change_after_delete +// AFTER DELETE ON cards +// BEGIN +// INSERT +// INTO changed_cards ( +// card_id, +// deleted +// ) +// VALUES ( +// OLD.id, +// 1 +// ); +// END; +// `, +// }, +// ); +// } +// +// async function reconcileThreads(electric: ElectricClient) { +// const changed_threads = await electric.db.rawQuery({ +// sql: sql`SELECT id, thread_id, deleted FROM changed_threads;`, +// }); +// if (!changed_threads.length) return; +// +// const deleted_ids = new Set( +// changed_threads +// .filter((i) => i["deleted"]) +// .map((i) => i["thread_id"] as string), +// ); +// +// const changed_ids = new Set( +// changed_threads +// .filter((i) => !i["deleted"]) +// .map((i) => i["thread_id"] as string) +// .filter((i) => !deleted_ids.has(i)), +// ); +// +// // delete orphans +// await electric.adapter.runInTransaction( +// { +// sql: sql` +// CREATE TEMPORARY TABLE IF NOT EXISTS tmp_thread_tree (id TEXT); +// `, +// }, +// { +// sql: sql` +// WITH RECURSIVE thread_tree AS ( +// SELECT threads.id, threads.parent_id +// FROM threads +// WHERE id IN ( +// SELECT id +// FROM threads +// WHERE +// id IN (${Array.from(changed_ids) +// .map(() => "?") +// .join(", ")}) +// AND parent_id IS NOT NULL +// AND NOT EXISTS ( +// SELECT 1 +// FROM threads AS t2 +// WHERE t2.id = threads.parent_id +// ) +// ) +// UNION ALL +// SELECT child.id, child.parent_id +// FROM thread_tree AS parent +// JOIN threads AS child ON parent.id = child.parent_id +// ) +// INSERT INTO tmp_thread_tree (id) +// SELECT id FROM thread_tree; +// `, +// args: [...Array.from(changed_ids)], +// }, +// { +// sql: sql` +// DELETE +// FROM threads +// WHERE id IN (SELECT id FROM tmp_thread_tree); +// `, +// }, +// { +// sql: sql` +// DELETE +// FROM cards +// WHERE thread_id IN (SELECT id FROM tmp_thread_tree); +// `, +// }, +// { +// sql: sql`DROP TABLE tmp_thread_tree;`, +// }, +// ); +// +// // update duplicated title +// await electric.adapter.runInTransaction({ +// sql: sql` +// UPDATE threads +// SET +// title = title || '-' || id +// WHERE +// id IN (${Array.from(changed_ids) +// .map(() => "?") +// .join(", ")}) +// AND EXISTS ( +// SELECT 1 +// FROM threads as t2 +// WHERE +// t2.id <> threads.id +// AND (t2.parent_id IS NULL OR t2.parent_id = threads.parent_id) +// AND t2.title = threads.title +// ) +// AND (title, created_at) NOT IN ( +// SELECT title, MIN(created_at) +// FROM threads +// GROUP BY title +// ); +// `, +// args: [...Array.from(changed_ids)], +// }); +// +// for (const fn of threadHooks) { +// fn(electric); +// } +// +// // cleanup used rows from changed_threads table +// await electric.adapter.run({ +// sql: sql` +// DELETE +// FROM changed_threads +// WHERE id +// IN ( +// ${changed_threads.map((i) => i["id"])} +// ); +// `, +// }); +// } +// +// async function reconcileCards(electric: ElectricClient) { +// const changed_cards = await electric.db.rawQuery({ +// sql: sql`SELECT id, card_id, deleted FROM changed_cards;`, +// }); +// if (!changed_cards.length) return; +// +// const deleted_ids = new Set( +// changed_cards +// .filter((i) => i["deleted"]) +// .map((i) => i["card_id"] as string), +// ); +// +// const changed_ids = new Set( +// changed_cards +// .filter((i) => !i["deleted"]) +// .map((i) => i["card_id"] as string) +// .filter((i) => !deleted_ids.has(i)), +// ); +// +// // delete orphans +// await electric.adapter.run({ +// sql: sql` +// DELETE +// FROM cards +// WHERE +// id IN (${Array.from(changed_ids) +// .map(() => "?") +// .join(", ")}) +// AND NOT EXISTS ( +// SELECT 1 +// FROM threads +// WHERE threads.id = cards.thread_id +// ); +// `, +// args: Array.from(changed_ids), +// }); +// +// for (const fn of cardHooks) { +// fn(electric); +// } +// +// // cleanup used rows from changed_threads table +// await electric.adapter.run({ +// sql: sql` +// DELETE +// FROM changed_cards +// WHERE id +// IN ( +// ${changed_cards.map((i) => i["id"])} +// ); +// `, +// }); +// } diff --git a/src/lib/DataAccess/YDocMaterializer.test.ts b/src/lib/DataAccess/YDocMaterializer.test.ts index d926b49..ec79fcd 100644 --- a/src/lib/DataAccess/YDocMaterializer.test.ts +++ b/src/lib/DataAccess/YDocMaterializer.test.ts @@ -1,118 +1,123 @@ -import { expect, test } from "vitest"; -import { testElectric } from "./testElectric"; -import * as Y from "yjs"; -import { Card } from "$lib/Models/Card"; -import { Thread } from "$lib/Models/Thread"; -import { uuidv7 } from "uuidv7"; -import Database from "better-sqlite3"; -import { electrify } from "electric-sql/node"; -import { schema } from "../../generated/client"; -import { sql } from "$lib/Utils/utils"; - -testElectric("YDocMaterializer", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - const thread = await injectedCreateThread(); - const card = await injectedCreateCard({ thread_id: thread.id }); - - const ydoc = new Y.Doc(); - - ydoc.on("updateV2", (update) => { - electric.db.card_ydoc_updates.create({ - data: { - id: uuidv7(), - card_id: card.id, - data: update, - checkpoint: false, - created_at: new Date(), - }, - }); - }); - - const xml = ydoc.getXmlFragment("prosemirror"); - const element = new Y.XmlElement("div"); - element.insert(0, [new Y.XmlText("content")]); - xml.insert(0, [element]); - - const updates = await electric.db.card_ydoc_updates.findMany(); - expect(updates.length).toBeTruthy(); - - await new Promise((resolve) => setTimeout(resolve, 100)); - const updatedCard = await electric.db.cards.findUnique({ - where: { id: card.id }, - }); - expect(updatedCard.content).toBe("
content
"); -}); - -testElectric("mergeUpdates", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - const thread = await injectedCreateThread(); - const card = await injectedCreateCard({ thread_id: thread.id }); - - const ydoc = new Y.Doc(); - - ydoc.on("updateV2", (update) => { - electric.db.card_ydoc_updates.create({ - data: { - id: uuidv7(), - card_id: card.id, - data: update, - checkpoint: false, - created_at: new Date(), - }, - }); - }); - - const xml = ydoc.getXmlFragment("prosemirror"); - - for (let i = 0; i < 1000; i++) { - const element = new Y.XmlElement("div"); - element.insert(0, [new Y.XmlText("content")]); - xml.insert(0, [element]); - } - - // wait until mergeCardUpdates run - await new Promise((resolve) => setTimeout(resolve, 100)); - const updates = await electric.db.card_ydoc_updates.findMany(); - expect(updates.length).toBe(901); - - const updatedCard = await electric.db.cards.findUnique({ - where: { id: card.id }, - }); - expect(updatedCard.content).toBe(xml.toString()); -}); - -test("test", async () => { - const sqlite = new Database(":memory:"); - const electric = await electrify(sqlite, schema); - - electric.notifier.subscribeToDataChanges((notification) => { - console.log(notification.changes); - }); - - const stmt = sqlite.prepare( - sql`INSERT INTO users (id, name, created_at) VALUES (?, ?, ?);`, - ); - stmt.run([uuidv7(), "name", new Date().toString()]); - - await electric.db.users.create({ - data: { - id: uuidv7(), - name: "name", - created_at: new Date(), - }, - }); - await new Promise((resolve) => setTimeout(resolve, 25)); - await electric.db.users.create({ - data: { - id: uuidv7(), - name: "name", - created_at: new Date(), - }, - }); - - await new Promise((resolve) => setTimeout(resolve, 1000)); - - expect(true).toBeTruthy(); -}); +import { test, expect } from "vitest"; + +test.skip("YDocMaterializer", () => { + expect(true).toBeTruthy() +}) +// import { expect, test } from "vitest"; +// import { testElectric } from "./testElectric"; +// import * as Y from "yjs"; +// import { Card } from "$lib/Models/Card"; +// import { Thread } from "$lib/Models/Thread"; +// import { uuidv7 } from "uuidv7"; +// import Database from "better-sqlite3"; +// import { electrify } from "electric-sql/node"; +// import { schema } from "../../generated/client"; +// import { sql } from "$lib/Utils/utils"; +// +// testElectric("YDocMaterializer", async ({ electric }) => { +// const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); +// const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); +// const thread = await injectedCreateThread(); +// const card = await injectedCreateCard({ thread_id: thread.id }); +// +// const ydoc = new Y.Doc(); +// +// ydoc.on("updateV2", (update) => { +// electric.db.card_ydoc_updates.create({ +// data: { +// id: uuidv7(), +// card_id: card.id, +// data: update, +// checkpoint: false, +// created_at: new Date(), +// }, +// }); +// }); +// +// const xml = ydoc.getXmlFragment("prosemirror"); +// const element = new Y.XmlElement("div"); +// element.insert(0, [new Y.XmlText("content")]); +// xml.insert(0, [element]); +// +// const updates = await electric.db.card_ydoc_updates.findMany(); +// expect(updates.length).toBeTruthy(); +// +// await new Promise((resolve) => setTimeout(resolve, 100)); +// const updatedCard = await electric.db.cards.findUnique({ +// where: { id: card.id }, +// }); +// expect(updatedCard.content).toBe("
content
"); +// }); +// +// testElectric("mergeUpdates", async ({ electric }) => { +// const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); +// const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); +// const thread = await injectedCreateThread(); +// const card = await injectedCreateCard({ thread_id: thread.id }); +// +// const ydoc = new Y.Doc(); +// +// ydoc.on("updateV2", (update) => { +// electric.db.card_ydoc_updates.create({ +// data: { +// id: uuidv7(), +// card_id: card.id, +// data: update, +// checkpoint: false, +// created_at: new Date(), +// }, +// }); +// }); +// +// const xml = ydoc.getXmlFragment("prosemirror"); +// +// for (let i = 0; i < 1000; i++) { +// const element = new Y.XmlElement("div"); +// element.insert(0, [new Y.XmlText("content")]); +// xml.insert(0, [element]); +// } +// +// // wait until mergeCardUpdates run +// await new Promise((resolve) => setTimeout(resolve, 100)); +// const updates = await electric.db.card_ydoc_updates.findMany(); +// expect(updates.length).toBe(901); +// +// const updatedCard = await electric.db.cards.findUnique({ +// where: { id: card.id }, +// }); +// expect(updatedCard.content).toBe(xml.toString()); +// }); +// +// test("test", async () => { +// const sqlite = new Database(":memory:"); +// const electric = await electrify(sqlite, schema); +// +// electric.notifier.subscribeToDataChanges((notification) => { +// console.log(notification.changes); +// }); +// +// const stmt = sqlite.prepare( +// sql`INSERT INTO users (id, name, created_at) VALUES (?, ?, ?);`, +// ); +// stmt.run([uuidv7(), "name", new Date().toString()]); +// +// await electric.db.users.create({ +// data: { +// id: uuidv7(), +// name: "name", +// created_at: new Date(), +// }, +// }); +// await new Promise((resolve) => setTimeout(resolve, 25)); +// await electric.db.users.create({ +// data: { +// id: uuidv7(), +// name: "name", +// created_at: new Date(), +// }, +// }); +// +// await new Promise((resolve) => setTimeout(resolve, 1000)); +// +// expect(true).toBeTruthy(); +// }); diff --git a/src/lib/DataAccess/YDocMaterializer.ts b/src/lib/DataAccess/YDocMaterializer.ts index 8411e2e..d72b67f 100644 --- a/src/lib/DataAccess/YDocMaterializer.ts +++ b/src/lib/DataAccess/YDocMaterializer.ts @@ -1,195 +1,195 @@ -import type { ElectricClient } from "electric-sql/client/model"; -import type { schema } from "../../generated/client"; -import { sql } from "$lib/Utils/utils"; -import { murmurHash } from "ohash"; -import * as Y from "yjs"; - -type Options = { - maxUpdateLength: number; - mergeTargetLength: number; -}; - -export const YDocMatelializer = { - async init( - electric: ElectricClient, - options: Options = { - maxUpdateLength: 1000, - mergeTargetLength: 100, - }, - ) { - if (options.maxUpdateLength - options.mergeTargetLength <= 0) - throw new Error("mergeTargetLength must be less then maxUpdateLength"); - - electric.notifier.subscribeToDataChanges((notification) => { - // @ts-expect-error to avoid error in test - if (typeof process !== "undefined" && !electric.adapter.db.open) return; - if (notification.origin !== "local") return; - - notification.changes.forEach(async (change) => { - if (change.qualifiedTablename.tablename !== "card_ydoc_updates") return; - if (!change.recordChanges) return; - - const ydocUpdateIds = change.recordChanges.map( - (i) => i.primaryKey["id"], - ) as string[]; - - const cardIds = ( - await electric.db.rawQuery({ - sql: sql` - SELECT DISTINCT card_id - FROM card_ydoc_updates - WHERE id IN (${ydocUpdateIds.map(() => "?").join(", ")}); - `, - args: ydocUpdateIds, - }) - ).map((update) => update["card_id"]); - - const cards = (await electric.db.cards.findMany({ - select: { id: true, last_materialized_hash: true }, - where: { id: { in: cardIds } }, - })) as Array<{ id: string; last_materialized_hash: string }>; - - cards.forEach((c) => { - this.materializeCard( - c, - options.maxUpdateLength, - options.mergeTargetLength, - electric, - ); - }); - }); - }); - }, - - async materializeCard( - card: { id: string; last_materialized_hash: string }, - maxUpdateLength: number, - mergeTargetLength: number, - electric: ElectricClient, - ) { - const ydocUpdates = await electric.db.card_ydoc_updates.findMany({ - where: { card_id: card.id }, - }); - - if (ydocUpdates.length >= maxUpdateLength) - await this.mergeCardUpdates(card.id, mergeTargetLength, electric); - - const hash = murmurHash( - ydocUpdates - .map((i) => i["id"]) - .sort() - .join(":"), - ).toString(); - - if (card.last_materialized_hash === hash) return; - - const ydoc = new Y.Doc(); - - ydocUpdates.forEach((update) => { - Y.applyUpdateV2(ydoc, update["data"]); - }); - - const content = ydoc.getXmlFragment("prosemirror").toString(); - - await electric.db.cards.update({ - where: { id: card.id }, - data: { - content: content, - last_materialized_hash: hash, - updated_at: new Date(), - }, - }); - }, - - async mergeCardUpdates( - cardId: string, - mergeTargetLength: number, - electric: ElectricClient, - ) { - const checkpoints = await electric.db.card_ydoc_updates.findMany({ - where: { card_id: cardId, checkpoint: true }, - orderBy: { created_at: "asc" }, - }); - - let mergedUpdatesLengh: number = 0; - - for (const c of checkpoints) { - if (mergedUpdatesLengh >= mergeTargetLength) return; - - const mergeTargets = await electric.db.card_ydoc_updates.findMany({ - where: { - card_id: cardId, - checkpoint: false, - created_at: { lte: c["created_at"] }, - }, - take: mergeTargetLength - mergedUpdatesLengh, - orderBy: { created_at: "asc" }, - }); - if (!mergeTargets.length) return; - - const mergedUpdate = Y.mergeUpdatesV2([ - c["data"], - ...mergeTargets.map((i) => i["data"]), - ]); - - await electric.adapter.runInTransaction( - { - sql: sql` - DELETE - FROM card_ydoc_updates - WHERE id IN (${mergeTargets.map(() => "?").join(", ")}); - `, - args: mergeTargets.map((c) => c["id"]), - }, - { - sql: sql` - UPDATE card_ydoc_updates - SET data = ? - WHERE id = ?; - `, - args: [mergedUpdate, c["id"]], - }, - ); - - mergedUpdatesLengh = mergedUpdatesLengh + mergeTargets.length; - } - - if (mergedUpdatesLengh >= mergeTargetLength) return; - - const mergeTargets = (await electric.db.card_ydoc_updates.findMany({ - select: { - id: true, - data: true, - }, - where: { - card_id: cardId, - checkpoint: false, - }, - take: mergeTargetLength - mergedUpdatesLengh, - orderBy: { created_at: "asc" }, - })) as { id: string; data: Uint8Array }[]; - - const mergedUpdate = Y.mergeUpdatesV2(mergeTargets.map((i) => i["data"])); - const lastMergeTarget = mergeTargets.pop(); - if (!lastMergeTarget) return; - - await electric.adapter.runInTransaction( - { - sql: sql` - DELETE - FROM card_ydoc_updates - WHERE id IN (${mergeTargets.map(() => "?").join(", ")}); - `, - args: mergeTargets.map((c) => c["id"]), - }, - { - sql: sql` - UPDATE card_ydoc_updates - SET data = ? - WHERE id = ?; - `, - args: [mergedUpdate, lastMergeTarget.id], - }, - ); - }, -} as const; +// import type { ElectricClient } from "electric-sql/client/model"; +// import type { schema } from "../../generated/client"; +// import { sql } from "$lib/Utils/utils"; +// import { murmurHash } from "ohash"; +// import * as Y from "yjs"; +// +// type Options = { +// maxUpdateLength: number; +// mergeTargetLength: number; +// }; +// +// export const YDocMatelializer = { +// async init( +// electric: ElectricClient, +// options: Options = { +// maxUpdateLength: 1000, +// mergeTargetLength: 100, +// }, +// ) { +// if (options.maxUpdateLength - options.mergeTargetLength <= 0) +// throw new Error("mergeTargetLength must be less then maxUpdateLength"); +// +// electric.notifier.subscribeToDataChanges((notification) => { +// // @ts-expect-error to avoid error in test +// if (typeof process !== "undefined" && !electric.adapter.db.open) return; +// if (notification.origin !== "local") return; +// +// notification.changes.forEach(async (change) => { +// if (change.qualifiedTablename.tablename !== "card_ydoc_updates") return; +// if (!change.recordChanges) return; +// +// const ydocUpdateIds = change.recordChanges.map( +// (i) => i.primaryKey["id"], +// ) as string[]; +// +// const cardIds = ( +// await electric.db.rawQuery({ +// sql: sql` +// SELECT DISTINCT card_id +// FROM card_ydoc_updates +// WHERE id IN (${ydocUpdateIds.map(() => "?").join(", ")}); +// `, +// args: ydocUpdateIds, +// }) +// ).map((update) => update["card_id"]); +// +// const cards = (await electric.db.cards.findMany({ +// select: { id: true, last_materialized_hash: true }, +// where: { id: { in: cardIds } }, +// })) as Array<{ id: string; last_materialized_hash: string }>; +// +// cards.forEach((c) => { +// this.materializeCard( +// c, +// options.maxUpdateLength, +// options.mergeTargetLength, +// electric, +// ); +// }); +// }); +// }); +// }, +// +// async materializeCard( +// card: { id: string; last_materialized_hash: string }, +// maxUpdateLength: number, +// mergeTargetLength: number, +// electric: ElectricClient, +// ) { +// const ydocUpdates = await electric.db.card_ydoc_updates.findMany({ +// where: { card_id: card.id }, +// }); +// +// if (ydocUpdates.length >= maxUpdateLength) +// await this.mergeCardUpdates(card.id, mergeTargetLength, electric); +// +// const hash = murmurHash( +// ydocUpdates +// .map((i) => i["id"]) +// .sort() +// .join(":"), +// ).toString(); +// +// if (card.last_materialized_hash === hash) return; +// +// const ydoc = new Y.Doc(); +// +// ydocUpdates.forEach((update) => { +// Y.applyUpdateV2(ydoc, update["data"]); +// }); +// +// const content = ydoc.getXmlFragment("prosemirror").toString(); +// +// await electric.db.cards.update({ +// where: { id: card.id }, +// data: { +// content: content, +// last_materialized_hash: hash, +// updated_at: new Date(), +// }, +// }); +// }, +// +// async mergeCardUpdates( +// cardId: string, +// mergeTargetLength: number, +// electric: ElectricClient, +// ) { +// const checkpoints = await electric.db.card_ydoc_updates.findMany({ +// where: { card_id: cardId, checkpoint: true }, +// orderBy: { created_at: "asc" }, +// }); +// +// let mergedUpdatesLengh: number = 0; +// +// for (const c of checkpoints) { +// if (mergedUpdatesLengh >= mergeTargetLength) return; +// +// const mergeTargets = await electric.db.card_ydoc_updates.findMany({ +// where: { +// card_id: cardId, +// checkpoint: false, +// created_at: { lte: c["created_at"] }, +// }, +// take: mergeTargetLength - mergedUpdatesLengh, +// orderBy: { created_at: "asc" }, +// }); +// if (!mergeTargets.length) return; +// +// const mergedUpdate = Y.mergeUpdatesV2([ +// c["data"], +// ...mergeTargets.map((i) => i["data"]), +// ]); +// +// await electric.adapter.runInTransaction( +// { +// sql: sql` +// DELETE +// FROM card_ydoc_updates +// WHERE id IN (${mergeTargets.map(() => "?").join(", ")}); +// `, +// args: mergeTargets.map((c) => c["id"]), +// }, +// { +// sql: sql` +// UPDATE card_ydoc_updates +// SET data = ? +// WHERE id = ?; +// `, +// args: [mergedUpdate, c["id"]], +// }, +// ); +// +// mergedUpdatesLengh = mergedUpdatesLengh + mergeTargets.length; +// } +// +// if (mergedUpdatesLengh >= mergeTargetLength) return; +// +// const mergeTargets = (await electric.db.card_ydoc_updates.findMany({ +// select: { +// id: true, +// data: true, +// }, +// where: { +// card_id: cardId, +// checkpoint: false, +// }, +// take: mergeTargetLength - mergedUpdatesLengh, +// orderBy: { created_at: "asc" }, +// })) as { id: string; data: Uint8Array }[]; +// +// const mergedUpdate = Y.mergeUpdatesV2(mergeTargets.map((i) => i["data"])); +// const lastMergeTarget = mergeTargets.pop(); +// if (!lastMergeTarget) return; +// +// await electric.adapter.runInTransaction( +// { +// sql: sql` +// DELETE +// FROM card_ydoc_updates +// WHERE id IN (${mergeTargets.map(() => "?").join(", ")}); +// `, +// args: mergeTargets.map((c) => c["id"]), +// }, +// { +// sql: sql` +// UPDATE card_ydoc_updates +// SET data = ? +// WHERE id = ?; +// `, +// args: [mergedUpdate, lastMergeTarget.id], +// }, +// ); +// }, +// } as const; diff --git a/src/lib/DataAccess/electric.ts b/src/lib/DataAccess/electric.ts deleted file mode 100644 index fa5f8b8..0000000 --- a/src/lib/DataAccess/electric.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { electrify } from "electric-sql/tauri"; -import { ElectricClient } from "electric-sql/client/model"; -import { schema } from "../../generated/client"; -import type { ElectricConfig, ElectrifyOptions } from "electric-sql"; -import Database from "@tauri-apps/plugin-sql"; -import { TableReconciler } from "./TableReconciler"; -import { YDocMatelializer } from "./YDocMaterializer"; - -type Schema = typeof schema; - -type ElectrifyFunction = ( - db: T, - schema: Schema, - config: ElectricConfig, - options?: ElectrifyOptions, -) => Promise>; - -const config = { - url: "http://localhost:5133", - debug: false, -}; - -export let ELECTRIC: undefined | ElectricClient; - -export async function init() { - const sqlite = await Database.load("sqlite:electric.db"); - const db = Object.assign(sqlite, { name: "electric.db" }); - ELECTRIC = await createElectric(electrify, db, schema, config); -} - -// wrap electrify function to mock electric client -export const createElectric = async ( - electrify: ElectrifyFunction, - db: T, - schema: Schema, - config: ElectricConfig, -): Promise> => { - const electric = await electrify(db, schema, config); - await TableReconciler.init(electric); - await YDocMatelializer.init(electric); - return electric; -}; diff --git a/src/lib/DataAccess/testElectric.ts b/src/lib/DataAccess/testElectric.ts deleted file mode 100644 index d636369..0000000 --- a/src/lib/DataAccess/testElectric.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { test, onTestFinished } from "vitest"; -import Database from "better-sqlite3"; -import type { Database as SQLite } from "better-sqlite3"; -import type { ElectricClient } from "electric-sql/client/model"; -import { electrify } from "electric-sql/node"; -import { schema } from "../../generated/client"; -import { createElectric } from "$lib/DataAccess/electric"; -import { sql } from "$lib/Utils/utils"; -import * as fs from "node:fs"; - -const token = - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"; - -const config = { - url: "http://localhost:5134", - debug: false, -}; - -export interface TestElectric { - electric: ElectricClient; -} - -export const testElectric = test.extend({ - electric: async ({}, use) => { - const sqlite = initSQLite(":memory:"); - const electric = await createElectric(electrify, sqlite, schema, config); - onTestFinished(async () => { - await electric.close(); - sqlite.close(); - }); - await use(electric); - }, -}); - -export interface TestElectricSync { - e1: ElectricClient; - e2: ElectricClient; - token: string; -} - -export const testElectricSync = test.extend({ - e1: async ({}, use) => { - const dbName = "e1"; - removeFile(dbName); - const sqlite = initSQLite(dbName + ".db"); - const e1 = await createElectric(electrify, sqlite, schema, config); - await cleanup(e1, sqlite, dbName); - await use(e1); - }, - - e2: async ({}, use) => { - const dbName = "e2"; - removeFile(dbName); - const sqlite = initSQLite(dbName + ".db"); - const e2 = await createElectric(electrify, sqlite, schema, config); - await cleanup(e2, sqlite, dbName); - await use(e2); - }, - - token: token, -}); - -function initSQLite(path: string): SQLite { - const sqlite = new Database(path); - sqlite.pragma("journal_mode = WAL"); - return sqlite; -} - -async function cleanup( - e: ElectricClient, - sqlite: SQLite, - path: string, -) { - await e.connect(token); - const cards = await e.db["cards"].sync(); - const threads = await e.db["threads"].sync(); - await threads.synced; - await cards.synced; - await e.db["users"].deleteMany(); - await e.db["pots"].deleteMany(); - await e.db["threads"].deleteMany(); - await e.db["thread_checkpoints"].deleteMany(); - await e.db["cards"].deleteMany(); - await e.db["card_ydoc_updates"].deleteMany(); - await e.db["card_checkpoints"].deleteMany(); - await e.db["thread_card_checkpoints"].deleteMany(); - await e.adapter.run({ sql: sql`DELETE FROM changed_threads;` }); - await e.adapter.run({ sql: sql`DELETE FROM changed_cards;` }); - - // wait until all delete operations sent to the electric-sync-service - await new Promise((resolve) => setTimeout(resolve, 1000)); - - onTestFinished(async () => { - await cleanup(e, sqlite, path); - await e.close(); - sqlite.close(); - removeFile(path); - }); -} - -function removeFile(dbName: string) { - fs.access(dbName + ".db", fs.constants.F_OK, (err) => { - if (!err) { - fs.unlinkSync(dbName + ".db"); - } - }); - fs.access(dbName + ".db-shm", fs.constants.F_OK, (err) => { - if (!err) { - fs.unlinkSync(dbName + ".db-shm"); - } - }); - fs.access(dbName + ".db-wal", fs.constants.F_OK, (err) => { - if (!err) { - fs.unlinkSync(dbName + ".db-wal"); - } - }); -} diff --git a/src/lib/Models/Card.test.ts b/src/lib/Models/Card.test.ts deleted file mode 100644 index 8bb2125..0000000 --- a/src/lib/Models/Card.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { describe, expect } from "vitest"; -import { Card } from "$lib/Models/Card"; -import { testElectric } from "$lib/DataAccess/testElectric"; -import { Thread } from "./Thread"; -import { uuidv7 } from "uuidv7"; - -describe("card", () => { - testElectric("create card", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - const thread = await injectedCreateThread(); - await injectedCreateCard({ thread_id: thread.id }); - expect((await electric.db.cards.findMany()).length).toBe(1); - }); - - testElectric("update card", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - const injectedUpdateCard = Card.update.inject({ ELECTRIC: electric }); - - const thread = await injectedCreateThread(); - const card = await injectedCreateCard({ thread_id: thread.id }); - await injectedUpdateCard({ ...card, content: "updated" }); - expect( - (await electric.db.cards.findUnique({ where: { id: card.id } }))?.[ - "content" - ], - ).toBe("updated"); - }); - - testElectric("delete logical", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - const injectedDeleteCardLogical = Card.deleteLogical.inject({ - ELECTRIC: electric, - }); - const thread = await injectedCreateThread(); - const card = await injectedCreateCard({ thread_id: thread.id }); - await injectedDeleteCardLogical(card.id); - const deleted = await electric.db.cards.findUnique({ - where: { id: card.id }, - }); - expect(deleted.deleted).toBeTruthy(); - }); - - testElectric("delete physical", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - const injectedDeleteCardPhysical = Card.deletePhysical.inject({ - ELECTRIC: electric, - }); - const thread = await injectedCreateThread(); - const card = await injectedCreateCard({ thread_id: thread.id }); - await injectedDeleteCardPhysical(card.id); - const deleted = await electric.db.cards.findUnique({ - where: { id: card.id }, - }); - expect(deleted).toBeFalsy(); - }); - - testElectric("fails if the thread doesn't exists", async ({ electric }) => { - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - expect(injectedCreateCard({ thread_id: uuidv7() })).rejects.toThrow(); - }); -}); diff --git a/src/lib/Models/Card.ts b/src/lib/Models/Card.ts deleted file mode 100644 index e4526af..0000000 --- a/src/lib/Models/Card.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { ELECTRIC } from "$lib/DataAccess/electric"; -import { uuidv7 } from "uuidv7"; -import type { Cards } from "../../generated/client"; -import type { Optional } from "utility-types"; -import type { ThreadTree } from "./ThreadTree.svelte"; -import { depend } from "velona"; - -export type Card = Optional< - Cards, - "deleted" | "created_at" | "updated_at" | "thread_id" -> & { - thread?: ThreadTree; -}; - -type CardInput = Omit< - Optional, - | "thread_id" - | "created_at" - | "updated_at" - | "deleted" - | "ydoc_id" - | "author" - | "pot_id" - | "last_materialized_hash" -> & { thread_id: string }; - -export const Card = { - create: depend( - { ELECTRIC }, - async ({ ELECTRIC }, card: CardInput): Promise => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - - const thread = await ELECTRIC.db.threads.findUnique({ - where: { id: card.thread_id }, - }); - if (!thread) throw new Error("thread doesn't exist"); - - const now = new Date(); - return (await ELECTRIC.db.cards.create({ - data: { - ...card, - id: card?.id || uuidv7(), - thread_id: card.thread_id, - fractional_index: card?.fractional_index || "a0", - content: card.content || "", - last_materialized_hash: "", - created_at: now, - updated_at: now, - deleted: false, - }, - })) as Card; - }, - ), - - update: depend( - { ELECTRIC }, - async ( - { ELECTRIC }, - card: Omit, - ): Promise => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - return (await ELECTRIC.db.cards.update({ - where: { id: card.id }, - data: { - updated_at: new Date(), - ...card, - }, - })) as Card; - }, - ), - - deleteLogical: depend({ ELECTRIC }, async ({ ELECTRIC }, id: string) => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - return await ELECTRIC.db.cards.update({ - where: { id: id }, - data: { deleted: true }, - }); - }), - - deletePhysical: depend({ ELECTRIC }, async ({ ELECTRIC }, id: string) => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - return await ELECTRIC.db.cards.delete({ - where: { id: id }, - }); - }), -} as const; diff --git a/src/lib/Models/CardYDoc.test.ts b/src/lib/Models/CardYDoc.test.ts index f1910d4..52bb002 100644 --- a/src/lib/Models/CardYDoc.test.ts +++ b/src/lib/Models/CardYDoc.test.ts @@ -1,73 +1,77 @@ -import { expect } from "vitest"; -import { testElectric } from "$lib/DataAccess/testElectric"; -import { Thread } from "./Thread"; -import { Card } from "./Card"; -import { YDocMatelializer } from "$lib/DataAccess/YDocMaterializer"; -import { CardYDoc } from "./CardYDoc"; -import * as Y from "yjs"; +import { test, expect } from "vitest"; -testElectric("CardYDoc", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - const injectedGetCardYDoc = CardYDoc.init.inject({ - ELECTRIC: electric, - }); - - const thread = await injectedCreateThread(); - const card = await injectedCreateCard({ thread_id: thread.id }); - const { xml } = await injectedGetCardYDoc(card.id); - - xml.insert(0, [new Y.XmlElement("div")]); - - await new Promise((resolve) => setTimeout(resolve, 1000)); - const materialized = await electric.db.cards.findUnique({ - where: { id: card.id }, - }); - - expect(materialized.content).toBe(xml.toString()); -}); - -testElectric("checkpoint", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); - const injectedGetCardYDoc = CardYDoc.init.inject({ - ELECTRIC: electric, - }); - - const thread = await injectedCreateThread(); - const card = await injectedCreateCard({ thread_id: thread.id }); - - { - const { xml, checkpoint } = await injectedGetCardYDoc(card.id); - xml.insert(0, [new Y.XmlElement("div")]); - xml.insert(0, [new Y.XmlElement("div")]); - await checkpoint(card.id); - xml.insert(0, [new Y.XmlElement("div")]); - xml.insert(0, [new Y.XmlElement("div")]); - await checkpoint(card.id); - } - - { - const updates = await electric.db.card_ydoc_updates.findMany(); - expect(updates.length).toBe(2); - } - - { - const checkpoints = await electric.db.card_ydoc_updates.findMany({ - where: { checkpoint: true }, - orderBy: { created_at: "desc" }, - }); - expect(checkpoints.length).toBe(2); - } - - // merge card updates - { - await YDocMatelializer.mergeCardUpdates(card.id, 1000, electric); - const updates = await electric.db.card_ydoc_updates.findMany(); - expect(updates.length).toBe(2); - - const { xml } = await injectedGetCardYDoc(card.id); - - expect(xml.toString()).toBe("
"); - } -}); +test.skip("CardYDoc", () => { + expect(true).toBeTruthy() +}) +// import { testElectric } from "$lib/DataAccess/testElectric"; +// import { Thread } from "./Thread"; +// import { Card } from "./Card"; +// import { YDocMatelializer } from "$lib/DataAccess/YDocMaterializer"; +// import { CardYDoc } from "./CardYDoc"; +// import * as Y from "yjs"; +// +// testElectric("CardYDoc", async ({ electric }) => { +// const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); +// const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); +// const injectedGetCardYDoc = CardYDoc.init.inject({ +// ELECTRIC: electric, +// }); +// +// const thread = await injectedCreateThread(); +// const card = await injectedCreateCard({ thread_id: thread.id }); +// const { xml } = await injectedGetCardYDoc(card.id); +// +// xml.insert(0, [new Y.XmlElement("div")]); +// +// await new Promise((resolve) => setTimeout(resolve, 1000)); +// const materialized = await electric.db.cards.findUnique({ +// where: { id: card.id }, +// }); +// +// expect(materialized.content).toBe(xml.toString()); +// }); +// +// testElectric("checkpoint", async ({ electric }) => { +// const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); +// const injectedCreateCard = Card.create.inject({ ELECTRIC: electric }); +// const injectedGetCardYDoc = CardYDoc.init.inject({ +// ELECTRIC: electric, +// }); +// +// const thread = await injectedCreateThread(); +// const card = await injectedCreateCard({ thread_id: thread.id }); +// +// { +// const { xml, checkpoint } = await injectedGetCardYDoc(card.id); +// xml.insert(0, [new Y.XmlElement("div")]); +// xml.insert(0, [new Y.XmlElement("div")]); +// await checkpoint(card.id); +// xml.insert(0, [new Y.XmlElement("div")]); +// xml.insert(0, [new Y.XmlElement("div")]); +// await checkpoint(card.id); +// } +// +// { +// const updates = await electric.db.card_ydoc_updates.findMany(); +// expect(updates.length).toBe(2); +// } +// +// { +// const checkpoints = await electric.db.card_ydoc_updates.findMany({ +// where: { checkpoint: true }, +// orderBy: { created_at: "desc" }, +// }); +// expect(checkpoints.length).toBe(2); +// } +// +// // merge card updates +// { +// await YDocMatelializer.mergeCardUpdates(card.id, 1000, electric); +// const updates = await electric.db.card_ydoc_updates.findMany(); +// expect(updates.length).toBe(2); +// +// const { xml } = await injectedGetCardYDoc(card.id); +// +// expect(xml.toString()).toBe("
"); +// } +// }); diff --git a/src/lib/Models/CardYDoc.ts b/src/lib/Models/CardYDoc.ts index 14aabfc..9575a64 100644 --- a/src/lib/Models/CardYDoc.ts +++ b/src/lib/Models/CardYDoc.ts @@ -1,144 +1,144 @@ -import * as Y from "yjs"; -import { depend } from "velona"; -import { ELECTRIC } from "$lib/DataAccess/electric"; -import { uuidv7 } from "uuidv7"; -import { sql } from "$lib/Utils/utils"; - -export type CardYDoc = { - id: string; - xml: Y.XmlFragment; - undoManager: Y.UndoManager; - checkpoint: (cardId: string) => Promise; - storePendingUpdates: () => Promise; -}; - -type options = { - storeTimeout: number; -}; - -export const CardYDoc = { - init: depend( - { ELECTRIC }, - async ( - { ELECTRIC }, - cardId: string, - options: options = { storeTimeout: 1000 }, - ): Promise => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - const ydoc = new Y.Doc(); - const xml = ydoc.getXmlFragment("prosemirror"); - const undoManager = new Y.UndoManager(xml); - - const initialUpdates = ( - await ELECTRIC.db.card_ydoc_updates.findMany({ - select: { data: true }, - where: { card_id: cardId }, - }) - ).map((c) => c["data"]); - - for (const update of initialUpdates) { - Y.applyUpdateV2(ydoc, update); - } - - let pendingUpdates: Uint8Array[] = []; - let timeoutId: null | ReturnType = null; - - ydoc.on("updateV2", (update) => { - pendingUpdates.push(update); - if (timeoutId) return; - timeoutId = setTimeout(() => { - storePendingUpdates(); - }, options.storeTimeout); - }); - - async function storePendingUpdates() { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - if (timeoutId) { - clearTimeout(timeoutId); - timeoutId = null; - } - - const update = Y.mergeUpdatesV2(pendingUpdates); - pendingUpdates = []; - - await ELECTRIC.db.card_ydoc_updates.create({ - data: { - id: uuidv7(), - card_id: cardId, - data: update, - checkpoint: false, - created_at: new Date(), - }, - }); - } - - async function checkpoint(cardId: string) { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - - const content = xml.toString(); - await storePendingUpdates(); - await ELECTRIC.adapter.runInTransaction( - { - sql: sql` - CREATE TEMPORARY TABLE IF NOT EXISTS latest_ydoc_update (id) - `, - }, - { - sql: sql` - INSERT INTO latest_ydoc_update (id) - SELECT id - FROM card_ydoc_updates - WHERE card_id = ? - ORDER BY created_at DESC - LIMIT 1; - `, - args: [cardId], - }, - { - sql: sql` - UPDATE card_ydoc_updates - SET checkpoint = 1 - WHERE id = ( - SELECT id - FROM latest_ydoc_update - ); - `, - }, - { - sql: sql` - INSERT - INTO card_checkpoints (id, card_id, ydoc_id, fractional_index, content) - VALUES ( - ?, ?, - ( - SELECT id - FROM latest_ydoc_update - ), - ( - SELECT fractional_index - FROM cards - WHERE id = ? - ), - ? - ); - `, - args: [uuidv7(), cardId, cardId, content], - }, - { - sql: sql` - DROP TABLE latest_ydoc_update; - `, - }, - ); - } - - return { - id: cardId, - xml, - undoManager, - checkpoint, - storePendingUpdates, - } as const; - }, - ), -}; +// import * as Y from "yjs"; +// import { depend } from "velona"; +// import { ELECTRIC } from "$lib/DataAccess/electric"; +// import { uuidv7 } from "uuidv7"; +// import { sql } from "$lib/Utils/utils"; +// +// export type CardYDoc = { +// id: string; +// xml: Y.XmlFragment; +// undoManager: Y.UndoManager; +// checkpoint: (cardId: string) => Promise; +// storePendingUpdates: () => Promise; +// }; +// +// type options = { +// storeTimeout: number; +// }; +// +// export const CardYDoc = { +// init: depend( +// { ELECTRIC }, +// async ( +// { ELECTRIC }, +// cardId: string, +// options: options = { storeTimeout: 1000 }, +// ): Promise => { +// if (!ELECTRIC) throw new Error("electric has not initialized yet"); +// const ydoc = new Y.Doc(); +// const xml = ydoc.getXmlFragment("prosemirror"); +// const undoManager = new Y.UndoManager(xml); +// +// const initialUpdates = ( +// await ELECTRIC.db.card_ydoc_updates.findMany({ +// select: { data: true }, +// where: { card_id: cardId }, +// }) +// ).map((c) => c["data"]); +// +// for (const update of initialUpdates) { +// Y.applyUpdateV2(ydoc, update); +// } +// +// let pendingUpdates: Uint8Array[] = []; +// let timeoutId: null | ReturnType = null; +// +// ydoc.on("updateV2", (update) => { +// pendingUpdates.push(update); +// if (timeoutId) return; +// timeoutId = setTimeout(() => { +// storePendingUpdates(); +// }, options.storeTimeout); +// }); +// +// async function storePendingUpdates() { +// if (!ELECTRIC) throw new Error("electric has not initialized yet"); +// if (timeoutId) { +// clearTimeout(timeoutId); +// timeoutId = null; +// } +// +// const update = Y.mergeUpdatesV2(pendingUpdates); +// pendingUpdates = []; +// +// await ELECTRIC.db.card_ydoc_updates.create({ +// data: { +// id: uuidv7(), +// card_id: cardId, +// data: update, +// checkpoint: false, +// created_at: new Date(), +// }, +// }); +// } +// +// async function checkpoint(cardId: string) { +// if (!ELECTRIC) throw new Error("electric has not initialized yet"); +// +// const content = xml.toString(); +// await storePendingUpdates(); +// await ELECTRIC.adapter.runInTransaction( +// { +// sql: sql` +// CREATE TEMPORARY TABLE IF NOT EXISTS latest_ydoc_update (id) +// `, +// }, +// { +// sql: sql` +// INSERT INTO latest_ydoc_update (id) +// SELECT id +// FROM card_ydoc_updates +// WHERE card_id = ? +// ORDER BY created_at DESC +// LIMIT 1; +// `, +// args: [cardId], +// }, +// { +// sql: sql` +// UPDATE card_ydoc_updates +// SET checkpoint = 1 +// WHERE id = ( +// SELECT id +// FROM latest_ydoc_update +// ); +// `, +// }, +// { +// sql: sql` +// INSERT +// INTO card_checkpoints (id, card_id, ydoc_id, fractional_index, content) +// VALUES ( +// ?, ?, +// ( +// SELECT id +// FROM latest_ydoc_update +// ), +// ( +// SELECT fractional_index +// FROM cards +// WHERE id = ? +// ), +// ? +// ); +// `, +// args: [uuidv7(), cardId, cardId, content], +// }, +// { +// sql: sql` +// DROP TABLE latest_ydoc_update; +// `, +// }, +// ); +// } +// +// return { +// id: cardId, +// xml, +// undoManager, +// checkpoint, +// storePendingUpdates, +// } as const; +// }, +// ), +// }; diff --git a/src/lib/Models/Outline.test.ts b/src/lib/Models/Outline.test.ts new file mode 100644 index 0000000..adbaf14 --- /dev/null +++ b/src/lib/Models/Outline.test.ts @@ -0,0 +1,64 @@ +import { uuidv7 } from "uuidv7"; +import { test, expect } from "vitest"; +import { Outline, type RawOutline } from "./Outline"; + +test("construction", () => { + const data = dummyData(); + console.log(data.length); + + for (let i = 0; i < 10; i++) { + const d = dummyData(); + console.time("constructOutline"); + Outline.treeFromArray(d); + console.timeEnd("constructOutline"); + } + + const [outline] = Outline.treeFromArray(data); + + expect( + // @ts-expect-error tree structuring test + outline.children[0].children[0].children[0].children[0].children[0] + .children[0].parent.parent.parent.parent.parent.parent, + ).toBe(outline); +}); + +function dummyData(): RawOutline[] { + const root: RawOutline = { + id: uuidv7(), + parent: null, + text: "root", + }; + + const result = createChildren(root.id); + + return [root, ...result]; + + function createChildren( + parent: string, + maxDepth: number = 9, + maxChildren: number = 3, + currentDepth: number = 0, + ): RawOutline[] { + if (maxDepth <= currentDepth) return []; + + const children: RawOutline[] = []; + for (let i = 0; i < maxChildren; i++) { + children.push({ + id: uuidv7(), + parent: parent, + text: "text here text here text here text here", + }); + } + + const grandChildren: RawOutline[] = []; + children.forEach((c) => { + createChildren(c.id, maxDepth, maxChildren, currentDepth + 1).forEach( + (gc) => { + grandChildren.push(gc); + }, + ); + }); + + return [...children, ...grandChildren]; + } +} diff --git a/src/lib/Models/Outline.ts b/src/lib/Models/Outline.ts new file mode 100644 index 0000000..7740936 --- /dev/null +++ b/src/lib/Models/Outline.ts @@ -0,0 +1,64 @@ +export type RawOutline = { + id: string; + parent: string | null; + text: string; +}; + +export class Outline { + private readonly underlying: RawOutline; + private parentRef: WeakRef | undefined; + children: Outline[] = []; + + constructor(underlying: RawOutline, parent?: Outline) { + this.underlying = underlying; + this.parentRef = parent ? new WeakRef(parent) : undefined; + } + + get id(): string { + return this.underlying.id; + } + + get text(): string { + return this.underlying.text; + } + + set text(text: string) { + this.underlying.text = text; + } + + get parent(): Outline | undefined { + return this.parentRef ? this.parentRef.deref() : undefined; + } + + set parent(parent: Outline) { + this.parentRef = new WeakRef(parent); + } + + static treeFromArray(data: RawOutline[]): Outline[] { + const roots: RawOutline[] = []; + for (const e of data) { + if (!e.parent) roots.push(e); + } + + const map = new Map(); + + for (const e of data) { + map.set(e.id, []); + } + + for (const e of data) { + if (!e.parent) continue; + map.get(e.parent)?.push(e); + } + + return roots.map((e) => createTree(e)); + + function createTree(root: RawOutline, parent_ref?: Outline): Outline { + const parent = new Outline(root, parent_ref); + const children = map.get(root.id)?.map((c) => createTree(c, parent)); + if (children) parent.children = children; + + return parent; + } + } +} diff --git a/src/lib/Models/Thread.test.ts b/src/lib/Models/Thread.test.ts deleted file mode 100644 index 90f9b72..0000000 --- a/src/lib/Models/Thread.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { describe, expect } from "vitest"; -import { Thread } from "$lib/Models/Thread"; -import { testElectric, testElectricSync } from "$lib/DataAccess/testElectric"; -import { uuidv7 } from "uuidv7"; - -describe("Thread", () => { - testElectric("create thread", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - await injectedCreateThread(); - expect((await electric.db.threads.findMany()).length).toBe(1); - }); - - testElectric("update thread", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedUpdateThread = Thread.update.inject({ ELECTRIC: electric }); - const thread = await injectedCreateThread(); - await injectedUpdateThread({ ...thread, title: "updated" }); - expect( - (await electric.db.threads.findUnique({ where: { id: thread.id } }))?.[ - "title" - ], - ).toBe("updated"); - }); - - testElectric("thread title must be unique", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedUpdateThread = Thread.update.inject({ ELECTRIC: electric }); - - await injectedCreateThread({ title: "title" }); - expect(injectedCreateThread({ title: "title" })).rejects.toThrow(); - - const thread = await injectedCreateThread({ title: "title2" }); - expect( - injectedUpdateThread({ id: thread.id, title: "title" }), - ).rejects.toThrow(); - - expect( - injectedUpdateThread({ id: thread.id, title: "title2" }), - ).resolves.toBeTruthy(); - }); - - testElectricSync( - "keep thread title unique when synced using trigger", - async ({ e1, e2, token }) => { - // console.log(e1); - const createThread1 = Thread.create.inject({ ELECTRIC: e1 }); - const createThread2 = Thread.create.inject({ ELECTRIC: e2 }); - - await createThread1({ title: "title" }); - await createThread2({ title: "title" }); - - await e1.connect(token); - const s1 = await e1.db.threads.sync(); - await s1.synced; - await e2.connect(token); - const s2 = await e2.db.threads.sync(); - await s2.synced; - await new Promise((resolve) => setTimeout(resolve, 1000)); - - const res = await e1.db.threads.findMany({ where: { title: "title" } }); - expect(res.length).toBe(1); - }, - 100000, - ); - - testElectric("check parent existence", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const res = injectedCreateThread({ - parent_id: uuidv7(), - }); - - expect(res).rejects.toThrow(); - }); - - testElectric("deletePhysical should cascade down", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedDeleteThread = Thread.deletePhysical.inject({ - ELECTRIC: electric, - }); - - const thread = await injectedCreateThread(); - const child = await injectedCreateThread({ parent_id: thread.id }); - await injectedCreateThread({ parent_id: child.id }); - - const res = await electric.db.threads.findMany(); - expect(res.length).toBe(3); - - await injectedDeleteThread(thread.id); - await new Promise((resolve) => setTimeout(resolve, 0)); - - const res2 = await electric.db.threads.findMany(); - expect(res2.length).toBe(0); - }); - - testElectric("delete logical", async ({ electric }) => { - const injectedCreateThread = Thread.create.inject({ ELECTRIC: electric }); - const injectedDeleteThreadLogical = Thread.deleteLogical.inject({ - ELECTRIC: electric, - }); - const thread = await injectedCreateThread(); - await injectedDeleteThreadLogical(thread.id); - const deleted = await electric.db.threads.findUnique({ - where: { id: thread.id }, - }); - expect(deleted.deleted).toBeTruthy(); - }); -}); diff --git a/src/lib/Models/Thread.ts b/src/lib/Models/Thread.ts deleted file mode 100644 index 9471fd9..0000000 --- a/src/lib/Models/Thread.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { ELECTRIC } from "$lib/DataAccess/electric"; -import { uuidv7 } from "uuidv7"; -import type { Threads } from "../../generated/client"; -import { depend } from "velona"; -import type { Optional } from "utility-types"; -import { sql } from "$lib/Utils/utils"; - -export type Thread = Optional< - Threads, - "deleted" | "created_at" | "updated_at" | "parent_id" | "fractional_index" ->; - -export const Thread = { - create: depend( - { ELECTRIC }, - async ({ ELECTRIC }, thread?: Partial): Promise => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - - if (thread?.parent_id) { - const res = await ELECTRIC.db.rawQuery({ - sql: sql` - SELECT 1 FROM threads - WHERE id = ? - LIMIT 1; - `, - args: [thread.parent_id], - }); - if (!res.length) throw new Error("parent not found!"); - } - - if (thread?.title) { - const res = await ELECTRIC.db.rawQuery({ - sql: sql` - SELECT 1 FROM threads - WHERE title = ? AND (parent_id = ? OR parent_id IS NULL) - LIMIT 1; - `, - args: [thread.title, thread.parent_id || null], - }); - if (res.length) throw new Error("thread title must be unique"); - } - - const now = new Date(); - return (await ELECTRIC.db.threads.create({ - data: { - ...thread, - id: thread?.id || uuidv7(), - parent_id: thread?.parent_id || null, - fractional_index: thread?.fractional_index || "a0", - title: thread?.title || "", - created_at: now, - updated_at: now, - deleted: false, - }, - })) as Thread; - }, - ), - - update: depend( - { ELECTRIC }, - async ( - { ELECTRIC }, - thread: Omit< - Thread, - "created_at" | "updated_at" | "deleted" | "pot_id" | "author" - >, - ): Promise => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - - if (thread?.title) { - const res = await ELECTRIC.db.rawQuery({ - sql: sql` - SELECT 1 FROM threads - WHERE title = ? AND id <> ? AND (parent_id = ? OR parent_id IS NULL) - LIMIT 1; - `, - args: [thread.title, thread.id, thread.parent_id || null], - }); - if (res.length) throw new Error("thread title must be unique"); - } - - return (await ELECTRIC.db.threads.update({ - where: { id: thread.id }, - data: { - ...thread, - updated_at: new Date(), - }, - })) as Thread; - }, - ), - - deleteLogical: depend({ ELECTRIC }, async ({ ELECTRIC }, id: string) => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - return ELECTRIC.db.threads.update({ - where: { id: id }, - data: { deleted: true }, - }); - }), - - deletePhysical: depend({ ELECTRIC }, async ({ ELECTRIC }, id: string) => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - return ELECTRIC.adapter.runInTransaction( - { - sql: sql` - CREATE TEMPORARY TABLE IF NOT EXISTS temp_thread_tree (id string); - `, - }, - { - sql: sql` - WITH RECURSIVE thread_tree AS ( - SELECT threads.id, threads.parent_id - FROM threads - WHERE id = ? - UNION ALL - SELECT child.id, child.parent_id - FROM thread_tree AS parent - JOIN threads AS child ON parent.id = child.parent_id - ) - INSERT INTO temp_thread_tree (id) - SELECT id FROM thread_tree; - `, - args: [id], - }, - { - sql: sql` - DELETE FROM threads WHERE id IN (SELECT id FROM temp_thread_tree); - `, - }, - { - sql: sql` - DELETE FROM cards WHERE thread_id IN (SELECT id FROM temp_thread_tree); - `, - }, - { - sql: sql` - DROP TABLE temp_thread_tree; - `, - }, - ); - }), -} as const; diff --git a/src/lib/Models/ThreadTree.svelte.ts b/src/lib/Models/ThreadTree.svelte.ts index 580c598..c5183b0 100644 --- a/src/lib/Models/ThreadTree.svelte.ts +++ b/src/lib/Models/ThreadTree.svelte.ts @@ -1,173 +1,173 @@ -import { depend } from "velona"; -import { ELECTRIC } from "$lib/DataAccess/electric"; -import type { ElectricClient } from "electric-sql/client/model"; -import type { schema } from "../../generated/client"; -import { createLiveQuery } from "$lib/Utils/runesLiveQuery.svelte"; -import { Card } from "./Card"; -import { Thread } from "./Thread"; -import { getFullTree } from "./queries/getFullTree.sql"; -import { getPartialTree } from "./queries/getPartialTree.sql"; -import { getNode } from "./queries/getNode.sql"; -import type { - ThreadTreeQueryResult, - ThreadTreeQueryRawResult, -} from "./queries/ThreadTreeQueryTypes"; - -export type ThreadTree = Thread & { - cards: Card[]; - parent?: ThreadTree; - child_threads?: ThreadTree[]; - breadcrumbs?: { - id: string; - title: string; - }; -}; - -export const ThreadTree = { - createNode: async (tree?: { - thread?: Partial; - card?: Partial; - }): Promise => { - const thread = await Thread.create(tree?.thread); - const card = await Card.create({ ...tree?.card, thread_id: thread.id }); - return { - ...thread, - cards: [card], - }; - }, - - liveFullTree: depend({ ELECTRIC }, ({ ELECTRIC }, id: string) => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - return getLiveTree(ELECTRIC, id, getFullTree); - }), - - livePartialTree: depend({ ELECTRIC }, ({ ELECTRIC }, id: string) => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - return getLiveTree(ELECTRIC, id, getPartialTree); - }), - - liveNode: depend({ ELECTRIC }, ({ ELECTRIC }, id: string) => { - if (!ELECTRIC) throw new Error("electric has not initialized yet"); - return getLiveTree(ELECTRIC, id, getNode); - }), -} as const; - -function getLiveTree( - electric: ElectricClient, - id: string, - query: string, -): { state: ThreadTree | undefined; unsubscribe: () => () => void } { - const liveResult = createLiveQuery( - electric.notifier, - electric.db.liveRawQuery({ - sql: query, - args: [id], - }), - ); - - // Using $state and $effect rather than $derived - // to notify changes of the properties inside the result to dependants - let state = $state(undefined); - let isChangeFromLiveQuery: boolean; - - $effect(() => { - if (!Array.isArray(liveResult.result)) { - state = undefined; - } else if (!liveResult.result[0]) { - state = undefined; - throw new Error("thread not found!"); - } else { - state = JSON.parse(liveResult.result[0]["json"]) as ThreadTreeQueryResult; - } - }); - - const removeHook = liveResult.addHook(async () => { - removeHook(); - - // will run only after the first query result - isChangeFromLiveQuery = true; - await new Promise((resolve) => resolve(null)); - const cache = localStorage.getItem(id); - if (cache) { - state = JSON.parse(cache) as ThreadTreeQueryResult; - } - isChangeFromLiveQuery = false; - - // will run from the second query result onward - liveResult.addPreHook(() => { - isChangeFromLiveQuery = true; - }); - liveResult.addHook(async () => { - localStorage.removeItem(id); - - // ensure flag will be set after all effects run - await new Promise((resolve) => setTimeout(resolve, 0)); - isChangeFromLiveQuery = false; - }); - }); - - $effect(() => { - if (!state) return; - state = setParent(state); - - // if you put this line into if block below, - // svelte won't be able to react to changes of the properties inside state - const json = JSON.stringify(state); - - if (!isChangeFromLiveQuery) { - localStorage.setItem(id, json); - } - }); - - return { - get state() { - return state; - }, - unsubscribe: liveResult.unsubscribe, - }; -} - -// To set the reference correctly, the variable you pass to the function and the variable that gets the return value must be same, like this: -// let tree = setParent(tree) -function setParent( - tree: ThreadTreeQueryResult | ThreadTree, - root: boolean = true, -): ThreadTree { - const ref = new WeakRef(tree); - - if (root) { - Object.defineProperty(tree, "parent", { - get: function () { - return undefined; - }, - configurable: true, - }); - } - - if (tree?.cards) { - tree.cards.map((c) => { - Object.defineProperty(c, "thread", { - get: function () { - return ref.deref(); - }, - configurable: true, - }); - return c; - }); - } - - if (tree?.child_threads) { - tree.child_threads.map((c) => { - Object.defineProperty(c, "parent", { - get: function () { - return ref.deref(); - }, - configurable: true, - }); - c = setParent(c, false); - return c; - }); - } - - return tree as ThreadTree; -} +// import { depend } from "velona"; +// import { ELECTRIC } from "$lib/DataAccess/electric"; +// import type { ElectricClient } from "electric-sql/client/model"; +// import type { schema } from "../../generated/client"; +// import { createLiveQuery } from "$lib/Utils/runesLiveQuery.svelte"; +// import { Card } from "./Card"; +// import { Thread } from "./Thread"; +// import { getFullTree } from "./queries/getFullTree.sql"; +// import { getPartialTree } from "./queries/getPartialTree.sql"; +// import { getNode } from "./queries/getNode.sql"; +// import type { +// ThreadTreeQueryResult, +// ThreadTreeQueryRawResult, +// } from "./queries/ThreadTreeQueryTypes"; +// +// export type ThreadTree = Thread & { +// cards: Card[]; +// parent?: ThreadTree; +// child_threads?: ThreadTree[]; +// breadcrumbs?: { +// id: string; +// title: string; +// }; +// }; +// +// export const ThreadTree = { +// createNode: async (tree?: { +// thread?: Partial; +// card?: Partial; +// }): Promise => { +// const thread = await Thread.create(tree?.thread); +// const card = await Card.create({ ...tree?.card, thread_id: thread.id }); +// return { +// ...thread, +// cards: [card], +// }; +// }, +// +// liveFullTree: depend({ ELECTRIC }, ({ ELECTRIC }, id: string) => { +// if (!ELECTRIC) throw new Error("electric has not initialized yet"); +// return getLiveTree(ELECTRIC, id, getFullTree); +// }), +// +// livePartialTree: depend({ ELECTRIC }, ({ ELECTRIC }, id: string) => { +// if (!ELECTRIC) throw new Error("electric has not initialized yet"); +// return getLiveTree(ELECTRIC, id, getPartialTree); +// }), +// +// liveNode: depend({ ELECTRIC }, ({ ELECTRIC }, id: string) => { +// if (!ELECTRIC) throw new Error("electric has not initialized yet"); +// return getLiveTree(ELECTRIC, id, getNode); +// }), +// } as const; +// +// function getLiveTree( +// electric: ElectricClient, +// id: string, +// query: string, +// ): { state: ThreadTree | undefined; unsubscribe: () => () => void } { +// const liveResult = createLiveQuery( +// electric.notifier, +// electric.db.liveRawQuery({ +// sql: query, +// args: [id], +// }), +// ); +// +// // Using $state and $effect rather than $derived +// // to notify changes of the properties inside the result to dependants +// let state = $state(undefined); +// let isChangeFromLiveQuery: boolean; +// +// $effect(() => { +// if (!Array.isArray(liveResult.result)) { +// state = undefined; +// } else if (!liveResult.result[0]) { +// state = undefined; +// throw new Error("thread not found!"); +// } else { +// state = JSON.parse(liveResult.result[0]["json"]) as ThreadTreeQueryResult; +// } +// }); +// +// const removeHook = liveResult.addHook(async () => { +// removeHook(); +// +// // will run only after the first query result +// isChangeFromLiveQuery = true; +// await new Promise((resolve) => resolve(null)); +// const cache = localStorage.getItem(id); +// if (cache) { +// state = JSON.parse(cache) as ThreadTreeQueryResult; +// } +// isChangeFromLiveQuery = false; +// +// // will run from the second query result onward +// liveResult.addPreHook(() => { +// isChangeFromLiveQuery = true; +// }); +// liveResult.addHook(async () => { +// localStorage.removeItem(id); +// +// // ensure flag will be set after all effects run +// await new Promise((resolve) => setTimeout(resolve, 0)); +// isChangeFromLiveQuery = false; +// }); +// }); +// +// $effect(() => { +// if (!state) return; +// state = setParent(state); +// +// // if you put this line into if block below, +// // svelte won't be able to react to changes of the properties inside state +// const json = JSON.stringify(state); +// +// if (!isChangeFromLiveQuery) { +// localStorage.setItem(id, json); +// } +// }); +// +// return { +// get state() { +// return state; +// }, +// unsubscribe: liveResult.unsubscribe, +// }; +// } +// +// // To set the reference correctly, the variable you pass to the function and the variable that gets the return value must be same, like this: +// // let tree = setParent(tree) +// function setParent( +// tree: ThreadTreeQueryResult | ThreadTree, +// root: boolean = true, +// ): ThreadTree { +// const ref = new WeakRef(tree); +// +// if (root) { +// Object.defineProperty(tree, "parent", { +// get: function () { +// return undefined; +// }, +// configurable: true, +// }); +// } +// +// if (tree?.cards) { +// tree.cards.map((c) => { +// Object.defineProperty(c, "thread", { +// get: function () { +// return ref.deref(); +// }, +// configurable: true, +// }); +// return c; +// }); +// } +// +// if (tree?.child_threads) { +// tree.child_threads.map((c) => { +// Object.defineProperty(c, "parent", { +// get: function () { +// return ref.deref(); +// }, +// configurable: true, +// }); +// c = setParent(c, false); +// return c; +// }); +// } +// +// return tree as ThreadTree; +// } diff --git a/src/lib/Models/ThreadTree.test.svelte.ts b/src/lib/Models/ThreadTree.test.svelte.ts index 26ff799..82a2197 100644 --- a/src/lib/Models/ThreadTree.test.svelte.ts +++ b/src/lib/Models/ThreadTree.test.svelte.ts @@ -1,532 +1,537 @@ -import { expect, describe, afterEach } from "vitest"; -import { uuidv7 } from "uuidv7"; -import { generateKeyBetween } from "fractional-indexing"; -import { testElectric, testElectricSync } from "$lib/DataAccess/testElectric"; -import { ThreadTree } from "./ThreadTree.svelte"; -import type { ElectricClient } from "electric-sql/client/model"; -import type { schema } from "../../generated/client"; -import { Thread } from "./Thread"; -import { Card } from "./Card"; -import { sql } from "$lib/Utils/utils"; -import { exec } from "node:child_process"; -import util from "node:util"; - -interface TestThreadTree { - liveTree: ReturnType; -} - -const testThreadTree = testElectric.extend({ - liveTree: async ({ electric }, use) => { - const id = await createTree(electric); - const injectedGetLiveTree = ThreadTree.liveFullTree.inject({ - ELECTRIC: electric, - }); - - let liveTree: ReturnType; - const cleanup = $effect.root(() => { - liveTree = injectedGetLiveTree(id); - }); - await new Promise((resolve) => setTimeout(resolve, 0)); - - use(liveTree); - - afterEach(() => { - cleanup(); - }); - }, -}); - -const testThreadTreeWithCache = testElectric.extend({ - liveTree: async ({ electric }, use) => { - const id = await createTree(electric); - const injectedGetLiveTree = ThreadTree.liveFullTree.inject({ - ELECTRIC: electric, - }); - - const cache = JSON.stringify({ id: id, title: "cache", cards: [] }); - localStorage.setItem(id, cache); - - let liveTree: ReturnType; - const cleanup = $effect.root(() => { - liveTree = injectedGetLiveTree(id); - }); - await new Promise((resolve) => setTimeout(resolve, 0)); - - use(liveTree); - - afterEach(() => { - cleanup(); - localStorage.clear(); - }); - }, -}); - -describe("ThreadTree", () => { - describe("thread", () => { - testThreadTree("fractional index ordering", ({ liveTree }) => { - expect(liveTree?.state?.child_threads?.[0]?.title).toBe("1"); - expect(liveTree?.state?.child_threads?.[1]?.title).toBe("2"); - expect(liveTree?.state?.child_threads?.[2]?.title).toBe("3"); - expect(liveTree?.state?.child_threads?.[3]?.title).toBe("4"); - expect(liveTree?.state?.child_threads?.[4]?.title).toBe("5"); - }); - - testThreadTree("exclude deleted thread", ({ liveTree }) => { - expect(liveTree.state?.child_threads?.[5]).toBeUndefined(); - }); - - testThreadTree("tree structuring", ({ liveTree }) => { - expect( - // @ts-expect-error thread nesting test - liveTree.state.child_threads[0].child_threads[0].child_threads[0] - .child_threads[0].child_threads[0].child_threads[0].id, - ).toBeTruthy(); - }); - - testThreadTree("set parent", ({ liveTree }) => { - expect( - // @ts-expect-error thread nesting test - liveTree.state.child_threads[0].child_threads[0].child_threads[0] - .child_threads[0].child_threads[0].child_threads[0].parent.parent - .parent.parent.parent.parent.id, - ).toBe(liveTree.state.id); - }); - - testThreadTree("change field", ({ liveTree }) => { - liveTree.state.title = "changed!"; - expect(liveTree.state.title).toBe("changed!"); - liveTree.state.child_threads[0].child_threads[0].parent.title = - "changed!"; - expect(liveTree.state.child_threads[0].title).toBe("changed!"); - }); - - testThreadTree("add element", async ({ liveTree }) => { - liveTree.state.cards.push({ - id: "id", - fractional_index: "f", - content: "content", - }); - // wait until effect run - await new Promise((resolve) => setTimeout(resolve, 0)); - expect( - liveTree.state.cards[liveTree.state.cards.length - 1].thread.id, - ).toBe(liveTree.state.id); - }); - - testThreadTree("move element", async ({ liveTree }) => { - const card = - liveTree.state?.child_threads[0]?.child_threads[0].cards.pop(); - liveTree.state?.child_threads[0].cards.push(card); - // wait until effect run - await new Promise((resolve) => setTimeout(resolve, 0)); - expect( - liveTree.state?.child_threads[0].cards[liveTree.state?.cards.length - 1] - ?.thread.parent.id, - ).toBe(liveTree.state.id); - }); - - testThreadTree( - "unsubscribe / resubscribe", - async ({ liveTree, electric }) => { - const resubscribe = liveTree.unsubscribe(); - await electric.db.cards.create({ - data: { - id: uuidv7(), - content: "title", - last_materialized_hash: "", - thread_id: liveTree.state.id, - deleted: false, - created_at: new Date(), - updated_at: new Date(), - fractional_index: "a0", - }, - }); - expect(liveTree.state?.cards.length).toBe(5); - resubscribe(); - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(liveTree.state?.cards.length).toBe(6); - }, - ); - }); - - describe("card", () => { - testThreadTree("card creation", async ({ liveTree, electric }) => { - const result = await electric.db.cards.findMany({ - where: { thread_id: liveTree.state.id }, - }); - expect(result.length).toBe(6); - }); - - testThreadTree("fractional index ordering", ({ liveTree }) => { - expect(liveTree.state.cards[0]?.content).toBe("1"); - expect(liveTree.state.cards[1]?.content).toBe("2"); - expect(liveTree.state.cards[2]?.content).toBe("3"); - expect(liveTree.state.cards[3]?.content).toBe("4"); - expect(liveTree.state.cards[4]?.content).toBe("5"); - }); - - testThreadTree("exclude deleted card", ({ liveTree }) => { - expect(liveTree.state.cards[5]).toBeUndefined(); - }); - - testThreadTree("tree structuring", ({ liveTree }) => { - expect( - // @ts-expect-error thread nesting test - liveTree.state.child_threads[0].child_threads[0].child_threads[0] - .child_threads[0].child_threads[0].child_threads[0]?.cards[0].id, - ).toBeTruthy(); - }); - - testThreadTree("set parent", ({ liveTree }) => { - expect( - // @ts-expect-error thread nesting test - liveTree.state.child_threads[0].child_threads[0].child_threads[0] - .child_threads[0].child_threads[0].child_threads[0].cards[0].thread - .parent.parent.parent.parent.parent.parent.id, - ).toBe(liveTree.state.id); - }); - }); - - describe.skip("cache", () => { - testThreadTreeWithCache( - "initial state of the liveTree to be cache", - async ({ liveTree }) => { - expect(liveTree.state?.title).toBe("cache"); - }, - ); - - testThreadTreeWithCache( - "unsubscribe → resubscribe", - async ({ liveTree, electric }) => { - const subscribe = liveTree.unsubscribe(); - await electric.db.threads.update({ - where: { id: liveTree.state.id }, - data: { title: "updated" }, - }); - expect(liveTree.state?.title).toBe("cache"); - - subscribe(); - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(liveTree.state?.title).toBe("updated"); - }, - ); - - testThreadTreeWithCache( - "cache should be removed when received db updates", - async ({ electric, liveTree }) => { - await electric.db.threads.update({ - where: { id: liveTree.state.id }, - data: { title: "updated" }, - }); - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(JSON.parse(localStorage.getItem(liveTree.state.id))).toBe(null); - }, - ); - - testThreadTreeWithCache( - "cache should be updated along with the state change", - async ({ liveTree }) => { - liveTree.state.title = "3"; - await new Promise((resolve) => setTimeout(resolve, 100)); - expect(JSON.parse(localStorage.getItem(liveTree.state.id))?.title).toBe( - "3", - ); - }, - ); - }); - - describe("sync", () => { - testElectricSync( - "When e1 deletes the root thread and e2 adds children to it while they are offline, all rows should eventually be deleted", - async ({ e1, e2, token }) => { - const injectedCreateThread1 = Thread.create.inject({ - ELECTRIC: e1, - }); - const injectedCreateThread2 = Thread.create.inject({ - ELECTRIC: e2, - }); - const injectedCreateCard2 = Card.create.inject({ ELECTRIC: e2 }); - const injectedDeleteThread = Thread.deletePhysical.inject({ - ELECTRIC: e1, - }); - - // connection - expect(e1.isConnected).toBeTruthy(); - expect(e2.isConnected).toBeTruthy(); - - // initial cleanup - const initialState1 = await e1.db.threads.findMany(); - const initialState2 = await e2.db.threads.findMany(); - expect((await e1.db.cards.findMany()).length).toBe(0); - expect((await e2.db.cards.findMany()).length).toBe(0); - expect(initialState1.length).toBe(0); - expect(initialState2.length).toBe(0); - - // sync ( e1 → e2 ) - const { id } = await injectedCreateThread1(); - await new Promise((resolve) => setTimeout(resolve, 1000)); - const res = await e2.db.threads.findUnique({ - where: { id: id }, - }); - expect(res.id).toBe(id); - - // disconnect and deletes the root - e1.disconnect(); - e2.disconnect(); - await new Promise((resolve) => setTimeout(resolve, 1000)); - - await injectedDeleteThread(id); - - const child = await injectedCreateThread2({ parent_id: id }); - const grandChild = await injectedCreateThread2({ parent_id: child.id }); - await new Promise((resolve) => setTimeout(resolve, 1000)); - await injectedCreateCard2({ thread_id: child.id }); - await injectedCreateCard2({ thread_id: grandChild.id }); - await new Promise((resolve) => setTimeout(resolve, 1000)); - - // resync - await e1.connect(token); - await e2.connect(token); - const shape1_2 = await e1.db.threads.sync(); - const shape2_2 = await e2.db.threads.sync(); - const shape3_2 = await e1.db.cards.sync(); - const shape4_2 = await e2.db.cards.sync(); - await Promise.all([ - shape1_2.synced, - shape2_2.synced, - shape3_2.synced, - shape4_2.synced, - ]); - await new Promise((resolve) => setTimeout(resolve, 1000)); - - expect((await e1.db.threads.findMany()).length).toBe(0); - expect((await e2.db.threads.findMany()).length).toBe(0); - expect((await e1.db.cards.findMany()).length).toBe(0); - expect((await e2.db.cards.findMany()).length).toBe(0); - }, - 30000, - ); - }); - - testElectric("liveNode", async ({ electric }) => { - const injectedLiveNode = ThreadTree.liveNode.inject({ ELECTRIC: electric }); - const root = await createTree(electric); - await new Promise((resolve) => setTimeout(resolve, 0)); - let liveNode; - $effect.root(() => { - liveNode = injectedLiveNode(root); - }); - - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(liveNode?.child_threads).toBeUndefined(); - }); - - testThreadTree("livePartialTree", async ({ electric, liveTree }) => { - const injectedLivePartialTree = ThreadTree.livePartialTree.inject({ - ELECTRIC: electric, - }); - - liveTree.unsubscribe(); - localStorage.clear(); - - let livePartialTree; - $effect.root(() => { - livePartialTree = injectedLivePartialTree(liveTree.state.id); - }); - - await new Promise((resolve) => setTimeout(resolve, 0)); - expect( - livePartialTree.state.child_threads[0].child_threads[0]?.cards, - ).toBeUndefined(); - }); - - testThreadTree("breadcrumbs", async ({ electric, liveTree }) => { - const injectedLivePartialTree = ThreadTree.livePartialTree.inject({ - ELECTRIC: electric, - }); - - const id = - liveTree.state?.child_threads[0]?.child_threads[0]?.child_threads[0].id; - liveTree.unsubscribe(); - localStorage.clear(); - - let livePartialTree; - $effect.root(() => { - livePartialTree = injectedLivePartialTree(id); - }); - - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(livePartialTree.state.breadcrumbs[0].id).toBe(liveTree.state.id); - }); -}); - -const createTree = async ( - electric: ElectricClient, - depth: number = 0, - parent_id?: string, -) => { - const currentID = uuidv7(); - if (depth > 6) return currentID; - - const first = generateKeyBetween(null, null); - const third = generateKeyBetween(first, null); - const second = generateKeyBetween(first, third); - const fourth = third; - const fifth = third; - const now = new Date(); - - if (parent_id) { - await electric.db.threads.createMany({ - data: [ - { - id: currentID, - title: "1", - parent_id: parent_id, - fractional_index: first, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - title: "2", - parent_id: parent_id, - fractional_index: second, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - title: "3", - parent_id: parent_id, - fractional_index: third, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - title: "4", - parent_id: parent_id, - fractional_index: fourth, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - title: "5", - parent_id: parent_id, - fractional_index: fifth, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - title: "deleted", - parent_id: parent_id, - fractional_index: "", - deleted: true, - created_at: now, - updated_at: now, - }, - ], - }); - - await createTree(electric, depth + 1, currentID); - } else { - await electric.db.threads.create({ - data: { - id: currentID, - title: "root", - fractional_index: first, - deleted: false, - created_at: now, - updated_at: now, - }, - }); - await createTree(electric, depth + 1, currentID); - } - - await createCard(electric, currentID); - - return currentID; -}; - -async function createCard( - electric: ElectricClient, - thread_id: string, -) { - const first = generateKeyBetween(null, null); - const third = generateKeyBetween(first, null); - const second = generateKeyBetween(first, third); - const fourth = third; - const fifth = third; - const now = new Date(); - await electric.db.cards.createMany({ - data: [ - { - id: thread_id, - content: "1", - last_materialized_hash: "", - thread_id: thread_id, - fractional_index: first, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - content: "2", - last_materialized_hash: "", - thread_id: thread_id, - fractional_index: second, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - content: "3", - last_materialized_hash: "", - thread_id: thread_id, - fractional_index: third, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - content: "4", - last_materialized_hash: "", - thread_id: thread_id, - fractional_index: fourth, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - content: "5", - last_materialized_hash: "", - thread_id: thread_id, - fractional_index: fifth, - deleted: false, - created_at: now, - updated_at: now, - }, - { - id: uuidv7(), - content: "deleted", - last_materialized_hash: "", - thread_id: thread_id, - fractional_index: "", - deleted: true, - created_at: now, - updated_at: now, - }, - ], - }); -} +import { test, expect } from "vitest"; + +test.skip("ThreadTree", () => { + expect(true).toBeTruthy() +}) +// import { expect, describe, afterEach } from "vitest"; +// import { uuidv7 } from "uuidv7"; +// import { generateKeyBetween } from "fractional-indexing"; +// import { testElectric, testElectricSync } from "$lib/DataAccess/testElectric"; +// import { ThreadTree } from "./ThreadTree.svelte"; +// import type { ElectricClient } from "electric-sql/client/model"; +// import type { schema } from "../../generated/client"; +// import { Thread } from "./Thread"; +// import { Card } from "./Card"; +// import { sql } from "$lib/Utils/utils"; +// import { exec } from "node:child_process"; +// import util from "node:util"; +// +// interface TestThreadTree { +// liveTree: ReturnType; +// } +// +// const testThreadTree = testElectric.extend({ +// liveTree: async ({ electric }, use) => { +// const id = await createTree(electric); +// const injectedGetLiveTree = ThreadTree.liveFullTree.inject({ +// ELECTRIC: electric, +// }); +// +// let liveTree: ReturnType; +// const cleanup = $effect.root(() => { +// liveTree = injectedGetLiveTree(id); +// }); +// await new Promise((resolve) => setTimeout(resolve, 0)); +// +// use(liveTree); +// +// afterEach(() => { +// cleanup(); +// }); +// }, +// }); +// +// const testThreadTreeWithCache = testElectric.extend({ +// liveTree: async ({ electric }, use) => { +// const id = await createTree(electric); +// const injectedGetLiveTree = ThreadTree.liveFullTree.inject({ +// ELECTRIC: electric, +// }); +// +// const cache = JSON.stringify({ id: id, title: "cache", cards: [] }); +// localStorage.setItem(id, cache); +// +// let liveTree: ReturnType; +// const cleanup = $effect.root(() => { +// liveTree = injectedGetLiveTree(id); +// }); +// await new Promise((resolve) => setTimeout(resolve, 0)); +// +// use(liveTree); +// +// afterEach(() => { +// cleanup(); +// localStorage.clear(); +// }); +// }, +// }); +// +// describe("ThreadTree", () => { +// describe("thread", () => { +// testThreadTree("fractional index ordering", ({ liveTree }) => { +// expect(liveTree?.state?.child_threads?.[0]?.title).toBe("1"); +// expect(liveTree?.state?.child_threads?.[1]?.title).toBe("2"); +// expect(liveTree?.state?.child_threads?.[2]?.title).toBe("3"); +// expect(liveTree?.state?.child_threads?.[3]?.title).toBe("4"); +// expect(liveTree?.state?.child_threads?.[4]?.title).toBe("5"); +// }); +// +// testThreadTree("exclude deleted thread", ({ liveTree }) => { +// expect(liveTree.state?.child_threads?.[5]).toBeUndefined(); +// }); +// +// testThreadTree("tree structuring", ({ liveTree }) => { +// expect( +// // @ts-expect-error thread nesting test +// liveTree.state.child_threads[0].child_threads[0].child_threads[0] +// .child_threads[0].child_threads[0].child_threads[0].id, +// ).toBeTruthy(); +// }); +// +// testThreadTree("set parent", ({ liveTree }) => { +// expect( +// // @ts-expect-error thread nesting test +// liveTree.state.child_threads[0].child_threads[0].child_threads[0] +// .child_threads[0].child_threads[0].child_threads[0].parent.parent +// .parent.parent.parent.parent.id, +// ).toBe(liveTree.state.id); +// }); +// +// testThreadTree("change field", ({ liveTree }) => { +// liveTree.state.title = "changed!"; +// expect(liveTree.state.title).toBe("changed!"); +// liveTree.state.child_threads[0].child_threads[0].parent.title = +// "changed!"; +// expect(liveTree.state.child_threads[0].title).toBe("changed!"); +// }); +// +// testThreadTree("add element", async ({ liveTree }) => { +// liveTree.state.cards.push({ +// id: "id", +// fractional_index: "f", +// content: "content", +// }); +// // wait until effect run +// await new Promise((resolve) => setTimeout(resolve, 0)); +// expect( +// liveTree.state.cards[liveTree.state.cards.length - 1].thread.id, +// ).toBe(liveTree.state.id); +// }); +// +// testThreadTree("move element", async ({ liveTree }) => { +// const card = +// liveTree.state?.child_threads[0]?.child_threads[0].cards.pop(); +// liveTree.state?.child_threads[0].cards.push(card); +// // wait until effect run +// await new Promise((resolve) => setTimeout(resolve, 0)); +// expect( +// liveTree.state?.child_threads[0].cards[liveTree.state?.cards.length - 1] +// ?.thread.parent.id, +// ).toBe(liveTree.state.id); +// }); +// +// testThreadTree( +// "unsubscribe / resubscribe", +// async ({ liveTree, electric }) => { +// const resubscribe = liveTree.unsubscribe(); +// await electric.db.cards.create({ +// data: { +// id: uuidv7(), +// content: "title", +// last_materialized_hash: "", +// thread_id: liveTree.state.id, +// deleted: false, +// created_at: new Date(), +// updated_at: new Date(), +// fractional_index: "a0", +// }, +// }); +// expect(liveTree.state?.cards.length).toBe(5); +// resubscribe(); +// await new Promise((resolve) => setTimeout(resolve, 0)); +// expect(liveTree.state?.cards.length).toBe(6); +// }, +// ); +// }); +// +// describe("card", () => { +// testThreadTree("card creation", async ({ liveTree, electric }) => { +// const result = await electric.db.cards.findMany({ +// where: { thread_id: liveTree.state.id }, +// }); +// expect(result.length).toBe(6); +// }); +// +// testThreadTree("fractional index ordering", ({ liveTree }) => { +// expect(liveTree.state.cards[0]?.content).toBe("1"); +// expect(liveTree.state.cards[1]?.content).toBe("2"); +// expect(liveTree.state.cards[2]?.content).toBe("3"); +// expect(liveTree.state.cards[3]?.content).toBe("4"); +// expect(liveTree.state.cards[4]?.content).toBe("5"); +// }); +// +// testThreadTree("exclude deleted card", ({ liveTree }) => { +// expect(liveTree.state.cards[5]).toBeUndefined(); +// }); +// +// testThreadTree("tree structuring", ({ liveTree }) => { +// expect( +// // @ts-expect-error thread nesting test +// liveTree.state.child_threads[0].child_threads[0].child_threads[0] +// .child_threads[0].child_threads[0].child_threads[0]?.cards[0].id, +// ).toBeTruthy(); +// }); +// +// testThreadTree("set parent", ({ liveTree }) => { +// expect( +// // @ts-expect-error thread nesting test +// liveTree.state.child_threads[0].child_threads[0].child_threads[0] +// .child_threads[0].child_threads[0].child_threads[0].cards[0].thread +// .parent.parent.parent.parent.parent.parent.id, +// ).toBe(liveTree.state.id); +// }); +// }); +// +// describe.skip("cache", () => { +// testThreadTreeWithCache( +// "initial state of the liveTree to be cache", +// async ({ liveTree }) => { +// expect(liveTree.state?.title).toBe("cache"); +// }, +// ); +// +// testThreadTreeWithCache( +// "unsubscribe → resubscribe", +// async ({ liveTree, electric }) => { +// const subscribe = liveTree.unsubscribe(); +// await electric.db.threads.update({ +// where: { id: liveTree.state.id }, +// data: { title: "updated" }, +// }); +// expect(liveTree.state?.title).toBe("cache"); +// +// subscribe(); +// await new Promise((resolve) => setTimeout(resolve, 0)); +// expect(liveTree.state?.title).toBe("updated"); +// }, +// ); +// +// testThreadTreeWithCache( +// "cache should be removed when received db updates", +// async ({ electric, liveTree }) => { +// await electric.db.threads.update({ +// where: { id: liveTree.state.id }, +// data: { title: "updated" }, +// }); +// await new Promise((resolve) => setTimeout(resolve, 0)); +// expect(JSON.parse(localStorage.getItem(liveTree.state.id))).toBe(null); +// }, +// ); +// +// testThreadTreeWithCache( +// "cache should be updated along with the state change", +// async ({ liveTree }) => { +// liveTree.state.title = "3"; +// await new Promise((resolve) => setTimeout(resolve, 100)); +// expect(JSON.parse(localStorage.getItem(liveTree.state.id))?.title).toBe( +// "3", +// ); +// }, +// ); +// }); +// +// describe("sync", () => { +// testElectricSync( +// "When e1 deletes the root thread and e2 adds children to it while they are offline, all rows should eventually be deleted", +// async ({ e1, e2, token }) => { +// const injectedCreateThread1 = Thread.create.inject({ +// ELECTRIC: e1, +// }); +// const injectedCreateThread2 = Thread.create.inject({ +// ELECTRIC: e2, +// }); +// const injectedCreateCard2 = Card.create.inject({ ELECTRIC: e2 }); +// const injectedDeleteThread = Thread.deletePhysical.inject({ +// ELECTRIC: e1, +// }); +// +// // connection +// expect(e1.isConnected).toBeTruthy(); +// expect(e2.isConnected).toBeTruthy(); +// +// // initial cleanup +// const initialState1 = await e1.db.threads.findMany(); +// const initialState2 = await e2.db.threads.findMany(); +// expect((await e1.db.cards.findMany()).length).toBe(0); +// expect((await e2.db.cards.findMany()).length).toBe(0); +// expect(initialState1.length).toBe(0); +// expect(initialState2.length).toBe(0); +// +// // sync ( e1 → e2 ) +// const { id } = await injectedCreateThread1(); +// await new Promise((resolve) => setTimeout(resolve, 1000)); +// const res = await e2.db.threads.findUnique({ +// where: { id: id }, +// }); +// expect(res.id).toBe(id); +// +// // disconnect and deletes the root +// e1.disconnect(); +// e2.disconnect(); +// await new Promise((resolve) => setTimeout(resolve, 1000)); +// +// await injectedDeleteThread(id); +// +// const child = await injectedCreateThread2({ parent_id: id }); +// const grandChild = await injectedCreateThread2({ parent_id: child.id }); +// await new Promise((resolve) => setTimeout(resolve, 1000)); +// await injectedCreateCard2({ thread_id: child.id }); +// await injectedCreateCard2({ thread_id: grandChild.id }); +// await new Promise((resolve) => setTimeout(resolve, 1000)); +// +// // resync +// await e1.connect(token); +// await e2.connect(token); +// const shape1_2 = await e1.db.threads.sync(); +// const shape2_2 = await e2.db.threads.sync(); +// const shape3_2 = await e1.db.cards.sync(); +// const shape4_2 = await e2.db.cards.sync(); +// await Promise.all([ +// shape1_2.synced, +// shape2_2.synced, +// shape3_2.synced, +// shape4_2.synced, +// ]); +// await new Promise((resolve) => setTimeout(resolve, 1000)); +// +// expect((await e1.db.threads.findMany()).length).toBe(0); +// expect((await e2.db.threads.findMany()).length).toBe(0); +// expect((await e1.db.cards.findMany()).length).toBe(0); +// expect((await e2.db.cards.findMany()).length).toBe(0); +// }, +// 30000, +// ); +// }); +// +// testElectric("liveNode", async ({ electric }) => { +// const injectedLiveNode = ThreadTree.liveNode.inject({ ELECTRIC: electric }); +// const root = await createTree(electric); +// await new Promise((resolve) => setTimeout(resolve, 0)); +// let liveNode; +// $effect.root(() => { +// liveNode = injectedLiveNode(root); +// }); +// +// await new Promise((resolve) => setTimeout(resolve, 0)); +// expect(liveNode?.child_threads).toBeUndefined(); +// }); +// +// testThreadTree("livePartialTree", async ({ electric, liveTree }) => { +// const injectedLivePartialTree = ThreadTree.livePartialTree.inject({ +// ELECTRIC: electric, +// }); +// +// liveTree.unsubscribe(); +// localStorage.clear(); +// +// let livePartialTree; +// $effect.root(() => { +// livePartialTree = injectedLivePartialTree(liveTree.state.id); +// }); +// +// await new Promise((resolve) => setTimeout(resolve, 0)); +// expect( +// livePartialTree.state.child_threads[0].child_threads[0]?.cards, +// ).toBeUndefined(); +// }); +// +// testThreadTree("breadcrumbs", async ({ electric, liveTree }) => { +// const injectedLivePartialTree = ThreadTree.livePartialTree.inject({ +// ELECTRIC: electric, +// }); +// +// const id = +// liveTree.state?.child_threads[0]?.child_threads[0]?.child_threads[0].id; +// liveTree.unsubscribe(); +// localStorage.clear(); +// +// let livePartialTree; +// $effect.root(() => { +// livePartialTree = injectedLivePartialTree(id); +// }); +// +// await new Promise((resolve) => setTimeout(resolve, 0)); +// expect(livePartialTree.state.breadcrumbs[0].id).toBe(liveTree.state.id); +// }); +// }); +// +// const createTree = async ( +// electric: ElectricClient, +// depth: number = 0, +// parent_id?: string, +// ) => { +// const currentID = uuidv7(); +// if (depth > 6) return currentID; +// +// const first = generateKeyBetween(null, null); +// const third = generateKeyBetween(first, null); +// const second = generateKeyBetween(first, third); +// const fourth = third; +// const fifth = third; +// const now = new Date(); +// +// if (parent_id) { +// await electric.db.threads.createMany({ +// data: [ +// { +// id: currentID, +// title: "1", +// parent_id: parent_id, +// fractional_index: first, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// title: "2", +// parent_id: parent_id, +// fractional_index: second, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// title: "3", +// parent_id: parent_id, +// fractional_index: third, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// title: "4", +// parent_id: parent_id, +// fractional_index: fourth, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// title: "5", +// parent_id: parent_id, +// fractional_index: fifth, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// title: "deleted", +// parent_id: parent_id, +// fractional_index: "", +// deleted: true, +// created_at: now, +// updated_at: now, +// }, +// ], +// }); +// +// await createTree(electric, depth + 1, currentID); +// } else { +// await electric.db.threads.create({ +// data: { +// id: currentID, +// title: "root", +// fractional_index: first, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// }); +// await createTree(electric, depth + 1, currentID); +// } +// +// await createCard(electric, currentID); +// +// return currentID; +// }; +// +// async function createCard( +// electric: ElectricClient, +// thread_id: string, +// ) { +// const first = generateKeyBetween(null, null); +// const third = generateKeyBetween(first, null); +// const second = generateKeyBetween(first, third); +// const fourth = third; +// const fifth = third; +// const now = new Date(); +// await electric.db.cards.createMany({ +// data: [ +// { +// id: thread_id, +// content: "1", +// last_materialized_hash: "", +// thread_id: thread_id, +// fractional_index: first, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// content: "2", +// last_materialized_hash: "", +// thread_id: thread_id, +// fractional_index: second, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// content: "3", +// last_materialized_hash: "", +// thread_id: thread_id, +// fractional_index: third, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// content: "4", +// last_materialized_hash: "", +// thread_id: thread_id, +// fractional_index: fourth, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// content: "5", +// last_materialized_hash: "", +// thread_id: thread_id, +// fractional_index: fifth, +// deleted: false, +// created_at: now, +// updated_at: now, +// }, +// { +// id: uuidv7(), +// content: "deleted", +// last_materialized_hash: "", +// thread_id: thread_id, +// fractional_index: "", +// deleted: true, +// created_at: now, +// updated_at: now, +// }, +// ], +// }); +// } diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 75037f4..f356449 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,6 +1,6 @@ diff --git a/vite.config.js b/vite.config.js index 55aea3d..80feead 100644 --- a/vite.config.js +++ b/vite.config.js @@ -37,9 +37,5 @@ export default defineConfig(async () => ({ include: ["src/**/*.{test,test.svelte,spec}.{js,ts}"], exclude: ["src/generated/**"], environment: "jsdom", - poolOptions: { - threads: { singleThread: true }, - forks: { singleFork: true }, - }, }, })); diff --git a/vitest.setup.ts b/vitest.setup.ts index 76cdd4c..bf43e1c 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -1,9 +1,9 @@ -import { exec } from "node:child_process"; -import util from "node:util"; +// import { exec } from "node:child_process"; +// import util from "node:util"; export async function setup() { - console.log("🐳 setting up containers..."); - const { stdout, stderr } = await util.promisify(exec)("./db/test-setup.sh"); - if (stdout) console.log(stdout); - if (stderr) console.log(stderr); + // console.log("🐳 setting up containers..."); + // const { stdout, stderr } = await util.promisify(exec)("./db/test-setup.sh"); + // if (stdout) console.log(stdout); + // if (stderr) console.log(stderr); }