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 && (
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": "*"
},