diff --git a/.github/workflows/deploy.docs.yml b/.github/workflows/deploy.docs.yml index 9d21e5c5..4213a784 100644 --- a/.github/workflows/deploy.docs.yml +++ b/.github/workflows/deploy.docs.yml @@ -11,8 +11,8 @@ jobs: # Specify runner + build & upload the static files as an artifact runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Install Dependencies & Build Library diff --git a/.github/workflows/test.backend.seed.yml b/.github/workflows/test.backend.seed.yml index 2ac02761..84a2e5e5 100644 --- a/.github/workflows/test.backend.seed.yml +++ b/.github/workflows/test.backend.seed.yml @@ -9,7 +9,7 @@ jobs: outputs: changes: ${{ steps.filter.outputs.match }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -27,10 +27,10 @@ jobs: WORKING_DIRECTORY: ./ steps: - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - name: Setup Node.js - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version-file: '.tool-versions' @@ -53,7 +53,7 @@ jobs: # WORKING_DIRECTORY: ./ # steps: # - name: Checkout code - # uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + # uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 # # - name: Build Docker Development # run: docker compose build diff --git a/.github/workflows/test.build.docker.yml b/.github/workflows/test.build.docker.yml index 6e948644..53505d23 100644 --- a/.github/workflows/test.build.docker.yml +++ b/.github/workflows/test.build.docker.yml @@ -9,7 +9,7 @@ jobs: outputs: changes: ${{ steps.filter.outputs.build-docker }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -27,7 +27,7 @@ jobs: WORKING_DIRECTORY: ./ steps: - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - name: Build Docker Production run: docker compose -f docker-compose.yml build @@ -42,7 +42,7 @@ jobs: # WORKING_DIRECTORY: ./ # steps: # - name: Checkout code - # uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + # uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 # # - name: Build Docker Development # run: docker compose build diff --git a/.github/workflows/test.build.lib.yml b/.github/workflows/test.build.lib.yml index f98ed1b1..02c776b1 100644 --- a/.github/workflows/test.build.lib.yml +++ b/.github/workflows/test.build.lib.yml @@ -9,7 +9,7 @@ jobs: outputs: build: ${{ steps.filter.outputs.build }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -24,8 +24,8 @@ jobs: needs: files-changed runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Install Dependencies & Build Library @@ -44,8 +44,8 @@ jobs: app: [examples/1-basic-map, examples/2-static-layers, examples/3-tags ] steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Link Utopia-UI in Example App diff --git a/.github/workflows/test.docs.lib.yml b/.github/workflows/test.docs.lib.yml index eea57407..3f5a0f50 100644 --- a/.github/workflows/test.docs.lib.yml +++ b/.github/workflows/test.docs.lib.yml @@ -9,7 +9,7 @@ jobs: outputs: docs: ${{ steps.filter.outputs.docs }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -25,8 +25,8 @@ jobs: # needs: files-changed # runs-on: ubuntu-latest # steps: -# - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 -# - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 +# - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 +# - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 # with: # node-version-file: './.tool-versions' # - name: Frontend | Build @@ -41,8 +41,8 @@ jobs: env: COVERAGE_REQUIRED: 0 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Docs diff --git a/.github/workflows/test.e2e.yml b/.github/workflows/test.e2e.yml index 47e97bdf..20f10fd9 100644 --- a/.github/workflows/test.e2e.yml +++ b/.github/workflows/test.e2e.yml @@ -12,10 +12,10 @@ jobs: test_failed: ${{ steps.report-results.outputs.test_failed }} steps: - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.0 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5.0.0 - name: Set up Node.js - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v5.0.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v5.0.0 with: node-version-file: ./.tool-versions cache: 'npm' @@ -156,10 +156,10 @@ jobs: if: failure() && needs.cypress-e2e-tests.result == 'failure' steps: - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.0 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5.0.0 - name: Setup Node.js - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v5.0.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v5.0.0 with: node-version: '20' cache: 'npm' diff --git a/.github/workflows/test.lint.cypress.yml b/.github/workflows/test.lint.cypress.yml index bd826140..b14ce16c 100644 --- a/.github/workflows/test.lint.cypress.yml +++ b/.github/workflows/test.lint.cypress.yml @@ -9,7 +9,7 @@ jobs: outputs: cypress: ${{ steps.filter.outputs.cypress }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.0 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5.0.0 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -25,8 +25,8 @@ jobs: needs: files-changed runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.0 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v5.0.0 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5.0.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v5.0.0 with: node-version-file: '.tool-versions' - name: Lint diff --git a/.github/workflows/test.lint.frontend.yml b/.github/workflows/test.lint.frontend.yml index e86d96ea..fd3d0b75 100644 --- a/.github/workflows/test.lint.frontend.yml +++ b/.github/workflows/test.lint.frontend.yml @@ -9,7 +9,7 @@ jobs: outputs: lint: ${{ steps.filter.outputs.lint }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -24,8 +24,8 @@ jobs: needs: files-changed runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Lint diff --git a/.github/workflows/test.lint.lib.examples.yml b/.github/workflows/test.lint.lib.examples.yml index ecbabcce..003b413d 100644 --- a/.github/workflows/test.lint.lib.examples.yml +++ b/.github/workflows/test.lint.lib.examples.yml @@ -9,7 +9,7 @@ jobs: outputs: lint: ${{ steps.filter.outputs.lint }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -24,8 +24,8 @@ jobs: # needs: files-changed # runs-on: ubuntu-latest # steps: -# - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 -# - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 +# - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 +# - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 # with: # node-version-file: './.tool-versions' # - name: Frontend | Build @@ -38,8 +38,8 @@ jobs: needs: files-changed runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Lint @@ -52,8 +52,8 @@ jobs: needs: files-changed runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Lint @@ -66,8 +66,8 @@ jobs: needs: files-changed runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Lint @@ -80,8 +80,8 @@ jobs: # needs: files-changed # runs-on: ubuntu-latest # steps: -# - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 -# - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 +# - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 +# - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 # with: # node-version-file: './.tool-versions' # - name: Frontend | Unit diff --git a/.github/workflows/test.lint.lib.yml b/.github/workflows/test.lint.lib.yml index e66521ef..c3e7dca9 100644 --- a/.github/workflows/test.lint.lib.yml +++ b/.github/workflows/test.lint.lib.yml @@ -9,7 +9,7 @@ jobs: outputs: lint: ${{ steps.filter.outputs.lint }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -24,8 +24,8 @@ jobs: needs: files-changed runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Lint diff --git a/.github/workflows/test.unit.lib.yml b/.github/workflows/test.unit.lib.yml index 11edc747..52195cce 100644 --- a/.github/workflows/test.unit.lib.yml +++ b/.github/workflows/test.unit.lib.yml @@ -9,7 +9,7 @@ jobs: outputs: unit: ${{ steps.filter.outputs.unit }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: @@ -24,8 +24,8 @@ jobs: needs: files-changed runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4.1.7 - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v4.0.3 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3 with: node-version-file: '.tool-versions' - name: Unit diff --git a/app/package.json b/app/package.json index 5f82c963..cf28739d 100644 --- a/app/package.json +++ b/app/package.json @@ -17,34 +17,34 @@ "@heroicons/react": "^2.1.1", "@tailwindcss/vite": "^4.1.18", "@types/geojson": "^7946.0.10", - "axios": "^1.13.2", + "axios": "^1.13.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-rnd": "^10.4.1", - "react-router-dom": "^7.11.0", + "react-router-dom": "^7.13.0", "utopia-ui": "^3.0.112", - "vite-tsconfig-paths": "^5.1.4" + "vite-tsconfig-paths": "^6.0.5" }, "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "^4.6.0", "@eslint/js": "^9.36.0", - "@types/node": "^24.10.2", + "@types/node": "^25.2.0", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.0.0", - "daisyui": "^5.5.14", + "daisyui": "^5.5.17", "eslint": "^9.39.2", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import-x": "^4.16.1", "eslint-plugin-json": "^4.0.1", "eslint-plugin-no-catch-all": "^1.1.0", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-promise": "^7.2.1", "eslint-plugin-react": "^7.31.8", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.26", + "eslint-plugin-react-refresh": "^0.5.0", "eslint-plugin-security": "^3.0.1", - "globals": "^17.0.0", + "globals": "^17.3.0", "postcss": "^8.4.30", "tailwindcss": "^4.1.18", "typescript": "^5.9.3", diff --git a/backend/README.md b/backend/README.md index 58276126..ee2e97f1 100644 --- a/backend/README.md +++ b/backend/README.md @@ -54,48 +54,9 @@ docker exec -t utopia-map-database-1 pg_dumpall -c -U directus > dump.sql Assuming you run docker-compose with the default postgress credentials and have the dump in cwd as ./dump.sql, execute: -Find current schema name: +Drop database: ``` -echo "SELECT CURRENT_SCHEMA, CURRENT_SCHEMA();" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus" -``` -> current_schema | current_schema -> ----------------+---------------- -> public | public -> (1 row) - -Drop schemata (loses all data): -``` -echo "DROP SCHEMA public CASCADE;" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus" - -echo "DROP SCHEMA tiger CASCADE;" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus" - -echo "DROP SCHEMA tiger_data CASCADE;" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus" - -echo "DROP SCHEMA topology CASCADE;" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus" -``` -> drop cascades to table ... -> ... -> DROP SCHEMA - -Create the public schema again: -``` -echo "CREATE SCHEMA public;" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus" -``` - -Verify schemata: -``` -echo "select schema_name from information_schema.schemata;" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus" -``` - -Verify database is empty: -``` -echo "\dt" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus directus" -``` -> Did not find any relations. - -Create admin role & grant it: -``` -echo "CREATE ROLE admin;" | docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql --username directus directus" +docker exec -i utopia-map-database-1 /bin/bash -c "PGPASSWORD=directus psql -v ON_ERROR_STOP=1 --username directus directus" < ./backend/scripts/drop-database.sql ``` Apply dump: diff --git a/backend/scripts/drop-database.sql b/backend/scripts/drop-database.sql new file mode 100644 index 00000000..d6837492 --- /dev/null +++ b/backend/scripts/drop-database.sql @@ -0,0 +1,8 @@ +-- CAUTION: THIS SCRIPT DROPS ALL DATA IN YOUR DATABASE! +DROP SCHEMA public CASCADE; +DROP SCHEMA tiger CASCADE; +DROP SCHEMA tiger_data CASCADE; +DROP SCHEMA topology CASCADE; + +CREATE SCHEMA public; +CREATE ROLE admin; \ No newline at end of file diff --git a/backend/scripts/update-user-passwords.sql b/backend/scripts/update-user-passwords.sql new file mode 100644 index 00000000..079726b9 --- /dev/null +++ b/backend/scripts/update-user-passwords.sql @@ -0,0 +1,3 @@ +-- Selects passwords and emails and creates a script to update user passwords in a database. +-- This is used to port users between instances as directus cannot import user passwords +SELECT CONCAT('UPDATE public.directus_users SET password=''', password, ''' WHERE email=''', email, ''';') FROM public.directus_users; \ No newline at end of file diff --git a/lib/package.json b/lib/package.json index d3df8698..87474431 100644 --- a/lib/package.json +++ b/lib/package.json @@ -51,35 +51,35 @@ "@rollup/plugin-typescript": "^12.3.0", "@tailwindcss/postcss": "^4.1.18", "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.1", + "@testing-library/react": "^16.3.2", "@types/geojson": "^7946.0.14", "@types/leaflet": "^1.9.21", "@types/leaflet.markercluster": "^1.5.5", "@types/react": "^18.2.0", "@types/react-dom": "^18.0.5", "@vitejs/plugin-react": "^4.3.4", - "@vitest/coverage-v8": "^4.0.17", - "cypress": "^15.9.0", - "daisyui": "^5.5.14", + "@vitest/coverage-v8": "^4.0.18", + "cypress": "^15.10.0", + "daisyui": "^5.5.17", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import-x": "^4.16.1", "eslint-plugin-json": "^4.0.1", "eslint-plugin-no-catch-all": "^1.1.0", - "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-promise": "^7.2.1", "eslint-plugin-react": "^7.31.8", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.26", + "eslint-plugin-react-refresh": "^0.5.0", "eslint-plugin-security": "^3.0.1", - "globals": "^17.0.0", - "happy-dom": "^20.1.0", + "globals": "^17.3.0", + "happy-dom": "^20.5.0", "postcss": "^8.4.21", - "prettier": "^3.7.4", + "prettier": "^3.8.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "rollup": "^4.55.1", + "rollup": "^4.57.1", "rollup-plugin-dts": "^6.3.0", "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-svg": "^2.0.0", @@ -112,16 +112,16 @@ "@tiptap/react": "^3.15.3", "@tiptap/starter-kit": "^3.15.3", "@tiptap/suggestion": "^3.15.3", - "axios": "^1.13.2", + "axios": "^1.13.4", "browser-image-compression": "^2.0.2", "classnames": "^2.5.1", "leaflet": "^1.9.4", "leaflet.locatecontrol": "^0.79.0", - "maplibre-gl": "^5.16.0", + "maplibre-gl": "^5.17.0", "marked": "^16.4.2", "radash": "^12.1.0", "react-colorful": "^5.6.1", - "react-dropzone": "^14.3.8", + "react-dropzone": "^14.4.0", "react-icons": "^5.5.0", "react-image-crop": "^11.0.10", "react-inlinesvg": "^4.2.0", diff --git a/lib/src/Components/Templates/OverlayItemsIndexPage.spec.tsx b/lib/src/Components/Templates/OverlayItemsIndexPage.spec.tsx new file mode 100644 index 00000000..102cca71 --- /dev/null +++ b/lib/src/Components/Templates/OverlayItemsIndexPage.spec.tsx @@ -0,0 +1,171 @@ +/* eslint-disable camelcase */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ + +import { render, screen, act, waitFor } from '@testing-library/react' +import { MemoryRouter } from 'react-router-dom' +import { describe, it, expect, beforeEach, vi } from 'vitest' + +import { OverlayItemsIndexPage } from './OverlayItemsIndexPage' + +import type { Item } from '#types/Item' + +vi.mock('./ItemCard', () => ({ + ItemCard: ({ i }: { i: Item }) =>
{i.name}
, +})) +vi.mock('./MapOverlayPage', () => ({ + MapOverlayPage: ({ children }: { children: React.ReactNode }) =>
{children}
, +})) +vi.mock('#components/Map/Subcomponents/Controls/Control', () => ({ + Control: () => null, +})) +vi.mock('#components/Map/Subcomponents/Controls/SearchControl', () => ({ + SearchControl: () => null, +})) +vi.mock('#components/Map/Subcomponents/Controls/TagsControl', () => ({ + TagsControl: () => null, +})) +vi.mock('#components/Profile/Subcomponents/PlusButton', () => ({ + PlusButton: () => null, +})) +vi.mock('#components/Map/Subcomponents/ItemPopupComponents', () => ({ + PopupStartEndInput: () => null, +})) +vi.mock('#components/Input', () => ({ + TextInput: () => null, +})) +vi.mock('react-toastify', () => ({ + toast: { success: vi.fn(), error: vi.fn() }, +})) +vi.mock('react-router-dom', async () => { + const actual = await vi.importActual('react-router-dom') + return { ...actual, useNavigate: () => vi.fn() } +}) + +vi.mock('#components/Auth/useAuth') +vi.mock('#components/Map/hooks/useFilter') +vi.mock('#components/Map/hooks/useItems') +vi.mock('#components/Map/hooks/useLayers') +vi.mock('#components/Map/hooks/useTags') + +let observerCallback: IntersectionObserverCallback +const mockObserve = vi.fn() +const mockDisconnect = vi.fn() + +class MockIntersectionObserver { + // eslint-disable-next-line promise/prefer-await-to-callbacks + constructor(cb: IntersectionObserverCallback) { + observerCallback = cb + } + + observe = mockObserve + disconnect = mockDisconnect + unobserve = vi.fn() +} +vi.stubGlobal('IntersectionObserver', MockIntersectionObserver) + +function makeItems(count: number): Item[] { + return Array.from({ length: count }, (_, i) => ({ + id: `item-${String(i)}`, + name: `Item ${String(i)}`, + date_created: new Date(2025, 0, count - i).toISOString(), + layer: { name: 'places' } as Item['layer'], + })) as Item[] +} + +const mockLayer = { + name: 'places', + menuText: 'Places', + itemType: { show_start_end_input: false }, + userProfileLayer: false, + api: { createItem: vi.fn(), deleteItem: vi.fn() }, +} + +function triggerIntersection() { + observerCallback( + [{ isIntersecting: true } as IntersectionObserverEntry], + {} as IntersectionObserver, + ) +} + +describe('OverlayItemsIndexPage – infinite scroll', () => { + beforeEach(async () => { + vi.clearAllMocks() + + const { useAuth } = await import('#components/Auth/useAuth') + const { useFilterTags } = await import('#components/Map/hooks/useFilter') + const { useItems, useAddItem, useRemoveItem } = await import('#components/Map/hooks/useItems') + const { useLayers } = await import('#components/Map/hooks/useLayers') + const { useTags, useAddTag, useGetItemTags } = await import('#components/Map/hooks/useTags') + + vi.mocked(useAuth).mockReturnValue({ user: null } as any) + vi.mocked(useFilterTags).mockReturnValue([]) + vi.mocked(useItems).mockReturnValue(makeItems(50)) + vi.mocked(useAddItem).mockReturnValue(vi.fn()) + vi.mocked(useRemoveItem).mockReturnValue(vi.fn()) + vi.mocked(useLayers).mockReturnValue([mockLayer] as any) + vi.mocked(useTags).mockReturnValue([]) + vi.mocked(useAddTag).mockReturnValue(vi.fn()) + vi.mocked(useGetItemTags).mockReturnValue((() => []) as any) + }) + + function renderPage() { + return render( + + + , + ) + } + + it('renders the first batch of 30 items with a sentinel', () => { + renderPage() + + expect(screen.getAllByTestId(/^item-/)).toHaveLength(30) + expect(screen.getByTestId('scroll-sentinel')).toBeInTheDocument() + }) + + it('loads more items when the sentinel becomes visible', async () => { + renderPage() + expect(mockObserve).toHaveBeenCalled() + expect(screen.getAllByTestId(/^item-/)).toHaveLength(30) + + act(() => { + triggerIntersection() + }) + + await waitFor(() => { + expect(screen.getAllByTestId(/^item-/)).toHaveLength(50) + }) + }) + + it('removes the sentinel after all items are loaded', async () => { + renderPage() + expect(mockObserve).toHaveBeenCalled() + + act(() => { + triggerIntersection() + }) + + await waitFor(() => { + expect(screen.queryByTestId('scroll-sentinel')).not.toBeInTheDocument() + }) + }) + + it('only loads one batch when triggered twice before re-render', async () => { + const { useItems } = await import('#components/Map/hooks/useItems') + vi.mocked(useItems).mockReturnValue(makeItems(80)) + + renderPage() + expect(mockObserve).toHaveBeenCalled() + expect(screen.getAllByTestId(/^item-/)).toHaveLength(30) + + act(() => { + triggerIntersection() + triggerIntersection() + }) + + await waitFor(() => { + expect(screen.getAllByTestId(/^item-/)).toHaveLength(54) + }) + }) +}) diff --git a/lib/src/Components/Templates/OverlayItemsIndexPage.tsx b/lib/src/Components/Templates/OverlayItemsIndexPage.tsx index f5aec8a1..aaf19ec3 100644 --- a/lib/src/Components/Templates/OverlayItemsIndexPage.tsx +++ b/lib/src/Components/Templates/OverlayItemsIndexPage.tsx @@ -22,6 +22,7 @@ import { PlusButton } from '#components/Profile/Subcomponents/PlusButton' import { hashTagRegex } from '#utils/HashTagRegex' import { randomColor } from '#utils/RandomColor' +import { filterSortAndPaginate } from './filterSortAndPaginate' import { ItemCard } from './ItemCard' import { MapOverlayPage } from './MapOverlayPage' @@ -40,8 +41,11 @@ export const OverlayItemsIndexPage = ({ }) => { const [loading, setLoading] = useState(false) const [addItemPopupOpen, setAddItemPopupOpen] = useState(false) - + const [itemsToShow, setItemsToShow] = useState(30) const tabRef = useRef(null) + const sentinelRef = useRef(null) + const scrollContainerRef = useRef(null) + const isLoadingMoreRef = useRef(false) function scroll() { tabRef.current?.scrollIntoView() @@ -66,6 +70,45 @@ export const OverlayItemsIndexPage = ({ const layer = layers.find((l) => l.name === layerName) + const { visibleItems, hasMore } = filterSortAndPaginate( + items, + layerName, + filterTags, + getItemTags, + itemsToShow, + ) + + useEffect(() => { + const sentinel = sentinelRef.current + const scrollContainer = scrollContainerRef.current + if (!sentinel || !scrollContainer) return + + const observer = new IntersectionObserver( + (entries) => { + const entry = entries[0] + if (entry.isIntersecting && !isLoadingMoreRef.current && hasMore) { + isLoadingMoreRef.current = true + setItemsToShow((prev) => prev + 24) + } + }, + { + root: scrollContainer, + rootMargin: '400px', + threshold: 0.1, + }, + ) + + observer.observe(sentinel) + + return () => { + observer.disconnect() + } + }, [hasMore, visibleItems.length]) + + useEffect(() => { + isLoadingMoreRef.current = false + }, [visibleItems.length]) + const submitNewItem = async (evt: React.FormEvent) => { evt.preventDefault() const formItem: Item = {} as Item @@ -130,44 +173,18 @@ export const OverlayItemsIndexPage = ({ -
+
- {items - .filter((i) => i.layer?.name === layerName) - .filter((item) => - filterTags.length === 0 - ? item - : filterTags.some((tag) => - getItemTags(item).some( - (filterTag) => - filterTag.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase(), - ), - ), - ) - .sort((a, b) => { - // Convert date_created to milliseconds, handle undefined by converting to lowest possible date (0 milliseconds) - const dateA = a.date_updated - ? new Date(a.date_updated).getTime() - : a.date_created - ? new Date(a.date_created).getTime() - : 0 - const dateB = b.date_updated - ? new Date(b.date_updated).getTime() - : b.date_created - ? new Date(b.date_created).getTime() - : 0 - return dateB - dateA // Subtracts milliseconds which are numbers - }) - .map((i, k) => ( -
- deleteItem(i)} - /> -
- ))} + {visibleItems.map((i) => ( +
+ deleteItem(i)} + /> +
+ ))} {addItemPopupOpen && (
submitNewItem(e)}>
@@ -208,6 +225,15 @@ export const OverlayItemsIndexPage = ({ )}
+ {hasMore && ( +
+ +
+ )}
diff --git a/lib/src/Components/Templates/filterSortAndPaginate.spec.ts b/lib/src/Components/Templates/filterSortAndPaginate.spec.ts new file mode 100644 index 00000000..cee6bdb9 --- /dev/null +++ b/lib/src/Components/Templates/filterSortAndPaginate.spec.ts @@ -0,0 +1,145 @@ +/* eslint-disable camelcase */ // Directus database fields use snake_case +import { describe, it, expect } from 'vitest' + +import { filterSortAndPaginate } from './filterSortAndPaginate' + +import type { Item } from '#types/Item' +import type { Tag } from '#types/Tag' + +function makeItem(overrides: Partial & { id: string; layerName?: string }): Item { + const { layerName, ...rest } = overrides + return { + ...rest, + layer: layerName ? ({ name: layerName } as Item['layer']) : undefined, + } as Item +} + +function getItemTags(item: Item): Tag[] { + if (!item.text) return [] + const matches = item.text.match(/#([a-zA-ZÀ-ÖØ-öø-ʸ0-9_-]+)/g) + if (!matches) return [] + return matches.map((m) => ({ + id: m, + name: m.slice(1), + color: '#000', + })) +} + +const PLACES = 'places' +const EVENTS = 'events' + +const items: Item[] = [ + makeItem({ id: '1', layerName: PLACES, text: '#nature', date_updated: '2025-03-01T00:00:00Z' }), + makeItem({ id: '2', layerName: PLACES, text: '#food', date_created: '2025-02-01T00:00:00Z' }), + makeItem({ + id: '3', + layerName: PLACES, + text: '#nature #food', + date_updated: '2025-01-01T00:00:00Z', + }), + makeItem({ id: '4', layerName: EVENTS, text: '#nature', date_updated: '2025-04-01T00:00:00Z' }), + makeItem({ id: '5', layerName: PLACES, text: '', date_created: '2025-05-01T00:00:00Z' }), + makeItem({ id: '6', text: '#nature' }), // no layer +] + +describe('filterSortAndPaginate', () => { + describe('layer filtering', () => { + it('returns only items matching the given layer name', () => { + const { visibleItems } = filterSortAndPaginate(items, PLACES, [], getItemTags, 100) + expect(visibleItems.every((i) => i.layer?.name === PLACES)).toBe(true) + expect(visibleItems).toHaveLength(4) // ids 1,2,3,5 + }) + + it('excludes items with no layer', () => { + const { visibleItems } = filterSortAndPaginate(items, PLACES, [], getItemTags, 100) + expect(visibleItems.find((i) => i.id === '6')).toBeUndefined() + }) + }) + + describe('tag filtering', () => { + it('returns all layer items when no filter tags are active', () => { + const { visibleItems } = filterSortAndPaginate(items, PLACES, [], getItemTags, 100) + expect(visibleItems).toHaveLength(4) + }) + + it('keeps only items that have at least one matching tag', () => { + const filterTags: Tag[] = [{ id: 't1', name: 'food', color: '#000' }] + const { visibleItems } = filterSortAndPaginate(items, PLACES, filterTags, getItemTags, 100) + expect(visibleItems.map((i) => i.id).sort()).toEqual(['2', '3']) + }) + + it('excludes items with no matching tags', () => { + const filterTags: Tag[] = [{ id: 't1', name: 'food', color: '#000' }] + const { visibleItems } = filterSortAndPaginate(items, PLACES, filterTags, getItemTags, 100) + expect(visibleItems.find((i) => i.id === '1')).toBeUndefined() + }) + + it('matches tags case-insensitively', () => { + const filterTags: Tag[] = [{ id: 't1', name: 'Nature', color: '#000' }] + const { visibleItems } = filterSortAndPaginate(items, PLACES, filterTags, getItemTags, 100) + // ids 1 (#nature) and 3 (#nature #food) + expect(visibleItems.map((i) => i.id)).toContain('1') + expect(visibleItems.map((i) => i.id)).toContain('3') + }) + + it('items with no text (no tags) are excluded when filter is active', () => { + const filterTags: Tag[] = [{ id: 't1', name: 'nature', color: '#000' }] + const { visibleItems } = filterSortAndPaginate(items, PLACES, filterTags, getItemTags, 100) + expect(visibleItems.find((i) => i.id === '5')).toBeUndefined() + }) + }) + + describe('sorting (newest first)', () => { + it('sorts by date_updated descending', () => { + const { visibleItems } = filterSortAndPaginate(items, PLACES, [], getItemTags, 100) + const ids = visibleItems.map((i) => i.id) + expect(ids).toEqual(['5', '1', '2', '3']) + }) + + it('falls back to date_created when date_updated is absent', () => { + const a = makeItem({ id: 'a', layerName: PLACES, date_created: '2025-06-01T00:00:00Z' }) + const b = makeItem({ id: 'b', layerName: PLACES, date_updated: '2025-05-01T00:00:00Z' }) + const { visibleItems } = filterSortAndPaginate([a, b], PLACES, [], getItemTags, 100) + expect(visibleItems[0].id).toBe('a') + }) + + it('items with no dates sort to the end', () => { + const dated = makeItem({ id: 'd', layerName: PLACES, date_created: '2025-01-01T00:00:00Z' }) + const undated = makeItem({ id: 'u', layerName: PLACES }) + const { visibleItems } = filterSortAndPaginate([undated, dated], PLACES, [], getItemTags, 100) + expect(visibleItems[0].id).toBe('d') + expect(visibleItems[1].id).toBe('u') + }) + }) + + describe('pagination', () => { + it('limits visible items to itemsToShow', () => { + const { visibleItems, hasMore } = filterSortAndPaginate(items, PLACES, [], getItemTags, 2) + expect(visibleItems).toHaveLength(2) + expect(hasMore).toBe(true) + }) + + it('hasMore is false when all items fit within the limit', () => { + const { hasMore } = filterSortAndPaginate(items, PLACES, [], getItemTags, 100) + expect(hasMore).toBe(false) + }) + + it('hasMore is false when itemsToShow equals the item count exactly', () => { + const { visibleItems, hasMore } = filterSortAndPaginate(items, PLACES, [], getItemTags, 4) + expect(visibleItems).toHaveLength(4) + expect(hasMore).toBe(false) + }) + + it('returns empty array when no items match', () => { + const { visibleItems, hasMore } = filterSortAndPaginate( + items, + 'nonexistent', + [], + getItemTags, + 30, + ) + expect(visibleItems).toEqual([]) + expect(hasMore).toBe(false) + }) + }) +}) diff --git a/lib/src/Components/Templates/filterSortAndPaginate.ts b/lib/src/Components/Templates/filterSortAndPaginate.ts new file mode 100644 index 00000000..95979b95 --- /dev/null +++ b/lib/src/Components/Templates/filterSortAndPaginate.ts @@ -0,0 +1,48 @@ +import type { Item } from '#types/Item' +import type { Tag } from '#types/Tag' + +/** + * Pure helper that filters items by layer and tags, sorts by date (newest first), + * and returns a paginated slice. + * + * Extracted from OverlayItemsIndexPage for testability. + * + * @category Templates + */ +export function filterSortAndPaginate( + items: Item[], + layerName: string, + filterTags: Tag[], + getItemTags: (item: Item) => Tag[], + itemsToShow: number, +): { visibleItems: Item[]; hasMore: boolean } { + const filteredAndSortedItems = items + .filter((i) => i.layer?.name === layerName) + .filter((item) => + filterTags.length === 0 + ? true + : filterTags.some((tag) => + getItemTags(item).some( + (itemTag) => itemTag.name.toLocaleLowerCase() === tag.name.toLocaleLowerCase(), + ), + ), + ) + .sort((a, b) => { + const dateA = a.date_updated + ? new Date(a.date_updated).getTime() + : a.date_created + ? new Date(a.date_created).getTime() + : 0 + const dateB = b.date_updated + ? new Date(b.date_updated).getTime() + : b.date_created + ? new Date(b.date_created).getTime() + : 0 + return dateB - dateA + }) + + const visibleItems = filteredAndSortedItems.slice(0, itemsToShow) + const hasMore = filteredAndSortedItems.length > itemsToShow + + return { visibleItems, hasMore } +} diff --git a/package-lock.json b/package-lock.json index ae725790..c80e0160 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,34 +18,34 @@ "@heroicons/react": "^2.1.1", "@tailwindcss/vite": "^4.1.18", "@types/geojson": "^7946.0.10", - "axios": "^1.13.2", + "axios": "^1.13.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-rnd": "^10.4.1", - "react-router-dom": "^7.11.0", + "react-router-dom": "^7.13.0", "utopia-ui": "^3.0.112", - "vite-tsconfig-paths": "^5.1.4" + "vite-tsconfig-paths": "^6.0.5" }, "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "^4.6.0", "@eslint/js": "^9.36.0", - "@types/node": "^24.10.2", + "@types/node": "^25.2.0", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.0.0", - "daisyui": "^5.5.14", + "daisyui": "^5.5.17", "eslint": "^9.39.2", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import-x": "^4.16.1", "eslint-plugin-json": "^4.0.1", "eslint-plugin-no-catch-all": "^1.1.0", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-promise": "^7.2.1", "eslint-plugin-react": "^7.31.8", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.26", + "eslint-plugin-react-refresh": "^0.5.0", "eslint-plugin-security": "^3.0.1", - "globals": "^17.0.0", + "globals": "^17.3.0", "postcss": "^8.4.30", "tailwindcss": "^4.1.18", "typescript": "^5.9.3", @@ -75,16 +75,16 @@ "@tiptap/react": "^3.15.3", "@tiptap/starter-kit": "^3.15.3", "@tiptap/suggestion": "^3.15.3", - "axios": "^1.13.2", + "axios": "^1.13.4", "browser-image-compression": "^2.0.2", "classnames": "^2.5.1", "leaflet": "^1.9.4", "leaflet.locatecontrol": "^0.79.0", - "maplibre-gl": "^5.16.0", + "maplibre-gl": "^5.17.0", "marked": "^16.4.2", "radash": "^12.1.0", "react-colorful": "^5.6.1", - "react-dropzone": "^14.3.8", + "react-dropzone": "^14.4.0", "react-icons": "^5.5.0", "react-image-crop": "^11.0.10", "react-inlinesvg": "^4.2.0", @@ -107,35 +107,35 @@ "@rollup/plugin-typescript": "^12.3.0", "@tailwindcss/postcss": "^4.1.18", "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.1", + "@testing-library/react": "^16.3.2", "@types/geojson": "^7946.0.14", "@types/leaflet": "^1.9.21", "@types/leaflet.markercluster": "^1.5.5", "@types/react": "^18.2.0", "@types/react-dom": "^18.0.5", "@vitejs/plugin-react": "^4.3.4", - "@vitest/coverage-v8": "^4.0.17", - "cypress": "^15.9.0", - "daisyui": "^5.5.14", + "@vitest/coverage-v8": "^4.0.18", + "cypress": "^15.10.0", + "daisyui": "^5.5.17", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import-x": "^4.16.1", "eslint-plugin-json": "^4.0.1", "eslint-plugin-no-catch-all": "^1.1.0", - "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-promise": "^7.2.1", "eslint-plugin-react": "^7.31.8", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.26", + "eslint-plugin-react-refresh": "^0.5.0", "eslint-plugin-security": "^3.0.1", - "globals": "^17.0.0", - "happy-dom": "^20.1.0", + "globals": "^17.3.0", + "happy-dom": "^20.5.0", "postcss": "^8.4.21", - "prettier": "^3.7.4", + "prettier": "^3.8.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "rollup": "^4.55.1", + "rollup": "^4.57.1", "rollup-plugin-dts": "^6.3.0", "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-svg": "^2.0.0", @@ -2794,6 +2794,12 @@ "node": ">=6.0.0" } }, + "node_modules/@maplibre/geojson-vt": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-5.0.4.tgz", + "integrity": "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==", + "license": "ISC" + }, "node_modules/@maplibre/maplibre-gl-leaflet": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-leaflet/-/maplibre-gl-leaflet-0.1.3.tgz", @@ -2835,16 +2841,16 @@ } }, "node_modules/@maplibre/vt-pbf": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.2.0.tgz", - "integrity": "sha512-bxrk/kQUwWXZgmqYgwOCnZCMONCRi3MJMqJdza4T3E4AeR5i+VyMnaJ8iDWtWxdfEAJRtrzIOeJtxZSy5mFrFA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.2.1.tgz", + "integrity": "sha512-IxZBGq/+9cqf2qdWlFuQ+ZfoMhWpxDUGQZ/poPHOJBvwMUT1GuxLo6HgYTou+xxtsOsjfbcjI8PZaPCtmt97rA==", "license": "MIT", "dependencies": { "@mapbox/point-geometry": "^1.1.0", "@mapbox/vector-tile": "^2.0.4", - "@types/geojson-vt": "3.2.5", + "@maplibre/geojson-vt": "^5.0.4", + "@types/geojson": "^7946.0.16", "@types/supercluster": "^7.1.3", - "geojson-vt": "^4.0.2", "pbf": "^4.0.1", "supercluster": "^8.0.1" } @@ -3052,9 +3058,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", "cpu": [ "arm" ], @@ -3065,9 +3071,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", "cpu": [ "arm64" ], @@ -3078,9 +3084,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], @@ -3091,9 +3097,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", - "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", "cpu": [ "x64" ], @@ -3104,9 +3110,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", "cpu": [ "arm64" ], @@ -3117,9 +3123,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", "cpu": [ "x64" ], @@ -3130,9 +3136,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", "cpu": [ "arm" ], @@ -3143,9 +3149,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", "cpu": [ "arm" ], @@ -3156,9 +3162,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", - "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", "cpu": [ "arm64" ], @@ -3169,9 +3175,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", "cpu": [ "arm64" ], @@ -3182,9 +3188,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", "cpu": [ "loong64" ], @@ -3195,9 +3201,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", "cpu": [ "loong64" ], @@ -3208,9 +3214,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", "cpu": [ "ppc64" ], @@ -3221,9 +3227,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", "cpu": [ "ppc64" ], @@ -3234,9 +3240,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", "cpu": [ "riscv64" ], @@ -3247,9 +3253,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", "cpu": [ "riscv64" ], @@ -3260,9 +3266,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", "cpu": [ "s390x" ], @@ -3273,9 +3279,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", "cpu": [ "x64" ], @@ -3286,9 +3292,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", "cpu": [ "x64" ], @@ -3299,9 +3305,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", "cpu": [ "x64" ], @@ -3312,9 +3318,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", "cpu": [ "arm64" ], @@ -3325,9 +3331,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", - "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", "cpu": [ "arm64" ], @@ -3338,9 +3344,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", "cpu": [ "ia32" ], @@ -3351,9 +3357,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", "cpu": [ "x64" ], @@ -3364,9 +3370,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", - "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", "cpu": [ "x64" ], @@ -4000,9 +4006,9 @@ "license": "MIT" }, "node_modules/@testing-library/react": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.1.tgz", - "integrity": "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==", + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", "dev": true, "license": "MIT", "dependencies": { @@ -4651,15 +4657,6 @@ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "license": "MIT" }, - "node_modules/@types/geojson-vt": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", - "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -4733,9 +4730,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.8.tgz", - "integrity": "sha512-r0bBaXu5Swb05doFYO2kTWHMovJnNVbCsII0fhesM8bNRlLhXIuckley4a2DaD+vOdmm5G+zGkQZAPZsF80+YQ==", + "version": "25.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", + "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5407,14 +5404,14 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.17.tgz", - "integrity": "sha512-/6zU2FLGg0jsd+ePZcwHRy3+WpNTBBhDY56P4JTRqUN/Dp6CvOEa9HrikcQ4KfV2b2kAHUFB4dl1SuocWXSFEw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz", + "integrity": "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.0.17", + "@vitest/utils": "4.0.18", "ast-v8-to-istanbul": "^0.3.10", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", @@ -5428,8 +5425,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.0.17", - "vitest": "4.0.17" + "@vitest/browser": "4.0.18", + "vitest": "4.0.18" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -5438,16 +5435,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" }, @@ -5456,13 +5453,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.17", + "@vitest/spy": "4.0.18", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -5493,9 +5490,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, "license": "MIT", "dependencies": { @@ -5506,13 +5503,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.17", + "@vitest/utils": "4.0.18", "pathe": "^2.0.3" }, "funding": { @@ -5520,13 +5517,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.17", + "@vitest/pretty-format": "4.0.18", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -5535,9 +5532,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, "license": "MIT", "funding": { @@ -5545,13 +5542,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.17", + "@vitest/pretty-format": "4.0.18", "tinyrainbow": "^3.0.3" }, "funding": { @@ -5997,9 +5994,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -6930,9 +6927,9 @@ "license": "MIT" }, "node_modules/cypress": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.9.0.tgz", - "integrity": "sha512-Ks6Bdilz3TtkLZtTQyqYaqtL/WT3X3APKaSLhTV96TmTyudzSjc6EJsJCHmBb7DxO+3R12q3Jkbjgm/iPgmwfg==", + "version": "15.10.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.10.0.tgz", + "integrity": "sha512-OtUh7OMrfEjKoXydlAD1CfG2BvKxIqgWGY4/RMjrqQ3BKGBo5JFKoYNH+Tpcj4xKxWH4XK0Xri+9y8WkxhYbqQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6965,7 +6962,7 @@ "hasha": "5.2.2", "is-installed-globally": "~0.4.0", "listr2": "^3.8.3", - "lodash": "^4.17.21", + "lodash": "^4.17.23", "log-symbols": "^4.0.0", "minimist": "^1.2.8", "ospath": "^1.2.2", @@ -6995,9 +6992,9 @@ "license": "MIT" }, "node_modules/daisyui": { - "version": "5.5.14", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.14.tgz", - "integrity": "sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg==", + "version": "5.5.17", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.17.tgz", + "integrity": "sha512-Y8QWps/990Epp0Gn+7ReeALSXgwrd3W36waokJvHgqUdYx6t2sj0e1krW3+YqviBa57XTJqHJNTt8HMvcODL2Q==", "dev": true, "license": "MIT", "funding": { @@ -8002,13 +7999,13 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", - "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.0.tgz", + "integrity": "sha512-ZYvmh7VfVgqR/7wR71I3Zl6hK/C5CcxdWYKZSpHawS5JCNgE4efhQWg/+/WPpgGAp9Ngp/rRZYyaIwmPQBq/lA==", "dev": true, "license": "MIT", "peerDependencies": { - "eslint": ">=8.40" + "eslint": ">=9" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { @@ -8659,12 +8656,6 @@ "node": ">=6.9.0" } }, - "node_modules/geojson-vt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", - "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", - "license": "ISC" - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -8842,9 +8833,9 @@ } }, "node_modules/globals": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.0.0.tgz", - "integrity": "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.3.0.tgz", + "integrity": "sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==", "dev": true, "license": "MIT", "engines": { @@ -8896,15 +8887,16 @@ "license": "ISC" }, "node_modules/happy-dom": { - "version": "20.3.0", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.3.0.tgz", - "integrity": "sha512-5qJbkqcvR8j/a4av5IWqqIWmEGf9dt6OhGMS6qxCgjSOBGzGa5XLoqg40OyD8XNzQ+g1g2zsXi10kjfpzYH55Q==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.5.0.tgz", + "integrity": "sha512-VQe+Q5CYiGOgcCERXhcfNsbnrN92FDEKciMH/x6LppU9dd0j4aTjCTlqONFOIMcAm/5JxS3+utowbXV1OoFr+g==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "^20.0.0", + "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", + "entities": "^4.5.0", "whatwg-mimetype": "^3.0.0", "ws": "^8.18.3" }, @@ -10566,9 +10558,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "dev": true, "license": "MIT" }, @@ -10801,9 +10793,9 @@ } }, "node_modules/maplibre-gl": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.16.0.tgz", - "integrity": "sha512-/VDY89nr4jgLJyzmhy325cG6VUI02WkZ/UfVuDbG/piXzo6ODnM+omDFIwWY8tsEsBG26DNDmNMn3Y2ikHsBiA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.17.0.tgz", + "integrity": "sha512-gwS6NpXBfWD406dtT5YfEpl2hmpMm+wcPqf04UAez/TxY1OBjiMdK2ZoMGcNIlGHelKc4+Uet6zhDdDEnlJVHA==", "license": "BSD-3-Clause", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", @@ -10813,14 +10805,13 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^2.0.4", "@mapbox/whoots-js": "^3.1.0", + "@maplibre/geojson-vt": "^5.0.4", "@maplibre/maplibre-gl-style-spec": "^24.4.1", "@maplibre/mlt": "^1.1.2", - "@maplibre/vt-pbf": "^4.2.0", + "@maplibre/vt-pbf": "^4.2.1", "@types/geojson": "^7946.0.16", - "@types/geojson-vt": "3.2.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.2", - "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.4", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", @@ -12845,9 +12836,9 @@ } }, "node_modules/prettier": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", - "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", "bin": { @@ -13307,9 +13298,9 @@ } }, "node_modules/react-dropzone": { - "version": "14.3.8", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.8.tgz", - "integrity": "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==", + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.4.0.tgz", + "integrity": "sha512-8VvsHqg9WGAr+wAnP0oVErK5HOwAoTOzRsxLPzbBXrtXtFfukkxMyuvdI/lJ+5OxtsrzmvWE5Eoo3Y4hMsaxpA==", "license": "MIT", "dependencies": { "attr-accept": "^2.2.4", @@ -13492,9 +13483,9 @@ "license": "0BSD" }, "node_modules/react-router": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz", - "integrity": "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.0.tgz", + "integrity": "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -13514,12 +13505,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.12.0.tgz", - "integrity": "sha512-pfO9fiBcpEfX4Tx+iTYKDtPbrSLLCbwJ5EqP+SPYQu1VYCXdy79GSj0wttR0U4cikVdlImZuEZ/9ZNCgoaxwBA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.0.tgz", + "integrity": "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==", "license": "MIT", "dependencies": { - "react-router": "7.12.0" + "react-router": "7.13.0" }, "engines": { "node": ">=20.0.0" @@ -13808,9 +13799,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -13823,31 +13814,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" } }, @@ -15848,9 +15839,9 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", - "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.0.5.tgz", + "integrity": "sha512-f/WvY6ekHykUF1rWJUAbCU7iS/5QYDIugwpqJA+ttwKbxSbzNlqlE8vZSrsnxNQciUW+z6lvhlXMaEyZn9MSig==", "license": "MIT", "dependencies": { "debug": "^4.1.1", @@ -15859,27 +15850,22 @@ }, "peerDependencies": { "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } } }, "node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", @@ -15907,10 +15893,10 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", "happy-dom": "*", "jsdom": "*" },