diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f7b384c..9205b59 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -24,7 +24,15 @@ jobs:
cache: 'pnpm'
cache-dependency-path: frontend/pnpm-lock.yaml
- run: pnpm install
+ - run: pnpm build
- run: pnpm run test
+ - uses: codecov/codecov-action@v4
+ with:
+ files: ./frontend/coverage/coverage-final.json
+ name: frontend
+ token: ${{ secrets.CODECOV_TOKEN }}
+ fail_ci_if_error: true
+ verbose: true
backend-unit-tests:
runs-on: ubuntu-latest
defaults:
@@ -36,4 +44,11 @@ jobs:
with:
python-version: "3.12"
- run: pip install -e .[tests]
- - run: python -m pytest -sv
+ - run: python -m pytest --cov=mondey_backend --cov-report=xml -svvv
+ - uses: codecov/codecov-action@v4
+ with:
+ files: ./mondey_backend/coverage.xml
+ name: backend
+ token: ${{ secrets.CODECOV_TOKEN }}
+ fail_ci_if_error: true
+ verbose: true
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
new file mode 100644
index 0000000..4f3f492
--- /dev/null
+++ b/.github/workflows/docker.yml
@@ -0,0 +1,40 @@
+name: docker containers
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+concurrency:
+ group: docker-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ docker:
+ runs-on: ubuntu-latest
+ name: "Docker"
+ steps:
+ - uses: actions/checkout@v4
+ - run: docker compose build
+ - uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ - run: |
+ echo $MONDEY_DOCKER_IMAGE_TAG
+ docker compose build
+ docker compose push
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ env:
+ MONDEY_DOCKER_IMAGE_TAG: ${{ github.sha }}
+ - run: |
+ echo $MONDEY_DOCKER_IMAGE_TAG
+ docker compose build
+ docker compose push
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ env:
+ MONDEY_DOCKER_IMAGE_TAG: "latest"
diff --git a/README.md b/README.md
index 6e36273..a74b694 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,15 @@
-# [mondey-frontend-prototype](https://ssciwr.github.io/mondey-frontend-prototype)
+# [mondey](https://ssciwr.github.io/mondey)
+[![run tests](https://github.com/ssciwr/mondey/actions/workflows/ci.yml/badge.svg)](https://github.com/ssciwr/mondey/actions/workflows/ci.yml)
+[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ssciwr_mondey&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=ssciwr_mondey)
+[![codecov](https://codecov.io/gh/ssciwr/mondey/graph/badge.svg?token=1YBO3KUDAR)](https://codecov.io/gh/ssciwr/mondey)
-Initial frontend prototyping for the MONDEY project.
+Initial development for the MONDEY project.
The static website is automatically built and deployed to
-[ssciwr.github.io/mondey-frontend-prototype](https://ssciwr.github.io/mondey-frontend-prototype)
+[ssciwr.github.io/mondey](https://ssciwr.github.io/mondey)
on every push to the main branch using this [Github Action](.github/workflows/deploy.yml).
## Component demos
-- [Milestone](https://ssciwr.github.io/mondey-frontend-prototype/milestone)
-- [Milestonegroup](https://ssciwr.github.io/mondey-frontend-prototype/milestonegroup)
+- [Milestone](https://ssciwr.github.io/mondey/milestone)
+- [Milestonegroup](https://ssciwr.github.io/mondey/milestonegroup)
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..2467dc7
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,34 @@
+services:
+ backend:
+ image: ghcr.io/ssciwr/mondey_backend:${MONDEY_DOCKER_IMAGE_TAG:-latest}
+ build: ./mondey_backend
+ volumes:
+ - ${STATIC_FILES_PATH:-./static}:/app/static
+ - ${DATABASE_PATH:-./db}:/app/db
+ environment:
+ - SECRET=${SECRET:-}
+ - STATIC_FILES_PATH=/app/static
+ - DATABASE_PATH=/app/db
+ - ENABLE_CORS=${ENABLE_CORS:-false}
+ - HOST=${HOST:-backend}
+ - PORT=${PORT:-80}
+ - RELOAD=${RELOAD:-false}
+ - LOG_LEVEL=${LOG_LEVEL:-info}
+ frontend:
+ image: ghcr.io/ssciwr/mondey_frontend:${MONDEY_DOCKER_IMAGE_TAG:-latest}
+ build:
+ context: ./frontend
+ args:
+ - MONDEY_API_URL=/api
+ ports:
+ - "80:80"
+ - "443:443"
+# volumes:
+# - ${MONDEY_SSL_CERT:-./cert.pem}:/MONDEY_ssl_cert.pem
+# - ${MONDEY_SSL_KEY:-./key.pem}:/MONDEY_ssl_key.pem
+# email:
+# image: "boky/postfix"
+# environment:
+# - ALLOW_EMPTY_SENDER_DOMAINS="true"
+# networks:
+# - mondey-network
diff --git a/frontend/.env b/frontend/.env
index 1ea55bf..1b7bbe8 100644
--- a/frontend/.env
+++ b/frontend/.env
@@ -1 +1,2 @@
-VITE_MONDEY_API_URL=http://localhost:8000
+# api location for local development:
+VITE_MONDEY_API_URL=http://localhost:8000/api
diff --git a/frontend/.prettierignore b/frontend/.prettierignore
index ab78a95..70c7521 100644
--- a/frontend/.prettierignore
+++ b/frontend/.prettierignore
@@ -2,3 +2,6 @@
package-lock.json
pnpm-lock.yaml
yarn.lock
+# build artefacts
+.svelte-kit
+build
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
new file mode 100644
index 0000000..d719107
--- /dev/null
+++ b/frontend/Dockerfile
@@ -0,0 +1,22 @@
+FROM node:22-slim AS builder
+
+LABEL org.opencontainers.image.source=https://github.com/ssciwr/mondey
+LABEL org.opencontainers.image.description="MONDEY frontend production image"
+
+ARG MONDEY_API_URL
+
+WORKDIR /app
+
+COPY package*.json ./
+
+RUN npm install -g pnpm && pnpm install
+
+COPY . .
+
+RUN echo "VITE_MONDEY_API_URL=${MONDEY_API_URL}" > .env && pnpm run build
+
+FROM nginx:1.27.1
+
+COPY --from=builder /app/build /usr/share/nginx/html
+
+COPY nginx.conf /etc/nginx/conf.d/default.conf
diff --git a/frontend/README.md b/frontend/README.md
index 9e2c2a9..e8e92ff 100644
--- a/frontend/README.md
+++ b/frontend/README.md
@@ -14,3 +14,5 @@ Initial setup to edit the frontend locally:
To start a development server:
- `pnpm run dev`
+
+This will serve the website at [http://localhost:5173](http://localhost:5173)
diff --git a/frontend/nginx.conf b/frontend/nginx.conf
new file mode 100644
index 0000000..c6db71d
--- /dev/null
+++ b/frontend/nginx.conf
@@ -0,0 +1,48 @@
+server {
+ listen 80;
+# listen 443 ssl;
+# listen [::]:443 ssl;
+ http2 on;
+ server_name localhost;
+# ssl_certificate /ssl_cert.pem;
+# ssl_certificate_key /ssl_key.pem;
+
+ # Maximum file upload size
+ client_max_body_size 20M;
+
+ # Improve HTTPS performance with session resumption
+ ssl_session_cache shared:SSL:10m;
+ ssl_session_timeout 10m;
+
+ # Enable server-side protection against BEAST attacks
+ ssl_protocols TLSv1.2;
+ ssl_prefer_server_ciphers on;
+ ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384";
+
+ # Aditional Security Headers
+ # ref: https://developer.mozilla.org/en-US/docs/Security/HTTP_Strict_Transport_Security
+ add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
+
+ # ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
+ add_header X-Frame-Options DENY always;
+
+ # ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
+ add_header X-Content-Type-Options nosniff always;
+
+ # ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
+ add_header X-Xss-Protection "1; mode=block" always;
+
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ try_files $uri $uri/ /index.html;
+ }
+
+ location /api/ {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_redirect off;
+ proxy_pass http://backend:80;
+ }
+}
diff --git a/frontend/package.json b/frontend/package.json
index 51aeeb6..418495b 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -8,40 +8,42 @@
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
- "test": "vitest",
+ "test": "vitest --coverage",
"lint": "prettier --check . && eslint .",
"format": "prettier --write ."
},
"devDependencies": {
- "@sveltejs/adapter-auto": "^3.0.0",
- "@sveltejs/adapter-static": "^3.0.4",
- "@sveltejs/kit": "^2.5.25",
+ "@sveltejs/adapter-auto": "^3.2.5",
+ "@sveltejs/adapter-static": "^3.0.5",
+ "@sveltejs/kit": "^2.5.28",
"@sveltejs/vite-plugin-svelte": "^3.1.2",
"@tailwindcss/typography": "^0.5.15",
"@testing-library/svelte": "^5.2.1",
"@types/eslint": "^9.6.1",
+ "@vitest/coverage-v8": "^2.1.1",
"autoprefixer": "^10.4.20",
- "eslint": "^9.9.1",
+ "eslint": "^9.11.1",
"eslint-config-prettier": "^9.1.0",
- "eslint-plugin-svelte": "^2.36.0",
+ "eslint-plugin-svelte": "^2.44.0",
"flowbite": "^2.5.1",
- "flowbite-svelte": "^0.46.15",
+ "flowbite-svelte": "^0.46.17",
"flowbite-svelte-icons": "^1.6.1",
- "globals": "^15.0.0",
- "jsdom": "^25.0.0",
- "prettier": "^3.1.1",
- "prettier-plugin-svelte": "^3.1.2",
- "prettier-plugin-tailwindcss": "^0.6.5",
+ "globals": "^15.9.0",
+ "jsdom": "^25.0.1",
+ "prettier": "^3.3.3",
+ "prettier-plugin-svelte": "^3.2.6",
+ "prettier-plugin-tailwindcss": "^0.6.6",
"svelte": "^4.2.19",
"svelte-check": "^3.8.6",
- "tailwindcss": "^3.4.9",
- "typescript": "^5.0.0",
- "typescript-eslint": "^8.3.0",
- "vite": "^5.4.2",
- "vitest": "^2.0.0"
+ "tailwindcss": "^3.4.13",
+ "typescript": "^5.6.2",
+ "typescript-eslint": "^8.7.0",
+ "vite": "^5.4.7",
+ "vitest": "^2.1.1"
},
"type": "module",
"dependencies": {
+ "iso-639-1": "3.1.3",
"svelte-i18n": "^4.0.0"
}
}
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index baadadd..d91f9c3 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -8,88 +8,94 @@ importers:
.:
dependencies:
+ iso-639-1:
+ specifier: 3.1.3
+ version: 3.1.3
svelte-i18n:
specifier: ^4.0.0
version: 4.0.0(svelte@4.2.19)
devDependencies:
'@sveltejs/adapter-auto':
- specifier: ^3.0.0
- version: 3.2.4(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2))
+ specifier: ^3.2.5
+ version: 3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7))
'@sveltejs/adapter-static':
- specifier: ^3.0.4
- version: 3.0.4(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2))
+ specifier: ^3.0.5
+ version: 3.0.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7))
'@sveltejs/kit':
- specifier: ^2.5.25
- version: 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2)
+ specifier: ^2.5.28
+ version: 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7)
'@sveltejs/vite-plugin-svelte':
specifier: ^3.1.2
- version: 3.1.2(svelte@4.2.19)(vite@5.4.2)
+ version: 3.1.2(svelte@4.2.19)(vite@5.4.7)
'@tailwindcss/typography':
specifier: ^0.5.15
- version: 0.5.15(tailwindcss@3.4.10)
+ version: 0.5.15(tailwindcss@3.4.13)
'@testing-library/svelte':
specifier: ^5.2.1
- version: 5.2.1(svelte@4.2.19)(vite@5.4.2)(vitest@2.0.5(jsdom@25.0.0))
+ version: 5.2.1(svelte@4.2.19)(vite@5.4.7)(vitest@2.1.1(jsdom@25.0.1))
'@types/eslint':
specifier: ^9.6.1
version: 9.6.1
+ '@vitest/coverage-v8':
+ specifier: ^2.1.1
+ version: 2.1.1(vitest@2.1.1(jsdom@25.0.1))
autoprefixer:
specifier: ^10.4.20
- version: 10.4.20(postcss@8.4.41)
+ version: 10.4.20(postcss@8.4.47)
eslint:
- specifier: ^9.9.1
- version: 9.9.1(jiti@1.21.6)
+ specifier: ^9.11.1
+ version: 9.11.1(jiti@1.21.6)
eslint-config-prettier:
specifier: ^9.1.0
- version: 9.1.0(eslint@9.9.1(jiti@1.21.6))
+ version: 9.1.0(eslint@9.11.1(jiti@1.21.6))
eslint-plugin-svelte:
- specifier: ^2.36.0
- version: 2.43.0(eslint@9.9.1(jiti@1.21.6))(svelte@4.2.19)
+ specifier: ^2.44.0
+ version: 2.44.0(eslint@9.11.1(jiti@1.21.6))(svelte@4.2.19)
flowbite:
specifier: ^2.5.1
- version: 2.5.1(rollup@4.21.2)
+ version: 2.5.1(rollup@4.22.4)
flowbite-svelte:
- specifier: ^0.46.15
- version: 0.46.15(rollup@4.21.2)(svelte@4.2.19)
+ specifier: ^0.46.17
+ version: 0.46.17(rollup@4.22.4)(svelte@4.2.19)
flowbite-svelte-icons:
specifier: ^1.6.1
- version: 1.6.1(svelte@4.2.19)(tailwind-merge@2.5.2)(tailwindcss@3.4.10)
+ version: 1.6.1(svelte@4.2.19)(tailwind-merge@2.5.2)(tailwindcss@3.4.13)
globals:
- specifier: ^15.0.0
+ specifier: ^15.9.0
version: 15.9.0
jsdom:
- specifier: ^25.0.0
- version: 25.0.0
+ specifier: ^25.0.1
+ version: 25.0.1
prettier:
- specifier: ^3.1.1
+ specifier: ^3.3.3
version: 3.3.3
prettier-plugin-svelte:
- specifier: ^3.1.2
+ specifier: ^3.2.6
version: 3.2.6(prettier@3.3.3)(svelte@4.2.19)
prettier-plugin-tailwindcss:
- specifier: ^0.6.5
+ specifier: ^0.6.6
version: 0.6.6(prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@4.2.19))(prettier@3.3.3)
svelte:
specifier: ^4.2.19
version: 4.2.19
svelte-check:
specifier: ^3.8.6
- version: 3.8.6(postcss-load-config@4.0.2(postcss@8.4.41))(postcss@8.4.41)(svelte@4.2.19)
+ version: 3.8.6(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)
tailwindcss:
- specifier: ^3.4.9
- version: 3.4.10
+ specifier: ^3.4.13
+ version: 3.4.13
typescript:
- specifier: ^5.0.0
- version: 5.5.4
+ specifier: ^5.6.2
+ version: 5.6.2
typescript-eslint:
- specifier: ^8.3.0
- version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)
+ specifier: ^8.7.0
+ version: 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
vite:
- specifier: ^5.4.2
- version: 5.4.2
+ specifier: ^5.4.7
+ version: 5.4.7
vitest:
- specifier: ^2.0.0
- version: 2.0.5(jsdom@25.0.0)
+ specifier: ^2.1.1
+ version: 2.1.1(jsdom@25.0.1)
packages:
@@ -105,6 +111,10 @@ packages:
resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-string-parser@7.24.8':
+ resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-identifier@7.24.7':
resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
engines: {node: '>=6.9.0'}
@@ -113,10 +123,22 @@ packages:
resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
engines: {node: '>=6.9.0'}
- '@babel/runtime@7.25.4':
- resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==}
+ '@babel/parser@7.25.6':
+ resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/runtime@7.25.6':
+ resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.25.6':
+ resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==}
engines: {node: '>=6.9.0'}
+ '@bcoe/v8-coverage@0.2.3':
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+
'@esbuild/aix-ppc64@0.19.12':
resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
engines: {node: '>=12'}
@@ -399,34 +421,42 @@ packages:
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@eslint-community/regexpp@4.11.0':
- resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
+ '@eslint-community/regexpp@4.11.1':
+ resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/config-array@0.18.0':
resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@eslint/core@0.6.0':
+ resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@eslint/eslintrc@3.1.0':
resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@9.9.1':
- resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==}
+ '@eslint/js@9.11.1':
+ resolution: {integrity: sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.4':
resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@floating-ui/core@1.6.7':
- resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==}
+ '@eslint/plugin-kit@0.2.0':
+ resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@floating-ui/dom@1.6.10':
- resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==}
+ '@floating-ui/core@1.6.8':
+ resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
- '@floating-ui/utils@0.2.7':
- resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==}
+ '@floating-ui/dom@1.6.11':
+ resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==}
+
+ '@floating-ui/utils@0.2.8':
+ resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
'@formatjs/ecma402-abstract@2.0.0':
resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==}
@@ -455,6 +485,10 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
+ '@istanbuljs/schema@0.1.3':
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+
'@jridgewell/gen-mapping@0.3.5':
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
@@ -489,14 +523,14 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
- '@polka/url@1.0.0-next.25':
- resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
+ '@polka/url@1.0.0-next.28':
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
'@popperjs/core@2.11.8':
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
- '@rollup/plugin-node-resolve@15.2.3':
- resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==}
+ '@rollup/plugin-node-resolve@15.3.0':
+ resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^2.78.0||^3.0.0||^4.0.0
@@ -504,8 +538,8 @@ packages:
rollup:
optional: true
- '@rollup/pluginutils@5.1.0':
- resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
+ '@rollup/pluginutils@5.1.2':
+ resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
@@ -513,98 +547,98 @@ packages:
rollup:
optional: true
- '@rollup/rollup-android-arm-eabi@4.21.2':
- resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==}
+ '@rollup/rollup-android-arm-eabi@4.22.4':
+ resolution: {integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.21.2':
- resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==}
+ '@rollup/rollup-android-arm64@4.22.4':
+ resolution: {integrity: sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.21.2':
- resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==}
+ '@rollup/rollup-darwin-arm64@4.22.4':
+ resolution: {integrity: sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.21.2':
- resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==}
+ '@rollup/rollup-darwin-x64@4.22.4':
+ resolution: {integrity: sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-linux-arm-gnueabihf@4.21.2':
- resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.22.4':
+ resolution: {integrity: sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.21.2':
- resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==}
+ '@rollup/rollup-linux-arm-musleabihf@4.22.4':
+ resolution: {integrity: sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.21.2':
- resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==}
+ '@rollup/rollup-linux-arm64-gnu@4.22.4':
+ resolution: {integrity: sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.21.2':
- resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==}
+ '@rollup/rollup-linux-arm64-musl@4.22.4':
+ resolution: {integrity: sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-powerpc64le-gnu@4.21.2':
- resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==}
+ '@rollup/rollup-linux-powerpc64le-gnu@4.22.4':
+ resolution: {integrity: sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.21.2':
- resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==}
+ '@rollup/rollup-linux-riscv64-gnu@4.22.4':
+ resolution: {integrity: sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.21.2':
- resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==}
+ '@rollup/rollup-linux-s390x-gnu@4.22.4':
+ resolution: {integrity: sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.21.2':
- resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==}
+ '@rollup/rollup-linux-x64-gnu@4.22.4':
+ resolution: {integrity: sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.21.2':
- resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==}
+ '@rollup/rollup-linux-x64-musl@4.22.4':
+ resolution: {integrity: sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-win32-arm64-msvc@4.21.2':
- resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==}
+ '@rollup/rollup-win32-arm64-msvc@4.22.4':
+ resolution: {integrity: sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.21.2':
- resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==}
+ '@rollup/rollup-win32-ia32-msvc@4.22.4':
+ resolution: {integrity: sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.21.2':
- resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==}
+ '@rollup/rollup-win32-x64-msvc@4.22.4':
+ resolution: {integrity: sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==}
cpu: [x64]
os: [win32]
- '@sveltejs/adapter-auto@3.2.4':
- resolution: {integrity: sha512-a64AKYbfTUrVwU0xslzv1Jf3M8bj0IwhptaXmhgIkjXspBXhD0od9JiItQHchijpLMGdEDcYBlvqySkEawv6mQ==}
+ '@sveltejs/adapter-auto@3.2.5':
+ resolution: {integrity: sha512-27LR+uKccZ62lgq4N/hvyU2G+hTP9fxWEAfnZcl70HnyfAjMSsGk1z/SjAPXNCD1mVJIE7IFu3TQ8cQ/UH3c0A==}
peerDependencies:
'@sveltejs/kit': ^2.0.0
- '@sveltejs/adapter-static@3.0.4':
- resolution: {integrity: sha512-Qm4GAHCnRXwfWG9/AtnQ7mqjyjTs7i0Opyb8H2KH9rMR7fLxqiPx/tXeoE6HHo66+72CjyOb4nFH3lrejY4vzA==}
+ '@sveltejs/adapter-static@3.0.5':
+ resolution: {integrity: sha512-kFJR7RxeB6FBvrKZWAEzIALatgy11ISaaZbcPup8JdWUdrmmfUHHTJ738YHJTEfnCiiXi6aX8Q6ePY7tnSMD6Q==}
peerDependencies:
'@sveltejs/kit': ^2.0.0
- '@sveltejs/kit@2.5.25':
- resolution: {integrity: sha512-5hBSEN8XEjDZ5+2bHkFh8Z0QyOk0C187cyb12aANe1c8aeKbfu5ZD5XaC2vEH4h0alJFDXPdUkXQBmeeXeMr1A==}
+ '@sveltejs/kit@2.5.28':
+ resolution: {integrity: sha512-/O7pvFGBsQPcFa9UrW8eUC5uHTOXLsUp3SN0dY6YmRAL9nfPSrJsSJk//j5vMpinSshzUjteAFcfQTU+04Ka1w==}
engines: {node: '>=18.13'}
hasBin: true
peerDependencies:
@@ -661,6 +695,9 @@ packages:
'@types/estree@1.0.5':
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -670,8 +707,8 @@ packages:
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
- '@typescript-eslint/eslint-plugin@8.3.0':
- resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==}
+ '@typescript-eslint/eslint-plugin@8.7.0':
+ resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@@ -681,8 +718,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/parser@8.3.0':
- resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==}
+ '@typescript-eslint/parser@8.7.0':
+ resolution: {integrity: sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -691,12 +728,12 @@ packages:
typescript:
optional: true
- '@typescript-eslint/scope-manager@8.3.0':
- resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==}
+ '@typescript-eslint/scope-manager@8.7.0':
+ resolution: {integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/type-utils@8.3.0':
- resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==}
+ '@typescript-eslint/type-utils@8.7.0':
+ resolution: {integrity: sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@@ -704,12 +741,12 @@ packages:
typescript:
optional: true
- '@typescript-eslint/types@8.3.0':
- resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==}
+ '@typescript-eslint/types@8.7.0':
+ resolution: {integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.3.0':
- resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==}
+ '@typescript-eslint/typescript-estree@8.7.0':
+ resolution: {integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@@ -717,33 +754,54 @@ packages:
typescript:
optional: true
- '@typescript-eslint/utils@8.3.0':
- resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==}
+ '@typescript-eslint/utils@8.7.0':
+ resolution: {integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
- '@typescript-eslint/visitor-keys@8.3.0':
- resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==}
+ '@typescript-eslint/visitor-keys@8.7.0':
+ resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@vitest/expect@2.0.5':
- resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==}
+ '@vitest/coverage-v8@2.1.1':
+ resolution: {integrity: sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==}
+ peerDependencies:
+ '@vitest/browser': 2.1.1
+ vitest: 2.1.1
+ peerDependenciesMeta:
+ '@vitest/browser':
+ optional: true
- '@vitest/pretty-format@2.0.5':
- resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==}
+ '@vitest/expect@2.1.1':
+ resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==}
- '@vitest/runner@2.0.5':
- resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==}
+ '@vitest/mocker@2.1.1':
+ resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==}
+ peerDependencies:
+ '@vitest/spy': 2.1.1
+ msw: ^2.3.5
+ vite: ^5.0.0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
- '@vitest/snapshot@2.0.5':
- resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==}
+ '@vitest/pretty-format@2.1.1':
+ resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==}
- '@vitest/spy@2.0.5':
- resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
+ '@vitest/runner@2.1.1':
+ resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==}
- '@vitest/utils@2.0.5':
- resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
+ '@vitest/snapshot@2.1.1':
+ resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==}
+
+ '@vitest/spy@2.1.1':
+ resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==}
+
+ '@vitest/utils@2.1.1':
+ resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==}
'@yr/monotone-cubic-spline@1.0.3':
resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==}
@@ -769,8 +827,8 @@ packages:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
- ansi-regex@6.0.1:
- resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
engines: {node: '>=12'}
ansi-styles@3.2.1:
@@ -796,8 +854,8 @@ packages:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
- apexcharts@3.52.0:
- resolution: {integrity: sha512-7dg0ADKs8AA89iYMZMe2sFDG0XK5PfqllKV9N+i3hKHm3vEtdhwz8AlXGm+/b0nJ6jKiaXsqci5LfVxNhtB+dA==}
+ apexcharts@3.53.0:
+ resolution: {integrity: sha512-QESZHZY3w9LPQ64PGh1gEdfjYjJ5Jp+Dfy0D/CLjsLOPTpXzdxwlNMqRj+vPbTcP0nAHgjWv1maDqcEq6u5olw==}
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
@@ -808,6 +866,10 @@ packages:
aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
@@ -852,10 +914,6 @@ packages:
resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
engines: {node: '>=8.0.0'}
- builtin-modules@3.3.0:
- resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
- engines: {node: '>=6'}
-
cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
@@ -868,8 +926,8 @@ packages:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
- caniuse-lite@1.0.30001651:
- resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==}
+ caniuse-lite@1.0.30001663:
+ resolution: {integrity: sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==}
chai@5.1.1:
resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
@@ -939,8 +997,8 @@ packages:
engines: {node: '>=4'}
hasBin: true
- cssstyle@4.0.1:
- resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
+ cssstyle@4.1.0:
+ resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
engines: {node: '>=18'}
d@1.0.2:
@@ -951,8 +1009,8 @@ packages:
resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
engines: {node: '>=18'}
- debug@4.3.6:
- resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==}
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
@@ -1001,8 +1059,8 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
- electron-to-chromium@1.5.11:
- resolution: {integrity: sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==}
+ electron-to-chromium@1.5.28:
+ resolution: {integrity: sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -1041,8 +1099,8 @@ packages:
engines: {node: '>=12'}
hasBin: true
- escalade@3.1.2:
- resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
escape-string-regexp@1.0.5:
@@ -1065,8 +1123,8 @@ packages:
peerDependencies:
eslint: '>=7.0.0'
- eslint-plugin-svelte@2.43.0:
- resolution: {integrity: sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==}
+ eslint-plugin-svelte@2.44.0:
+ resolution: {integrity: sha512-wav4MOs02vBb1WjvTCYItwJCxMkuk2Z4p+K/eyjL0N/z7ahXLP+0LtQQjiKc2ezuif7GnZLbD1F3o1VHzSvdVg==}
engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0
@@ -1091,8 +1149,8 @@ packages:
resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@9.9.1:
- resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==}
+ eslint@9.11.1:
+ resolution: {integrity: sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -1141,10 +1199,6 @@ packages:
event-emitter@0.3.5:
resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
- execa@8.0.1:
- resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
- engines: {node: '>=16.17'}
-
ext@1.7.0:
resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
@@ -1193,8 +1247,8 @@ packages:
tailwind-merge: ^2.0.0
tailwindcss: ^3.3.2
- flowbite-svelte@0.46.15:
- resolution: {integrity: sha512-xWhyLDez/gafTAmQayPMPKmWj1BAoq80SoA48yHZ12Wk3Vu3hFrELLUZf0UksxnjQL9hMOKRUlYl3/IH6pHwnQ==}
+ flowbite-svelte@0.46.17:
+ resolution: {integrity: sha512-NueTRkYw7Alk6DAqcEZIOXmqsdhNNjg+LxAb2wfzd/LAJML6I0kpbOJkv2cIojkLB90Er+nrEs0zMgmxrY/gfA==}
engines: {node: '>=18.0.0', pnpm: '>=8.0.0'}
peerDependencies:
svelte: ^3.55.1 || ^4.0.0 || ^5.0.0
@@ -1227,10 +1281,6 @@ packages:
get-func-name@2.0.2:
resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
- get-stream@8.0.1:
- resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
- engines: {node: '>=16'}
-
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -1283,6 +1333,9 @@ packages:
resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
engines: {node: '>=18'}
+ html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
@@ -1291,10 +1344,6 @@ packages:
resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
engines: {node: '>= 14'}
- human-signals@5.0.0:
- resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
- engines: {node: '>=16.17.0'}
-
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
@@ -1328,12 +1377,8 @@ packages:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
- is-builtin-module@3.2.1:
- resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
- engines: {node: '>=6'}
-
- is-core-module@2.15.0:
- resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==}
+ is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
engines: {node: '>= 0.4'}
is-extglob@2.1.1:
@@ -1368,13 +1413,29 @@ packages:
is-reference@3.0.2:
resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
- is-stream@3.0.0:
- resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ iso-639-1@3.1.3:
+ resolution: {integrity: sha512-1jz0Wh9hyLMRwqEPchb/KZCiTqfFWtc9R3nm7GHPygBAKS8wdKJ3FH4lvLsri6UtAE5Kz5SnowtXZa//6bqMyw==}
+ engines: {node: '>=6.0'}
+
+ istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-report@3.0.1:
+ resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+ engines: {node: '>=10'}
+
+ istanbul-lib-source-maps@5.0.6:
+ resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
+ engines: {node: '>=10'}
+
+ istanbul-reports@3.1.7:
+ resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+ engines: {node: '>=8'}
+
jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
@@ -1389,8 +1450,8 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
- jsdom@25.0.0:
- resolution: {integrity: sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ==}
+ jsdom@25.0.1:
+ resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==}
engines: {node: '>=18'}
peerDependencies:
canvas: ^2.11.2
@@ -1464,6 +1525,13 @@ packages:
magic-string@0.30.11:
resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
+ magicast@0.3.5:
+ resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
+
+ make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+
mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
@@ -1471,15 +1539,12 @@ packages:
resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==}
engines: {node: '>=0.12'}
- merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
-
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
- micromatch@4.0.7:
- resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
mime-db@1.52.0:
@@ -1490,10 +1555,6 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
- mimic-fn@4.0.0:
- resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
- engines: {node: '>=12'}
-
min-indent@1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
@@ -1528,8 +1589,8 @@ packages:
resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
engines: {node: '>=10'}
- ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
@@ -1556,10 +1617,6 @@ packages:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
- npm-run-path@5.3.0:
- resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
nwsapi@2.2.12:
resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==}
@@ -1574,10 +1631,6 @@ packages:
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
- onetime@6.0.0:
- resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
- engines: {node: '>=12'}
-
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
@@ -1612,10 +1665,6 @@ packages:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
- path-key@4.0.0:
- resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
- engines: {node: '>=12'}
-
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
@@ -1633,8 +1682,8 @@ packages:
periscopic@3.1.0:
resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
- picocolors@1.0.1:
- resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ picocolors@1.1.0:
+ resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -1713,12 +1762,8 @@ packages:
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- postcss@8.4.41:
- resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
- engines: {node: ^10 || ^12 || >=14}
-
- postcss@8.4.42:
- resolution: {integrity: sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==}
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
@@ -1795,16 +1840,10 @@ packages:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
- psl@1.9.0:
- resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
-
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
- querystringify@2.2.0:
- resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
-
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -1821,9 +1860,6 @@ packages:
regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
- requires-port@1.0.0:
- resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
-
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -1841,14 +1877,11 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
- rollup@4.21.2:
- resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==}
+ rollup@4.22.4:
+ resolution: {integrity: sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
- rrweb-cssom@0.6.0:
- resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
-
rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
@@ -1900,8 +1933,8 @@ packages:
resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==}
hasBin: true
- source-map-js@1.2.0:
- resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
stackback@0.0.2:
@@ -1926,10 +1959,6 @@ packages:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
- strip-final-newline@3.0.0:
- resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
- engines: {node: '>=12'}
-
strip-indent@3.0.0:
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
engines: {node: '>=8'}
@@ -1961,8 +1990,8 @@ packages:
peerDependencies:
svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
- svelte-eslint-parser@0.41.0:
- resolution: {integrity: sha512-L6f4hOL+AbgfBIB52Z310pg1d2QjRqm7wy3kI1W6hhdhX5bvu7+f0R6w4ykp5HoDdzq+vGhIJmsisaiJDGmVfA==}
+ svelte-eslint-parser@0.41.1:
+ resolution: {integrity: sha512-08ndI6zTghzI8SuJAFpvMbA/haPSGn3xz19pjre19yYMw8Nw/wQJ2PrZBI/L8ijGTgtkWCQQiLLy+Z1tfaCwNA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191
@@ -2061,11 +2090,15 @@ packages:
tailwind-merge@2.5.2:
resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==}
- tailwindcss@3.4.10:
- resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==}
+ tailwindcss@3.4.13:
+ resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==}
engines: {node: '>=14.0.0'}
hasBin: true
+ test-exclude@7.0.1:
+ resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==}
+ engines: {node: '>=18'}
+
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
@@ -2086,6 +2119,9 @@ packages:
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+ tinyexec@0.3.0:
+ resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==}
+
tinypool@1.0.1:
resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -2094,10 +2130,21 @@ packages:
resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
engines: {node: '>=14.0.0'}
- tinyspy@3.0.0:
- resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==}
+ tinyspy@3.0.2:
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
engines: {node: '>=14.0.0'}
+ tldts-core@6.1.47:
+ resolution: {integrity: sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==}
+
+ tldts@6.1.47:
+ resolution: {integrity: sha512-R/K2tZ5MiY+mVrnSkNJkwqYT2vUv1lcT6wJvd2emGaMJ7PHUGRY4e3tUsdFCXgqxi2QgbHjL3yJgXCo40v9Hxw==}
+ hasBin: true
+
+ to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -2106,9 +2153,9 @@ packages:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
- tough-cookie@4.1.4:
- resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
- engines: {node: '>=6'}
+ tough-cookie@5.0.0:
+ resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==}
+ engines: {node: '>=16'}
tr46@5.0.0:
resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
@@ -2133,8 +2180,8 @@ packages:
type@2.7.3:
resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
- typescript-eslint@8.3.0:
- resolution: {integrity: sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==}
+ typescript-eslint@8.7.0:
+ resolution: {integrity: sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@@ -2142,15 +2189,11 @@ packages:
typescript:
optional: true
- typescript@5.5.4:
- resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==}
+ typescript@5.6.2:
+ resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==}
engines: {node: '>=14.17'}
hasBin: true
- universalify@0.2.0:
- resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
- engines: {node: '>= 4.0.0'}
-
update-browserslist-db@1.1.0:
resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
hasBin: true
@@ -2160,19 +2203,16 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
- url-parse@1.5.10:
- resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
-
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- vite-node@2.0.5:
- resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==}
+ vite-node@2.1.1:
+ resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
- vite@5.4.2:
- resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
+ vite@5.4.7:
+ resolution: {integrity: sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -2210,15 +2250,15 @@ packages:
vite:
optional: true
- vitest@2.0.5:
- resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==}
+ vitest@2.1.1:
+ resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/node': ^18.0.0 || >=20.0.0
- '@vitest/browser': 2.0.5
- '@vitest/ui': 2.0.5
+ '@vitest/browser': 2.1.1
+ '@vitest/ui': 2.1.1
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
@@ -2303,8 +2343,8 @@ packages:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
- yaml@2.5.0:
- resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==}
+ yaml@2.5.1:
+ resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==}
engines: {node: '>= 14'}
hasBin: true
@@ -2324,7 +2364,9 @@ snapshots:
'@babel/code-frame@7.24.7':
dependencies:
'@babel/highlight': 7.24.7
- picocolors: 1.0.1
+ picocolors: 1.1.0
+
+ '@babel/helper-string-parser@7.24.8': {}
'@babel/helper-validator-identifier@7.24.7': {}
@@ -2333,12 +2375,24 @@ snapshots:
'@babel/helper-validator-identifier': 7.24.7
chalk: 2.4.2
js-tokens: 4.0.0
- picocolors: 1.0.1
+ picocolors: 1.1.0
+
+ '@babel/parser@7.25.6':
+ dependencies:
+ '@babel/types': 7.25.6
- '@babel/runtime@7.25.4':
+ '@babel/runtime@7.25.6':
dependencies:
regenerator-runtime: 0.14.1
+ '@babel/types@7.25.6':
+ dependencies:
+ '@babel/helper-string-parser': 7.24.8
+ '@babel/helper-validator-identifier': 7.24.7
+ to-fast-properties: 2.0.0
+
+ '@bcoe/v8-coverage@0.2.3': {}
+
'@esbuild/aix-ppc64@0.19.12':
optional: true
@@ -2477,25 +2531,27 @@ snapshots:
'@esbuild/win32-x64@0.21.5':
optional: true
- '@eslint-community/eslint-utils@4.4.0(eslint@9.9.1(jiti@1.21.6))':
+ '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1(jiti@1.21.6))':
dependencies:
- eslint: 9.9.1(jiti@1.21.6)
+ eslint: 9.11.1(jiti@1.21.6)
eslint-visitor-keys: 3.4.3
- '@eslint-community/regexpp@4.11.0': {}
+ '@eslint-community/regexpp@4.11.1': {}
'@eslint/config-array@0.18.0':
dependencies:
'@eslint/object-schema': 2.1.4
- debug: 4.3.6
+ debug: 4.3.7
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
+ '@eslint/core@0.6.0': {}
+
'@eslint/eslintrc@3.1.0':
dependencies:
ajv: 6.12.6
- debug: 4.3.6
+ debug: 4.3.7
espree: 10.1.0
globals: 14.0.0
ignore: 5.3.2
@@ -2506,20 +2562,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.9.1': {}
+ '@eslint/js@9.11.1': {}
'@eslint/object-schema@2.1.4': {}
- '@floating-ui/core@1.6.7':
+ '@eslint/plugin-kit@0.2.0':
dependencies:
- '@floating-ui/utils': 0.2.7
+ levn: 0.4.1
+
+ '@floating-ui/core@1.6.8':
+ dependencies:
+ '@floating-ui/utils': 0.2.8
- '@floating-ui/dom@1.6.10':
+ '@floating-ui/dom@1.6.11':
dependencies:
- '@floating-ui/core': 1.6.7
- '@floating-ui/utils': 0.2.7
+ '@floating-ui/core': 1.6.8
+ '@floating-ui/utils': 0.2.8
- '@floating-ui/utils@0.2.7': {}
+ '@floating-ui/utils@0.2.8': {}
'@formatjs/ecma402-abstract@2.0.0':
dependencies:
@@ -2558,6 +2618,8 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
+ '@istanbuljs/schema@0.1.3': {}
+
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1
@@ -2590,89 +2652,88 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
- '@polka/url@1.0.0-next.25': {}
+ '@polka/url@1.0.0-next.28': {}
'@popperjs/core@2.11.8': {}
- '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.2)':
+ '@rollup/plugin-node-resolve@15.3.0(rollup@4.22.4)':
dependencies:
- '@rollup/pluginutils': 5.1.0(rollup@4.21.2)
+ '@rollup/pluginutils': 5.1.2(rollup@4.22.4)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
- is-builtin-module: 3.2.1
is-module: 1.0.0
resolve: 1.22.8
optionalDependencies:
- rollup: 4.21.2
+ rollup: 4.22.4
- '@rollup/pluginutils@5.1.0(rollup@4.21.2)':
+ '@rollup/pluginutils@5.1.2(rollup@4.22.4)':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 2.3.1
optionalDependencies:
- rollup: 4.21.2
+ rollup: 4.22.4
- '@rollup/rollup-android-arm-eabi@4.21.2':
+ '@rollup/rollup-android-arm-eabi@4.22.4':
optional: true
- '@rollup/rollup-android-arm64@4.21.2':
+ '@rollup/rollup-android-arm64@4.22.4':
optional: true
- '@rollup/rollup-darwin-arm64@4.21.2':
+ '@rollup/rollup-darwin-arm64@4.22.4':
optional: true
- '@rollup/rollup-darwin-x64@4.21.2':
+ '@rollup/rollup-darwin-x64@4.22.4':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.21.2':
+ '@rollup/rollup-linux-arm-gnueabihf@4.22.4':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.21.2':
+ '@rollup/rollup-linux-arm-musleabihf@4.22.4':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.21.2':
+ '@rollup/rollup-linux-arm64-gnu@4.22.4':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.21.2':
+ '@rollup/rollup-linux-arm64-musl@4.22.4':
optional: true
- '@rollup/rollup-linux-powerpc64le-gnu@4.21.2':
+ '@rollup/rollup-linux-powerpc64le-gnu@4.22.4':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.21.2':
+ '@rollup/rollup-linux-riscv64-gnu@4.22.4':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.21.2':
+ '@rollup/rollup-linux-s390x-gnu@4.22.4':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.21.2':
+ '@rollup/rollup-linux-x64-gnu@4.22.4':
optional: true
- '@rollup/rollup-linux-x64-musl@4.21.2':
+ '@rollup/rollup-linux-x64-musl@4.22.4':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.21.2':
+ '@rollup/rollup-win32-arm64-msvc@4.22.4':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.21.2':
+ '@rollup/rollup-win32-ia32-msvc@4.22.4':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.21.2':
+ '@rollup/rollup-win32-x64-msvc@4.22.4':
optional: true
- '@sveltejs/adapter-auto@3.2.4(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2))':
+ '@sveltejs/adapter-auto@3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7))':
dependencies:
- '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2)
+ '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7)
import-meta-resolve: 4.1.0
- '@sveltejs/adapter-static@3.0.4(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2))':
+ '@sveltejs/adapter-static@3.0.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7))':
dependencies:
- '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2)
+ '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7)
- '@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2)':
+ '@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7)':
dependencies:
- '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.2)
+ '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.7)
'@types/cookie': 0.6.0
cookie: 0.6.0
devalue: 5.0.0
@@ -2686,43 +2747,43 @@ snapshots:
sirv: 2.0.4
svelte: 4.2.19
tiny-glob: 0.2.9
- vite: 5.4.2
+ vite: 5.4.7
- '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2)':
+ '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7)':
dependencies:
- '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.2)
- debug: 4.3.6
+ '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.7)
+ debug: 4.3.7
svelte: 4.2.19
- vite: 5.4.2
+ vite: 5.4.7
transitivePeerDependencies:
- supports-color
- '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2)':
+ '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7)':
dependencies:
- '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2))(svelte@4.2.19)(vite@5.4.2)
- debug: 4.3.6
+ '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7))(svelte@4.2.19)(vite@5.4.7)
+ debug: 4.3.7
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.11
svelte: 4.2.19
svelte-hmr: 0.16.0(svelte@4.2.19)
- vite: 5.4.2
- vitefu: 0.2.5(vite@5.4.2)
+ vite: 5.4.7
+ vitefu: 0.2.5(vite@5.4.7)
transitivePeerDependencies:
- supports-color
- '@tailwindcss/typography@0.5.15(tailwindcss@3.4.10)':
+ '@tailwindcss/typography@0.5.15(tailwindcss@3.4.13)':
dependencies:
lodash.castarray: 4.4.0
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
postcss-selector-parser: 6.0.10
- tailwindcss: 3.4.10
+ tailwindcss: 3.4.13
'@testing-library/dom@10.4.0':
dependencies:
'@babel/code-frame': 7.24.7
- '@babel/runtime': 7.25.4
+ '@babel/runtime': 7.25.6
'@types/aria-query': 5.0.4
aria-query: 5.3.0
chalk: 4.1.2
@@ -2730,13 +2791,13 @@ snapshots:
lz-string: 1.5.0
pretty-format: 27.5.1
- '@testing-library/svelte@5.2.1(svelte@4.2.19)(vite@5.4.2)(vitest@2.0.5(jsdom@25.0.0))':
+ '@testing-library/svelte@5.2.1(svelte@4.2.19)(vite@5.4.7)(vitest@2.1.1(jsdom@25.0.1))':
dependencies:
'@testing-library/dom': 10.4.0
svelte: 4.2.19
optionalDependencies:
- vite: 5.4.2
- vitest: 2.0.5(jsdom@25.0.0)
+ vite: 5.4.7
+ vitest: 2.1.1(jsdom@25.0.1)
'@types/aria-query@5.0.4': {}
@@ -2744,128 +2805,155 @@ snapshots:
'@types/eslint@9.6.1':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
'@types/json-schema': 7.0.15
'@types/estree@1.0.5': {}
+ '@types/estree@1.0.6': {}
+
'@types/json-schema@7.0.15': {}
'@types/pug@2.0.10': {}
'@types/resolve@1.20.2': {}
- '@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)':
+ '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
dependencies:
- '@eslint-community/regexpp': 4.11.0
- '@typescript-eslint/parser': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)
- '@typescript-eslint/scope-manager': 8.3.0
- '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)
- '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)
- '@typescript-eslint/visitor-keys': 8.3.0
- eslint: 9.9.1(jiti@1.21.6)
+ '@eslint-community/regexpp': 4.11.1
+ '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+ '@typescript-eslint/scope-manager': 8.7.0
+ '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+ '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+ '@typescript-eslint/visitor-keys': 8.7.0
+ eslint: 9.11.1(jiti@1.21.6)
graphemer: 1.4.0
ignore: 5.3.2
natural-compare: 1.4.0
- ts-api-utils: 1.3.0(typescript@5.5.4)
+ ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies:
- typescript: 5.5.4
+ typescript: 5.6.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)':
+ '@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
dependencies:
- '@typescript-eslint/scope-manager': 8.3.0
- '@typescript-eslint/types': 8.3.0
- '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4)
- '@typescript-eslint/visitor-keys': 8.3.0
- debug: 4.3.6
- eslint: 9.9.1(jiti@1.21.6)
+ '@typescript-eslint/scope-manager': 8.7.0
+ '@typescript-eslint/types': 8.7.0
+ '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
+ '@typescript-eslint/visitor-keys': 8.7.0
+ debug: 4.3.7
+ eslint: 9.11.1(jiti@1.21.6)
optionalDependencies:
- typescript: 5.5.4
+ typescript: 5.6.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.3.0':
+ '@typescript-eslint/scope-manager@8.7.0':
dependencies:
- '@typescript-eslint/types': 8.3.0
- '@typescript-eslint/visitor-keys': 8.3.0
+ '@typescript-eslint/types': 8.7.0
+ '@typescript-eslint/visitor-keys': 8.7.0
- '@typescript-eslint/type-utils@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)':
+ '@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
dependencies:
- '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4)
- '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)
- debug: 4.3.6
- ts-api-utils: 1.3.0(typescript@5.5.4)
+ '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
+ '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+ debug: 4.3.7
+ ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies:
- typescript: 5.5.4
+ typescript: 5.6.2
transitivePeerDependencies:
- eslint
- supports-color
- '@typescript-eslint/types@8.3.0': {}
+ '@typescript-eslint/types@8.7.0': {}
- '@typescript-eslint/typescript-estree@8.3.0(typescript@5.5.4)':
+ '@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.2)':
dependencies:
- '@typescript-eslint/types': 8.3.0
- '@typescript-eslint/visitor-keys': 8.3.0
- debug: 4.3.6
+ '@typescript-eslint/types': 8.7.0
+ '@typescript-eslint/visitor-keys': 8.7.0
+ debug: 4.3.7
fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
- ts-api-utils: 1.3.0(typescript@5.5.4)
+ ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies:
- typescript: 5.5.4
+ typescript: 5.6.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)':
+ '@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6))
- '@typescript-eslint/scope-manager': 8.3.0
- '@typescript-eslint/types': 8.3.0
- '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4)
- eslint: 9.9.1(jiti@1.21.6)
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
+ '@typescript-eslint/scope-manager': 8.7.0
+ '@typescript-eslint/types': 8.7.0
+ '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
+ eslint: 9.11.1(jiti@1.21.6)
transitivePeerDependencies:
- supports-color
- typescript
- '@typescript-eslint/visitor-keys@8.3.0':
+ '@typescript-eslint/visitor-keys@8.7.0':
dependencies:
- '@typescript-eslint/types': 8.3.0
+ '@typescript-eslint/types': 8.7.0
eslint-visitor-keys: 3.4.3
- '@vitest/expect@2.0.5':
+ '@vitest/coverage-v8@2.1.1(vitest@2.1.1(jsdom@25.0.1))':
dependencies:
- '@vitest/spy': 2.0.5
- '@vitest/utils': 2.0.5
+ '@ampproject/remapping': 2.3.0
+ '@bcoe/v8-coverage': 0.2.3
+ debug: 4.3.7
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-report: 3.0.1
+ istanbul-lib-source-maps: 5.0.6
+ istanbul-reports: 3.1.7
+ magic-string: 0.30.11
+ magicast: 0.3.5
+ std-env: 3.7.0
+ test-exclude: 7.0.1
+ tinyrainbow: 1.2.0
+ vitest: 2.1.1(jsdom@25.0.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitest/expect@2.1.1':
+ dependencies:
+ '@vitest/spy': 2.1.1
+ '@vitest/utils': 2.1.1
chai: 5.1.1
tinyrainbow: 1.2.0
- '@vitest/pretty-format@2.0.5':
+ '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.7)':
+ dependencies:
+ '@vitest/spy': 2.1.1
+ estree-walker: 3.0.3
+ magic-string: 0.30.11
+ optionalDependencies:
+ vite: 5.4.7
+
+ '@vitest/pretty-format@2.1.1':
dependencies:
tinyrainbow: 1.2.0
- '@vitest/runner@2.0.5':
+ '@vitest/runner@2.1.1':
dependencies:
- '@vitest/utils': 2.0.5
+ '@vitest/utils': 2.1.1
pathe: 1.1.2
- '@vitest/snapshot@2.0.5':
+ '@vitest/snapshot@2.1.1':
dependencies:
- '@vitest/pretty-format': 2.0.5
+ '@vitest/pretty-format': 2.1.1
magic-string: 0.30.11
pathe: 1.1.2
- '@vitest/spy@2.0.5':
+ '@vitest/spy@2.1.1':
dependencies:
- tinyspy: 3.0.0
+ tinyspy: 3.0.2
- '@vitest/utils@2.0.5':
+ '@vitest/utils@2.1.1':
dependencies:
- '@vitest/pretty-format': 2.0.5
- estree-walker: 3.0.3
+ '@vitest/pretty-format': 2.1.1
loupe: 3.1.1
tinyrainbow: 1.2.0
@@ -2879,7 +2967,7 @@ snapshots:
agent-base@7.1.1:
dependencies:
- debug: 4.3.6
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
@@ -2892,7 +2980,7 @@ snapshots:
ansi-regex@5.0.1: {}
- ansi-regex@6.0.1: {}
+ ansi-regex@6.1.0: {}
ansi-styles@3.2.1:
dependencies:
@@ -2913,7 +3001,7 @@ snapshots:
normalize-path: 3.0.0
picomatch: 2.3.1
- apexcharts@3.52.0:
+ apexcharts@3.53.0:
dependencies:
'@yr/monotone-cubic-spline': 1.0.3
svg.draggable.js: 2.2.2
@@ -2931,18 +3019,20 @@ snapshots:
dependencies:
dequal: 2.0.3
+ aria-query@5.3.2: {}
+
assertion-error@2.0.1: {}
asynckit@0.4.0: {}
- autoprefixer@10.4.20(postcss@8.4.41):
+ autoprefixer@10.4.20(postcss@8.4.47):
dependencies:
browserslist: 4.23.3
- caniuse-lite: 1.0.30001651
+ caniuse-lite: 1.0.30001663
fraction.js: 4.3.7
normalize-range: 0.1.2
- picocolors: 1.0.1
- postcss: 8.4.41
+ picocolors: 1.1.0
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
axobject-query@4.1.0: {}
@@ -2966,22 +3056,20 @@ snapshots:
browserslist@4.23.3:
dependencies:
- caniuse-lite: 1.0.30001651
- electron-to-chromium: 1.5.11
+ caniuse-lite: 1.0.30001663
+ electron-to-chromium: 1.5.28
node-releases: 2.0.18
update-browserslist-db: 1.1.0(browserslist@4.23.3)
buffer-crc32@1.0.0: {}
- builtin-modules@3.3.0: {}
-
cac@6.7.14: {}
callsites@3.1.0: {}
camelcase-css@2.0.1: {}
- caniuse-lite@1.0.30001651: {}
+ caniuse-lite@1.0.30001663: {}
chai@5.1.1:
dependencies:
@@ -3027,7 +3115,7 @@ snapshots:
code-red@1.0.4:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
acorn: 8.12.1
estree-walker: 3.0.3
periscopic: 3.1.0
@@ -3063,13 +3151,13 @@ snapshots:
css-tree@2.3.1:
dependencies:
mdn-data: 2.0.30
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
cssesc@3.0.0: {}
- cssstyle@4.0.1:
+ cssstyle@4.1.0:
dependencies:
- rrweb-cssom: 0.6.0
+ rrweb-cssom: 0.7.1
d@1.0.2:
dependencies:
@@ -3081,9 +3169,9 @@ snapshots:
whatwg-mimetype: 4.0.0
whatwg-url: 14.0.0
- debug@4.3.6:
+ debug@4.3.7:
dependencies:
- ms: 2.1.2
+ ms: 2.1.3
decimal.js@10.4.3: {}
@@ -3109,7 +3197,7 @@ snapshots:
eastasianwidth@0.2.0: {}
- electron-to-chromium@1.5.11: {}
+ electron-to-chromium@1.5.28: {}
emoji-regex@8.0.0: {}
@@ -3196,35 +3284,35 @@ snapshots:
'@esbuild/win32-ia32': 0.21.5
'@esbuild/win32-x64': 0.21.5
- escalade@3.1.2: {}
+ escalade@3.2.0: {}
escape-string-regexp@1.0.5: {}
escape-string-regexp@4.0.0: {}
- eslint-compat-utils@0.5.1(eslint@9.9.1(jiti@1.21.6)):
+ eslint-compat-utils@0.5.1(eslint@9.11.1(jiti@1.21.6)):
dependencies:
- eslint: 9.9.1(jiti@1.21.6)
+ eslint: 9.11.1(jiti@1.21.6)
semver: 7.6.3
- eslint-config-prettier@9.1.0(eslint@9.9.1(jiti@1.21.6)):
+ eslint-config-prettier@9.1.0(eslint@9.11.1(jiti@1.21.6)):
dependencies:
- eslint: 9.9.1(jiti@1.21.6)
+ eslint: 9.11.1(jiti@1.21.6)
- eslint-plugin-svelte@2.43.0(eslint@9.9.1(jiti@1.21.6))(svelte@4.2.19):
+ eslint-plugin-svelte@2.44.0(eslint@9.11.1(jiti@1.21.6))(svelte@4.2.19):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6))
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
'@jridgewell/sourcemap-codec': 1.5.0
- eslint: 9.9.1(jiti@1.21.6)
- eslint-compat-utils: 0.5.1(eslint@9.9.1(jiti@1.21.6))
+ eslint: 9.11.1(jiti@1.21.6)
+ eslint-compat-utils: 0.5.1(eslint@9.11.1(jiti@1.21.6))
esutils: 2.0.3
known-css-properties: 0.34.0
- postcss: 8.4.41
- postcss-load-config: 3.1.4(postcss@8.4.41)
- postcss-safe-parser: 6.0.0(postcss@8.4.41)
+ postcss: 8.4.47
+ postcss-load-config: 3.1.4(postcss@8.4.47)
+ postcss-safe-parser: 6.0.0(postcss@8.4.47)
postcss-selector-parser: 6.1.2
semver: 7.6.3
- svelte-eslint-parser: 0.41.0(svelte@4.2.19)
+ svelte-eslint-parser: 0.41.1(svelte@4.2.19)
optionalDependencies:
svelte: 4.2.19
transitivePeerDependencies:
@@ -3244,20 +3332,24 @@ snapshots:
eslint-visitor-keys@4.0.0: {}
- eslint@9.9.1(jiti@1.21.6):
+ eslint@9.11.1(jiti@1.21.6):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6))
- '@eslint-community/regexpp': 4.11.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
+ '@eslint-community/regexpp': 4.11.1
'@eslint/config-array': 0.18.0
+ '@eslint/core': 0.6.0
'@eslint/eslintrc': 3.1.0
- '@eslint/js': 9.9.1
+ '@eslint/js': 9.11.1
+ '@eslint/plugin-kit': 0.2.0
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.3.0
'@nodelib/fs.walk': 1.2.8
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
- debug: 4.3.6
+ debug: 4.3.7
escape-string-regexp: 4.0.0
eslint-scope: 8.0.2
eslint-visitor-keys: 4.0.0
@@ -3273,7 +3365,6 @@ snapshots:
is-glob: 4.0.3
is-path-inside: 3.0.3
json-stable-stringify-without-jsonify: 1.0.1
- levn: 0.4.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
@@ -3320,7 +3411,7 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
esutils@2.0.3: {}
@@ -3329,18 +3420,6 @@ snapshots:
d: 1.0.2
es5-ext: 0.10.64
- execa@8.0.1:
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 8.0.1
- human-signals: 5.0.0
- is-stream: 3.0.0
- merge-stream: 2.0.0
- npm-run-path: 5.3.0
- onetime: 6.0.0
- signal-exit: 4.1.0
- strip-final-newline: 3.0.0
-
ext@1.7.0:
dependencies:
type: 2.7.3
@@ -3353,7 +3432,7 @@ snapshots:
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.7
+ micromatch: 4.0.8
fast-json-stable-stringify@2.1.0: {}
@@ -3383,33 +3462,33 @@ snapshots:
flatted@3.3.1: {}
- flowbite-datepicker@1.3.0(rollup@4.21.2):
+ flowbite-datepicker@1.3.0(rollup@4.22.4):
dependencies:
- '@rollup/plugin-node-resolve': 15.2.3(rollup@4.21.2)
- flowbite: 2.5.1(rollup@4.21.2)
+ '@rollup/plugin-node-resolve': 15.3.0(rollup@4.22.4)
+ flowbite: 2.5.1(rollup@4.22.4)
transitivePeerDependencies:
- rollup
- flowbite-svelte-icons@1.6.1(svelte@4.2.19)(tailwind-merge@2.5.2)(tailwindcss@3.4.10):
+ flowbite-svelte-icons@1.6.1(svelte@4.2.19)(tailwind-merge@2.5.2)(tailwindcss@3.4.13):
dependencies:
svelte: 4.2.19
tailwind-merge: 2.5.2
- tailwindcss: 3.4.10
+ tailwindcss: 3.4.13
- flowbite-svelte@0.46.15(rollup@4.21.2)(svelte@4.2.19):
+ flowbite-svelte@0.46.17(rollup@4.22.4)(svelte@4.2.19):
dependencies:
- '@floating-ui/dom': 1.6.10
- apexcharts: 3.52.0
- flowbite: 2.5.1(rollup@4.21.2)
+ '@floating-ui/dom': 1.6.11
+ apexcharts: 3.53.0
+ flowbite: 2.5.1(rollup@4.22.4)
svelte: 4.2.19
tailwind-merge: 2.5.2
transitivePeerDependencies:
- rollup
- flowbite@2.5.1(rollup@4.21.2):
+ flowbite@2.5.1(rollup@4.22.4):
dependencies:
'@popperjs/core': 2.11.8
- flowbite-datepicker: 1.3.0(rollup@4.21.2)
+ flowbite-datepicker: 1.3.0(rollup@4.22.4)
mini-svg-data-uri: 1.4.4
transitivePeerDependencies:
- rollup
@@ -3436,8 +3515,6 @@ snapshots:
get-func-name@2.0.2: {}
- get-stream@8.0.1: {}
-
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
@@ -3488,22 +3565,22 @@ snapshots:
dependencies:
whatwg-encoding: 3.1.1
+ html-escaper@2.0.2: {}
+
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.1
- debug: 4.3.6
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.5:
dependencies:
agent-base: 7.1.1
- debug: 4.3.6
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
- human-signals@5.0.0: {}
-
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
@@ -3537,11 +3614,7 @@ snapshots:
dependencies:
binary-extensions: 2.3.0
- is-builtin-module@3.2.1:
- dependencies:
- builtin-modules: 3.3.0
-
- is-core-module@2.15.0:
+ is-core-module@2.15.1:
dependencies:
hasown: 2.0.2
@@ -3565,12 +3638,33 @@ snapshots:
is-reference@3.0.2:
dependencies:
- '@types/estree': 1.0.5
-
- is-stream@3.0.0: {}
+ '@types/estree': 1.0.6
isexe@2.0.0: {}
+ iso-639-1@3.1.3: {}
+
+ istanbul-lib-coverage@3.2.2: {}
+
+ istanbul-lib-report@3.0.1:
+ dependencies:
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
+
+ istanbul-lib-source-maps@5.0.6:
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ debug: 4.3.7
+ istanbul-lib-coverage: 3.2.2
+ transitivePeerDependencies:
+ - supports-color
+
+ istanbul-reports@3.1.7:
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
+
jackspeak@3.4.3:
dependencies:
'@isaacs/cliui': 8.0.2
@@ -3585,9 +3679,9 @@ snapshots:
dependencies:
argparse: 2.0.1
- jsdom@25.0.0:
+ jsdom@25.0.1:
dependencies:
- cssstyle: 4.0.1
+ cssstyle: 4.1.0
data-urls: 5.0.0
decimal.js: 10.4.3
form-data: 4.0.0
@@ -3600,7 +3694,7 @@ snapshots:
rrweb-cssom: 0.7.1
saxes: 6.0.0
symbol-tree: 3.2.4
- tough-cookie: 4.1.4
+ tough-cookie: 5.0.0
w3c-xmlserializer: 5.0.0
webidl-conversions: 7.0.0
whatwg-encoding: 3.1.1
@@ -3666,6 +3760,16 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
+ magicast@0.3.5:
+ dependencies:
+ '@babel/parser': 7.25.6
+ '@babel/types': 7.25.6
+ source-map-js: 1.2.1
+
+ make-dir@4.0.0:
+ dependencies:
+ semver: 7.6.3
+
mdn-data@2.0.30: {}
memoizee@0.4.17:
@@ -3679,11 +3783,9 @@ snapshots:
next-tick: 1.1.0
timers-ext: 0.1.8
- merge-stream@2.0.0: {}
-
merge2@1.4.1: {}
- micromatch@4.0.7:
+ micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
@@ -3694,8 +3796,6 @@ snapshots:
dependencies:
mime-db: 1.52.0
- mimic-fn@4.0.0: {}
-
min-indent@1.0.1: {}
mini-svg-data-uri@1.4.4: {}
@@ -3720,7 +3820,7 @@ snapshots:
mrmime@2.0.0: {}
- ms@2.1.2: {}
+ ms@2.1.3: {}
mz@2.7.0:
dependencies:
@@ -3740,10 +3840,6 @@ snapshots:
normalize-range@0.1.2: {}
- npm-run-path@5.3.0:
- dependencies:
- path-key: 4.0.0
-
nwsapi@2.2.12: {}
object-assign@4.1.1: {}
@@ -3754,10 +3850,6 @@ snapshots:
dependencies:
wrappy: 1.0.2
- onetime@6.0.0:
- dependencies:
- mimic-fn: 4.0.0
-
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
@@ -3791,8 +3883,6 @@ snapshots:
path-key@3.1.1: {}
- path-key@4.0.0: {}
-
path-parse@1.0.7: {}
path-scurry@1.11.1:
@@ -3806,11 +3896,11 @@ snapshots:
periscopic@3.1.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 3.0.3
is-reference: 3.0.2
- picocolors@1.0.1: {}
+ picocolors@1.1.0: {}
picomatch@2.3.1: {}
@@ -3818,44 +3908,44 @@ snapshots:
pirates@4.0.6: {}
- postcss-import@15.1.0(postcss@8.4.41):
+ postcss-import@15.1.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.41
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.8
- postcss-js@4.0.1(postcss@8.4.41):
+ postcss-js@4.0.1(postcss@8.4.47):
dependencies:
camelcase-css: 2.0.1
- postcss: 8.4.41
+ postcss: 8.4.47
- postcss-load-config@3.1.4(postcss@8.4.41):
+ postcss-load-config@3.1.4(postcss@8.4.47):
dependencies:
lilconfig: 2.1.0
yaml: 1.10.2
optionalDependencies:
- postcss: 8.4.41
+ postcss: 8.4.47
- postcss-load-config@4.0.2(postcss@8.4.41):
+ postcss-load-config@4.0.2(postcss@8.4.47):
dependencies:
lilconfig: 3.1.2
- yaml: 2.5.0
+ yaml: 2.5.1
optionalDependencies:
- postcss: 8.4.41
+ postcss: 8.4.47
- postcss-nested@6.2.0(postcss@8.4.41):
+ postcss-nested@6.2.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.41
+ postcss: 8.4.47
postcss-selector-parser: 6.1.2
- postcss-safe-parser@6.0.0(postcss@8.4.41):
+ postcss-safe-parser@6.0.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.41
+ postcss: 8.4.47
- postcss-scss@4.0.9(postcss@8.4.41):
+ postcss-scss@4.0.9(postcss@8.4.47):
dependencies:
- postcss: 8.4.41
+ postcss: 8.4.47
postcss-selector-parser@6.0.10:
dependencies:
@@ -3869,17 +3959,11 @@ snapshots:
postcss-value-parser@4.2.0: {}
- postcss@8.4.41:
- dependencies:
- nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
-
- postcss@8.4.42:
+ postcss@8.4.47:
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
+ picocolors: 1.1.0
+ source-map-js: 1.2.1
prelude-ls@1.2.1: {}
@@ -3902,12 +3986,8 @@ snapshots:
ansi-styles: 5.2.0
react-is: 17.0.2
- psl@1.9.0: {}
-
punycode@2.3.1: {}
- querystringify@2.2.0: {}
-
queue-microtask@1.2.3: {}
react-is@17.0.2: {}
@@ -3922,13 +4002,11 @@ snapshots:
regenerator-runtime@0.14.1: {}
- requires-port@1.0.0: {}
-
resolve-from@4.0.0: {}
resolve@1.22.8:
dependencies:
- is-core-module: 2.15.0
+ is-core-module: 2.15.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
@@ -3938,30 +4016,28 @@ snapshots:
dependencies:
glob: 7.2.3
- rollup@4.21.2:
+ rollup@4.22.4:
dependencies:
'@types/estree': 1.0.5
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.21.2
- '@rollup/rollup-android-arm64': 4.21.2
- '@rollup/rollup-darwin-arm64': 4.21.2
- '@rollup/rollup-darwin-x64': 4.21.2
- '@rollup/rollup-linux-arm-gnueabihf': 4.21.2
- '@rollup/rollup-linux-arm-musleabihf': 4.21.2
- '@rollup/rollup-linux-arm64-gnu': 4.21.2
- '@rollup/rollup-linux-arm64-musl': 4.21.2
- '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2
- '@rollup/rollup-linux-riscv64-gnu': 4.21.2
- '@rollup/rollup-linux-s390x-gnu': 4.21.2
- '@rollup/rollup-linux-x64-gnu': 4.21.2
- '@rollup/rollup-linux-x64-musl': 4.21.2
- '@rollup/rollup-win32-arm64-msvc': 4.21.2
- '@rollup/rollup-win32-ia32-msvc': 4.21.2
- '@rollup/rollup-win32-x64-msvc': 4.21.2
+ '@rollup/rollup-android-arm-eabi': 4.22.4
+ '@rollup/rollup-android-arm64': 4.22.4
+ '@rollup/rollup-darwin-arm64': 4.22.4
+ '@rollup/rollup-darwin-x64': 4.22.4
+ '@rollup/rollup-linux-arm-gnueabihf': 4.22.4
+ '@rollup/rollup-linux-arm-musleabihf': 4.22.4
+ '@rollup/rollup-linux-arm64-gnu': 4.22.4
+ '@rollup/rollup-linux-arm64-musl': 4.22.4
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.22.4
+ '@rollup/rollup-linux-riscv64-gnu': 4.22.4
+ '@rollup/rollup-linux-s390x-gnu': 4.22.4
+ '@rollup/rollup-linux-x64-gnu': 4.22.4
+ '@rollup/rollup-linux-x64-musl': 4.22.4
+ '@rollup/rollup-win32-arm64-msvc': 4.22.4
+ '@rollup/rollup-win32-ia32-msvc': 4.22.4
+ '@rollup/rollup-win32-x64-msvc': 4.22.4
fsevents: 2.3.3
- rrweb-cssom@0.6.0: {}
-
rrweb-cssom@0.7.1: {}
run-parallel@1.2.0:
@@ -4001,7 +4077,7 @@ snapshots:
sirv@2.0.4:
dependencies:
- '@polka/url': 1.0.0-next.25
+ '@polka/url': 1.0.0-next.28
mrmime: 2.0.0
totalist: 3.0.1
@@ -4012,7 +4088,7 @@ snapshots:
minimist: 1.2.8
sander: 0.5.1
- source-map-js@1.2.0: {}
+ source-map-js@1.2.1: {}
stackback@0.0.2: {}
@@ -4036,9 +4112,7 @@ snapshots:
strip-ansi@7.1.0:
dependencies:
- ansi-regex: 6.0.1
-
- strip-final-newline@3.0.0: {}
+ ansi-regex: 6.1.0
strip-indent@3.0.0:
dependencies:
@@ -4066,15 +4140,15 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
- svelte-check@3.8.6(postcss-load-config@4.0.2(postcss@8.4.41))(postcss@8.4.41)(svelte@4.2.19):
+ svelte-check@3.8.6(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
chokidar: 3.6.0
- picocolors: 1.0.1
+ picocolors: 1.1.0
sade: 1.8.1
svelte: 4.2.19
- svelte-preprocess: 5.1.4(postcss-load-config@4.0.2(postcss@8.4.41))(postcss@8.4.41)(svelte@4.2.19)(typescript@5.5.4)
- typescript: 5.5.4
+ svelte-preprocess: 5.1.4(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.6.2)
+ typescript: 5.6.2
transitivePeerDependencies:
- '@babel/core'
- coffeescript
@@ -4086,13 +4160,13 @@ snapshots:
- stylus
- sugarss
- svelte-eslint-parser@0.41.0(svelte@4.2.19):
+ svelte-eslint-parser@0.41.1(svelte@4.2.19):
dependencies:
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3
espree: 9.6.1
- postcss: 8.4.41
- postcss-scss: 4.0.9(postcss@8.4.41)
+ postcss: 8.4.47
+ postcss-scss: 4.0.9(postcss@8.4.47)
optionalDependencies:
svelte: 4.2.19
@@ -4111,7 +4185,7 @@ snapshots:
svelte: 4.2.19
tiny-glob: 0.2.9
- svelte-preprocess@5.1.4(postcss-load-config@4.0.2(postcss@8.4.41))(postcss@8.4.41)(svelte@4.2.19)(typescript@5.5.4):
+ svelte-preprocess@5.1.4(postcss-load-config@4.0.2(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.6.2):
dependencies:
'@types/pug': 2.0.10
detect-indent: 6.1.0
@@ -4120,18 +4194,18 @@ snapshots:
strip-indent: 3.0.0
svelte: 4.2.19
optionalDependencies:
- postcss: 8.4.41
- postcss-load-config: 4.0.2(postcss@8.4.41)
- typescript: 5.5.4
+ postcss: 8.4.47
+ postcss-load-config: 4.0.2(postcss@8.4.47)
+ typescript: 5.6.2
svelte@4.2.19:
dependencies:
'@ampproject/remapping': 2.3.0
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
acorn: 8.12.1
- aria-query: 5.3.0
+ aria-query: 5.3.2
axobject-query: 4.1.0
code-red: 1.0.4
css-tree: 2.3.1
@@ -4176,7 +4250,7 @@ snapshots:
tailwind-merge@2.5.2: {}
- tailwindcss@3.4.10:
+ tailwindcss@3.4.13:
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
@@ -4188,21 +4262,27 @@ snapshots:
is-glob: 4.0.3
jiti: 1.21.6
lilconfig: 2.1.0
- micromatch: 4.0.7
+ micromatch: 4.0.8
normalize-path: 3.0.0
object-hash: 3.0.0
- picocolors: 1.0.1
- postcss: 8.4.41
- postcss-import: 15.1.0(postcss@8.4.41)
- postcss-js: 4.0.1(postcss@8.4.41)
- postcss-load-config: 4.0.2(postcss@8.4.41)
- postcss-nested: 6.2.0(postcss@8.4.41)
+ picocolors: 1.1.0
+ postcss: 8.4.47
+ postcss-import: 15.1.0(postcss@8.4.47)
+ postcss-js: 4.0.1(postcss@8.4.47)
+ postcss-load-config: 4.0.2(postcss@8.4.47)
+ postcss-nested: 6.2.0(postcss@8.4.47)
postcss-selector-parser: 6.1.2
resolve: 1.22.8
sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
+ test-exclude@7.0.1:
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 10.4.5
+ minimatch: 9.0.5
+
text-table@0.2.0: {}
thenify-all@1.6.0:
@@ -4225,11 +4305,21 @@ snapshots:
tinybench@2.9.0: {}
+ tinyexec@0.3.0: {}
+
tinypool@1.0.1: {}
tinyrainbow@1.2.0: {}
- tinyspy@3.0.0: {}
+ tinyspy@3.0.2: {}
+
+ tldts-core@6.1.47: {}
+
+ tldts@6.1.47:
+ dependencies:
+ tldts-core: 6.1.47
+
+ to-fast-properties@2.0.0: {}
to-regex-range@5.0.1:
dependencies:
@@ -4237,20 +4327,17 @@ snapshots:
totalist@3.0.1: {}
- tough-cookie@4.1.4:
+ tough-cookie@5.0.0:
dependencies:
- psl: 1.9.0
- punycode: 2.3.1
- universalify: 0.2.0
- url-parse: 1.5.10
+ tldts: 6.1.47
tr46@5.0.0:
dependencies:
punycode: 2.3.1
- ts-api-utils@1.3.0(typescript@5.5.4):
+ ts-api-utils@1.3.0(typescript@5.6.2):
dependencies:
- typescript: 5.5.4
+ typescript: 5.6.2
ts-interface-checker@0.1.13: {}
@@ -4262,45 +4349,37 @@ snapshots:
type@2.7.3: {}
- typescript-eslint@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4):
+ typescript-eslint@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)
- '@typescript-eslint/parser': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)
- '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)
+ '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+ '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
+ '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
optionalDependencies:
- typescript: 5.5.4
+ typescript: 5.6.2
transitivePeerDependencies:
- eslint
- supports-color
- typescript@5.5.4: {}
-
- universalify@0.2.0: {}
+ typescript@5.6.2: {}
update-browserslist-db@1.1.0(browserslist@4.23.3):
dependencies:
browserslist: 4.23.3
- escalade: 3.1.2
- picocolors: 1.0.1
+ escalade: 3.2.0
+ picocolors: 1.1.0
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
- url-parse@1.5.10:
- dependencies:
- querystringify: 2.2.0
- requires-port: 1.0.0
-
util-deprecate@1.0.2: {}
- vite-node@2.0.5:
+ vite-node@2.1.1:
dependencies:
cac: 6.7.14
- debug: 4.3.6
+ debug: 4.3.7
pathe: 1.1.2
- tinyrainbow: 1.2.0
- vite: 5.4.2
+ vite: 5.4.7
transitivePeerDependencies:
- '@types/node'
- less
@@ -4312,44 +4391,45 @@ snapshots:
- supports-color
- terser
- vite@5.4.2:
+ vite@5.4.7:
dependencies:
esbuild: 0.21.5
- postcss: 8.4.42
- rollup: 4.21.2
+ postcss: 8.4.47
+ rollup: 4.22.4
optionalDependencies:
fsevents: 2.3.3
- vitefu@0.2.5(vite@5.4.2):
+ vitefu@0.2.5(vite@5.4.7):
optionalDependencies:
- vite: 5.4.2
+ vite: 5.4.7
- vitest@2.0.5(jsdom@25.0.0):
+ vitest@2.1.1(jsdom@25.0.1):
dependencies:
- '@ampproject/remapping': 2.3.0
- '@vitest/expect': 2.0.5
- '@vitest/pretty-format': 2.0.5
- '@vitest/runner': 2.0.5
- '@vitest/snapshot': 2.0.5
- '@vitest/spy': 2.0.5
- '@vitest/utils': 2.0.5
+ '@vitest/expect': 2.1.1
+ '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.7)
+ '@vitest/pretty-format': 2.1.1
+ '@vitest/runner': 2.1.1
+ '@vitest/snapshot': 2.1.1
+ '@vitest/spy': 2.1.1
+ '@vitest/utils': 2.1.1
chai: 5.1.1
- debug: 4.3.6
- execa: 8.0.1
+ debug: 4.3.7
magic-string: 0.30.11
pathe: 1.1.2
std-env: 3.7.0
tinybench: 2.9.0
+ tinyexec: 0.3.0
tinypool: 1.0.1
tinyrainbow: 1.2.0
- vite: 5.4.2
- vite-node: 2.0.5
+ vite: 5.4.7
+ vite-node: 2.1.1
why-is-node-running: 2.3.0
optionalDependencies:
- jsdom: 25.0.0
+ jsdom: 25.0.1
transitivePeerDependencies:
- less
- lightningcss
+ - msw
- sass
- sass-embedded
- stylus
@@ -4407,6 +4487,6 @@ snapshots:
yaml@1.10.2: {}
- yaml@2.5.0: {}
+ yaml@2.5.1: {}
yocto-queue@0.1.0: {}
diff --git a/frontend/src/lib/admin.ts b/frontend/src/lib/admin.ts
new file mode 100644
index 0000000..f6bdcb0
--- /dev/null
+++ b/frontend/src/lib/admin.ts
@@ -0,0 +1,123 @@
+import { milestoneGroups } from '$lib/stores/adminStore';
+
+export async function refreshMilestoneGroups() {
+ console.log('refreshMilestoneGroups...');
+ try {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/milestone-groups/`, {
+ method: 'GET',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ }
+ });
+ const json = await res.json();
+ console.log(json);
+ if (res.status === 200) {
+ milestoneGroups.set(json);
+ } else {
+ console.log('Failed to get MilestoneGroups');
+ milestoneGroups.set([]);
+ }
+ } catch (e) {
+ console.error(e);
+ milestoneGroups.set([]);
+ }
+}
+
+export async function newMilestoneGroup() {
+ console.log('newMilestoneGroup...');
+ try {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/milestone-group/`, {
+ method: 'POST',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ }
+ });
+ if (res.status === 200) {
+ const newGroup = await res.json();
+ console.log(newGroup);
+ await refreshMilestoneGroups();
+ return newGroup;
+ } else {
+ console.log('Failed to create new MilestoneGroup');
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ return null;
+}
+
+export async function patchMilestoneGroup(milestoneGroup) {
+ console.log('patchMilestoneGroup...');
+ console.log(milestoneGroup);
+ try {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/milestone-group`, {
+ method: 'PATCH',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ },
+ body: JSON.stringify(milestoneGroup)
+ });
+ if (res.status === 200) {
+ const updatedGroup = await res.json();
+ console.log(updatedGroup);
+ await refreshMilestoneGroups();
+ return updatedGroup;
+ } else {
+ console.log('Failed to create new MilestoneGroup');
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ return null;
+}
+
+export async function uploadMilestoneGroupImage(milestoneGroupId: number, file) {
+ console.log('uploadMilestoneGroupImage...');
+ try {
+ const formData = new FormData();
+ formData.append('file', file);
+ const res = await fetch(
+ `${import.meta.env.VITE_MONDEY_API_URL}/admin/upload-milestone-group-image/${milestoneGroupId}`,
+ {
+ method: 'POST',
+ credentials: 'include',
+ body: formData
+ }
+ );
+ console.log(await res.json());
+ } catch (e) {
+ console.error(e);
+ }
+}
+
+export async function deleteMilestoneGroup(milestoneGroupId: number | null) {
+ try {
+ const res = await fetch(
+ `${import.meta.env.VITE_MONDEY_API_URL}/admin/milestone-groups/${milestoneGroupId}`,
+ {
+ method: 'DELETE',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ }
+ }
+ );
+ const json = await res.json();
+ console.log(json);
+ if (res.status === 200) {
+ console.log(`Deleted MilestoneGroup with id ${milestoneGroupId}.`);
+ await refreshMilestoneGroups();
+ } else {
+ console.log(`Error deleting MilestoneGroup with id ${milestoneGroupId}.`);
+ }
+ } catch (e) {
+ console.error(e);
+ }
+}
diff --git a/frontend/src/lib/components/Admin/DeleteMilestoneGroupModal.svelte b/frontend/src/lib/components/Admin/DeleteMilestoneGroupModal.svelte
new file mode 100644
index 0000000..f678fa8
--- /dev/null
+++ b/frontend/src/lib/components/Admin/DeleteMilestoneGroupModal.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ Are you sure you want to delete this MilestoneGroup?
+
+ {
+ deleteMilestoneGroup(groupId);
+ }}>Yes, I'm sure
+ No, cancel
+
+
diff --git a/frontend/src/lib/components/Admin/EditMilestoneGroupModal.svelte b/frontend/src/lib/components/Admin/EditMilestoneGroupModal.svelte
new file mode 100644
index 0000000..8f9db1b
--- /dev/null
+++ b/frontend/src/lib/components/Admin/EditMilestoneGroupModal.svelte
@@ -0,0 +1,90 @@
+
+
+
+ {#if milestoneGroup}
+
+
Title
+ {#each Object.entries(milestoneGroup.text) as [lang_id, text]}
+
+
+ {$languages[text.lang_id]}
+
+
+
+ {/each}
+
+
+
Description
+ {#each Object.entries(milestoneGroup.text) as [lang_id, text]}
+
+
+ {$languages[text.lang_id]}
+
+
+
+ {/each}
+
+
+
Image
+
+
+
+
+
+ {/if}
+
+ Save changes
+ Cancel
+
+
diff --git a/frontend/src/lib/components/Admin/Languages.svelte b/frontend/src/lib/components/Admin/Languages.svelte
new file mode 100644
index 0000000..6ad1a4c
--- /dev/null
+++ b/frontend/src/lib/components/Admin/Languages.svelte
@@ -0,0 +1,115 @@
+
+
+
+ {$_('admin.languages')}
+
+
+ Code (ISO 639-1)
+ Name
+ Actions
+
+
+ {#each Object.entries($languages) as [id, lang]}
+
+
+ {lang}
+
+
+ {ISO6391.getNativeName(lang)}
+
+
+ {
+ deleteLanguage(id);
+ }}>Delete
+
+
+ {/each}
+
+
+
+
+
+
+ Add language
+
+
+
+
+
diff --git a/frontend/src/lib/components/Admin/MilestoneGroups.svelte b/frontend/src/lib/components/Admin/MilestoneGroups.svelte
index ab24987..a022e28 100644
--- a/frontend/src/lib/components/Admin/MilestoneGroups.svelte
+++ b/frontend/src/lib/components/Admin/MilestoneGroups.svelte
@@ -1,54 +1,128 @@
-
- {#each milestoneGroups as milestoneGroup}
-
-
-
-
-
- {milestoneGroup.text.de.title}
-
-
-
- {milestoneGroup.text.de.desc}
-
- {/each}
-
+
+ {$_('admin.milestonegroups')}
+
+ {#if milestoneGroups}
+
+
+
+ Image
+ Title
+ Actions
+
+
+ {#each $milestoneGroups as milestoneGroup, groupIndex (milestoneGroup.id)}
+ {@const title = milestoneGroup?.text[$lang_id]?.title}
+ {
+ toggleOpenGroupIndex(groupIndex);
+ }}
+ class={openGroupIndex === null || openGroupIndex === groupIndex
+ ? 'opacity-100'
+ : 'opacity-25'}
+ >
+
+ {#if openGroupIndex === groupIndex}
+
+ {:else}
+
+ {/if}
+
+
+
+
+
+ {title}
+
+
+ {
+ currentGroup = $milestoneGroups[groupIndex];
+ showEditGroupModal = true;
+ }}>Edit
+ {
+ currentGroupId = milestoneGroup.id;
+ showDeleteGroupModal = true;
+ }}>Delete
+
+
+ {/each}
+
+
+
+
+
+ Add milestone group
+
+
+
+
+ {/if}
+
+{#key showEditGroupModal}
+
+{/key}
+
diff --git a/frontend/src/lib/components/Admin/MilestoneGroup.svelte b/frontend/src/lib/components/Admin/NewMilestoneGroupModal.svelte
similarity index 78%
rename from frontend/src/lib/components/Admin/MilestoneGroup.svelte
rename to frontend/src/lib/components/Admin/NewMilestoneGroupModal.svelte
index 9f365d4..f31c115 100644
--- a/frontend/src/lib/components/Admin/MilestoneGroup.svelte
+++ b/frontend/src/lib/components/Admin/NewMilestoneGroupModal.svelte
@@ -1,16 +1,17 @@
-
-
- New MilestoneGroup
-
+
Title
{#each milestoneGroupData.text as text}
@@ -96,13 +92,17 @@
Image
- {#if image}
-
- {:else}
-
- {/if}
-
+
+ {#if image}
+
+ {:else}
+
+ {/if}
+
+
- Create
-
-{result}
+
+ Save changes
+ Cancel
+
+
diff --git a/frontend/src/lib/components/ChildrenRegistration.svelte b/frontend/src/lib/components/ChildrenRegistration.svelte
index e02c45f..d7c4f37 100644
--- a/frontend/src/lib/components/ChildrenRegistration.svelte
+++ b/frontend/src/lib/components/ChildrenRegistration.svelte
@@ -32,6 +32,7 @@
current: await createDummyCurrent()
});
+ await children.save();
await goto(nextpage as string);
} else {
showAlert = true;
diff --git a/frontend/src/lib/components/Childrenpage.svelte b/frontend/src/lib/components/Childrenpage.svelte
index 6a88038..ca34b83 100644
--- a/frontend/src/lib/components/Childrenpage.svelte
+++ b/frontend/src/lib/components/Childrenpage.svelte
@@ -84,6 +84,50 @@
let data: ChildData[] = [];
let loading = true;
+ function searchName(data: any[], key: string): any[] {
+ if (key === '') {
+ return data;
+ } else {
+ const res = data.filter((item) => {
+ return item.header.toLowerCase().includes(key.toLowerCase());
+ });
+ return res;
+ }
+ }
+
+ function searchRemarks(data: any[], key: string): any[] {
+ if (key === '') {
+ return data;
+ } else {
+ const res = data.filter((item) => {
+ return item.summary.toLowerCase().includes(key.toLowerCase());
+ });
+ return res;
+ }
+ }
+
+ function searchAll(data: any[], key: string) {
+ return [...new Set([...searchName(data, key), ...searchRemarks(data, key)])];
+ }
+
+ const searchData = [
+ {
+ label: 'Alle',
+ placeholder: 'Alle Kategorien durchsuchen',
+ filterFunction: searchAll
+ },
+ {
+ label: 'Name',
+ placeholder: 'Kinder nach Namen durchsuchen',
+ filterFunction: searchName
+ },
+ {
+ label: 'Bemerkung',
+ placeholder: 'Bemerkungen zu Kindern durchsuchen',
+ filterFunction: searchRemarks
+ }
+ ];
+
// this fetches dummy child data for the dummy user whenever the component is mounted into the dom
// it is conceptualized as emulating an API call that would normally fetch this from the server.
onMount(init);
@@ -104,8 +148,8 @@
{/if}
diff --git a/frontend/src/lib/components/DataDisplay/GalleryDisplay.svelte b/frontend/src/lib/components/DataDisplay/GalleryDisplay.svelte
index bc25430..8be3fbf 100644
--- a/frontend/src/lib/components/DataDisplay/GalleryDisplay.svelte
+++ b/frontend/src/lib/components/DataDisplay/GalleryDisplay.svelte
@@ -1,25 +1,40 @@
@@ -20,6 +22,7 @@
class="flex items-center"
on:click={() => {
locale.set(loc);
+ lang_id.set(`${Object.keys($languages).find((key) => $languages[key] === loc)}`);
dropdownOpen = false;
}}
>
diff --git a/frontend/src/lib/components/MilestoneGroup.svelte b/frontend/src/lib/components/MilestoneGroup.svelte
index c53871b..bfc41cf 100644
--- a/frontend/src/lib/components/MilestoneGroup.svelte
+++ b/frontend/src/lib/components/MilestoneGroup.svelte
@@ -2,25 +2,10 @@
import Breadcrumbs from '$lib/components/Breadcrumbs.svelte';
import CardDisplay from '$lib/components/DataDisplay/CardDisplay.svelte';
import GalleryDisplay from '$lib/components/DataDisplay/GalleryDisplay.svelte';
+
export let breadcrumbdata: any[] = [];
export let milestonedata: any[] = [];
-
- function filterData(data: object[], dummy: any, key: string): object[] {
- if (key === '') {
- return data;
- } else {
- return data.filter((item) => {
- // button label contains info about completion status => use for search
- if (key === completeKey) {
- return item.progress === 1;
- } else if (key === incompleteKey) {
- return item.progress < 1;
- } else {
- return item.header.toLowerCase().includes(key.toLowerCase());
- }
- });
- }
- }
+ export let searchData: any[] = [];
// FIXME:styling has no business being here... not sure where to put it though given thatparts of it are data dependent
export function createStyle(data) {
@@ -52,11 +37,9 @@
a.progress - b.progress)}
itemComponent={CardDisplay}
- searchableCol={'header'}
componentProps={createStyle(milestonedata)}
- searchPlaceHolder={`Nach Status (${completeKey}/${incompleteKey}) oder Titel durchsuchen`}
withSearch={true}
- {filterData}
+ {searchData}
/>
diff --git a/frontend/src/lib/components/MilestoneOverview.svelte b/frontend/src/lib/components/MilestoneOverview.svelte
index fe8de1e..a83a9d9 100644
--- a/frontend/src/lib/components/MilestoneOverview.svelte
+++ b/frontend/src/lib/components/MilestoneOverview.svelte
@@ -5,23 +5,6 @@
import GalleryDisplay from '$lib/components/DataDisplay/GalleryDisplay.svelte';
import { CheckCircleSolid, ExclamationCircleSolid } from 'flowbite-svelte-icons';
- function filterData(data: object[], dummy: any, key: string): object[] {
- if (key === '') {
- return data;
- } else {
- return data.filter((item) => {
- // button label contains info about completion status => use for search
- if (key === completeKey) {
- return item.complete === true;
- } else if (key === incompleteKey) {
- return item.complete === false;
- } else {
- return item.header.toLowerCase().includes(key.toLowerCase());
- }
- });
- }
- }
-
// FIXME: this must go eventually. Either must happen in the backend or there
// should be in a refactored version of the card component
function convertData(data: object[]): object[] {
@@ -30,6 +13,8 @@
header: item.title,
href: `${base}/milestone`, // hardcoded link for the moment
complete: item.answer !== null,
+ summary: item.desc,
+ answer: item.answer,
auxilliary: item.answer !== null ? CheckCircleSolid : ExclamationCircleSolid
};
});
@@ -38,6 +23,7 @@
const completeKey = 'fertig';
const incompleteKey = 'unfertig';
export let breadcrumbdata: object[] = [];
+ export let searchData: any[];
export let data: object[] = [];
const rawdata = convertData(data).sort((a, b) => a.complete - b.complete); // FIXME: the convert step should not be here and will be handeled backend-side
@@ -60,9 +46,8 @@
}
};
})}
- searchPlaceHolder={`Nach Status (${completeKey}/${incompleteKey}) oder Titel durchsuchen`}
withSearch={true}
- {filterData}
+ {searchData}
/>
diff --git a/frontend/src/lib/i18n.ts b/frontend/src/lib/i18n.ts
index 9c82e6f..b8b146d 100644
--- a/frontend/src/lib/i18n.ts
+++ b/frontend/src/lib/i18n.ts
@@ -1,4 +1,5 @@
-import { register, init, getLocaleFromNavigator } from 'svelte-i18n';
+import { register, init } from 'svelte-i18n';
+import { lang_id, languages } from '$lib/stores/adminStore';
register('de', () => import('../locales/de.json'));
register('en', () => import('../locales/en.json'));
@@ -7,3 +8,21 @@ init({
fallbackLocale: 'de',
initialLocale: 'de'
});
+
+export async function updateLanguages() {
+ try {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/languages`, {
+ method: 'GET',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ }
+ });
+ if (res.status === 200) {
+ languages.set(await res.json());
+ }
+ } catch (e) {
+ console.error(e);
+ }
+}
diff --git a/frontend/src/lib/stores/adminStore.ts b/frontend/src/lib/stores/adminStore.ts
index 1bf0410..9a8fb5d 100644
--- a/frontend/src/lib/stores/adminStore.ts
+++ b/frontend/src/lib/stores/adminStore.ts
@@ -1,3 +1,9 @@
import { writable } from 'svelte/store';
export const isLoggedIn = writable(false);
+
+export const milestoneGroups = writable([]);
+
+export const languages = writable({});
+
+export const lang_id = writable('1');
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json
index ce04e0f..dd51862 100644
--- a/frontend/src/locales/de.json
+++ b/frontend/src/locales/de.json
@@ -22,5 +22,9 @@
"next": "Weiter",
"prev": "Zurück",
"autonext": "Automatisch weiter"
+ },
+ "admin": {
+ "languages": "Sprachen",
+ "milestonegroups": "Meilensteingruppen"
}
}
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
index 690cff5..4bda8d6 100644
--- a/frontend/src/locales/en.json
+++ b/frontend/src/locales/en.json
@@ -22,5 +22,9 @@
"next": "Next",
"prev": "Back",
"autonext": "Continue automatically"
+ },
+ "admin": {
+ "languages": "Languages",
+ "milestonegroups": "Milestone groups"
}
}
diff --git a/frontend/src/routes/admin/+page.svelte b/frontend/src/routes/admin/+page.svelte
index 904efbf..a13edad 100644
--- a/frontend/src/routes/admin/+page.svelte
+++ b/frontend/src/routes/admin/+page.svelte
@@ -1,9 +1,10 @@
- {#if !isLoggedInValue}
+ {#if !$isLoggedIn}
{:else}
+
-
{/if}
diff --git a/frontend/src/routes/milestonegroup/+page.svelte b/frontend/src/routes/milestonegroup/+page.svelte
index c7f064a..ee13ad9 100644
--- a/frontend/src/routes/milestonegroup/+page.svelte
+++ b/frontend/src/routes/milestonegroup/+page.svelte
@@ -23,14 +23,55 @@
}
];
+ const milestoneData = [
+ {
+ number: 1,
+ title: 'Alleine von Stufe/Absatz springen',
+ desc: 'Kind springt mit beiden Beinen gleichzeitig hoch und überwindet im Sprung freihändig einen (kleinen) Absatz oder eine Stufe. Es kommt sicher wieder im Stand auf.',
+ observation:
+ 'Beobachten Sie, ob das Kind spontan oder nach Aufforderung von einer Treppenstufe oder einem ähnlich hohen Absatz springt! Es sollte tatsächlich mit beiden Beinen gleichzeitig losspringen, sich nirgends festhalten und beim Landen nicht mit der Hand abfangen. Sie sollten es beim Springen auch nicht an die Hand nehmen müssen. Wurde dieses Verhalten mehrmals sicher ausgeführt, gilt der Meilenstein zuverlässig gekonnt. Ist das Kind noch leicht unsicher, springt meist mit beiden Beinen versetzt los, oder berührt beim Landen mit der Hand den Boden, ist das Verhalten weitgehend gekonnt. Wagt es den Sprung nur, wenn man seine Hand hält und/oder führt es den Sprung noch unsauber aus, ist das Verhalten in Ansätzen gekonnt. In allen anderen Fällen gilt der Meilenstein als noch nicht gekonnt.',
+ help: 'Beim Treppengehen im Haus, beim Spazierengehen oder auf dem Spielplatz bieten sich vielfältige Gelegenheiten, Kinder zum Springen von einem Absatz (z.B. einem höheren Bordstein. einem Holzstamm, oder einem Stein) zu ermutigen. Machen Sie Ihrem Kind die Bewegung vor oder führen Sie sie gemeinsam mit dem Kind durch. Nehmen Sie das Kind dafür zunächst bei an die Hand. Später können sie die Hand immer lockerer mitführen und die Eigenbewegung des Kindes nur noch passiv begleiten. So kann das Kind am besten selbst herausfinden, wie es seine Arme einsetzen muss, um Schwung zu holen und beim Landen das Gleichgewicht zu finden. Ist das Springen an der Hand sicher, lösen Sie die Hand ganz und stellen Sie sich gegenüber dem Kind hin, damit es weiß, dass es im Notfall aufgefangen wird.',
+ imgs: ['baby0.jpg', 'baby1.jpg', 'baby2.jpg'],
+ answer: 'Vollständig gekonnt'
+ },
+ {
+ number: 2,
+ title: 'Das Köpfchen alleine heben',
+ desc: 'Kind liegt auf dem Bauch, hält die Arme angewinkelt neben dem Körper und hebt sein Köpfchen aus eigener Kraft so hoch, dass das Kinn nicht mehr die Auflage berührt. Diese Position kann es mehr als 3 Sekunden halten.',
+ observation: 'Hier kommt der Beobachtungshilfetext hin',
+ help: 'Hier kommt der Förderhilfetext hin',
+ imgs: ['baby1.jpg'],
+ answer: null
+ },
+ {
+ number: 3,
+ title: 'Den Kopf frei bewegen',
+ desc: 'Kind kann seinen Kopf frei halten und bewegen, wenn es z.B. auf dem Schoß sitzt. Wenn man seinen Körper ein wenig schräg hält, gleicht es diese Bewegung mit dem Kopf aus. Der Kopf wackelt kaum oder gar nicht, wenn das Kind ihn dreht.',
+ observation: 'Hier kommt der Beobachtungshilfetext hin',
+ help: 'Hier kommt der Förderhilfetext hin',
+ imgs: ['baby2.jpg'],
+ answer: 'In Ansätzen gekonnt'
+ },
+ {
+ number: 4,
+ title: 'Sich in Bauchlage mit gestreckten Armen aufstützen',
+ desc: 'Kind liegt auf dem Bauch. Es stützt sich mit beiden Armen gestreckt von der Unterlage ab und hebt seinen Rücken an, um den Kopf aufrecht zu halten. Schultern und Brust liegen für mehr als 3 Sekunden nicht mehr auf der Unterlage.',
+ observation: 'Hier kommt der Beobachtungshilfetext hin',
+ help: 'Hier kommt der Förderhilfetext hin',
+ imgs: ['baby3.jpg'],
+ answer: null
+ }
+ ];
+
// this is a list of data that can be fetched by the component later.
- const milestonedata: any[] = [
+ const surveyData: any[] = [
{
header: 'Grobmotorik',
summary: 'something something',
image: imgJump,
href: `${base}/milestoneoverview`,
- progress: 0.75
+ progress: 0.75,
+ milestoneData: milestoneData
},
{
header: 'Feinmotorik',
@@ -38,28 +79,32 @@
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt',
image: null,
href: `${base}/milestoneoverview`,
- progress: 1.0
+ progress: 1.0,
+ milestoneData: milestoneData
},
{
header: 'Geistige Grundfunktionen',
summary: 'something something',
image: imgHead,
href: `${base}/milestoneoverview`,
- progress: 1.0
+ progress: 1.0,
+ milestoneData: milestoneData
},
{
header: 'Höhere Denkfunktionen',
summary: 'something something',
image: null,
href: `${base}/milestoneoverview`,
- progress: 1.0
+ progress: 1.0,
+ milestoneData: milestoneData
},
{
header: 'Sprache',
summary: 'how much noise the child makes',
image: null,
href: `${base}/milestoneoverview`,
- progress: 0.5
+ progress: 0.5,
+ milestoneData: milestoneData
},
{
header: 'Soziale Entwicklung',
@@ -67,21 +112,24 @@
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit.',
image: imgHead,
href: `${base}/milestoneoverview`,
- progress: 0.3
+ progress: 0.3,
+ milestoneData: milestoneData
},
{
header: 'Selbstregulation',
summary: 'something something',
image: null,
href: `${base}/milestoneoverview`,
- progress: 0.6
+ progress: 0.6,
+ milestoneData: milestoneData
},
{
header: 'Emotionen',
summary: 'something something',
image: null,
href: `${base}/milestoneoverview`,
- progress: 0.9
+ progress: 0.9,
+ milestoneData: milestoneData
},
{
header: 'Vorläuferfertigkeiten Schule',
@@ -89,11 +137,118 @@
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit.',
image: null,
href: `${base}/milestoneoverview`,
- progress: 0.3
+ progress: 0.3,
+ milestoneData: milestoneData
+ }
+ ];
+
+ interface MilestoneData {
+ number: 4;
+ title: string;
+ desc: string;
+ observation: string;
+ help: string;
+ answer: string;
+ }
+
+ interface DataElement {
+ header: string;
+ summary: string;
+ milestoneData: any;
+ progress: number;
+ [key: string]: any;
+ }
+
+ function searchByStatus(data: DataElement[], key: string): DataElement[] {
+ if (key === '') {
+ return data;
+ } else {
+ return data.filter((item) => {
+ // button label contains info about completion status => use for search
+ if (key === 'fertig') {
+ return item.progress === 1;
+ } else if (key === 'unfertig') {
+ return item.progress < 1;
+ } else {
+ return item.header.toLowerCase().includes(key.toLowerCase());
+ }
+ });
+ }
+ }
+
+ function searchBySurvey(data: DataElement[], key: string): DataElement[] {
+ if (key === '') {
+ return data;
+ } else {
+ return data.filter((item) => {
+ return item.header.toLowerCase().includes(key.toLowerCase());
+ });
+ }
+ }
+
+ function searchBySurveyDescription(data: DataElement[], key: string): DataElement[] {
+ if (key === '') {
+ return data;
+ } else {
+ return data.filter((item) => {
+ return item.summary.toLowerCase().includes(key.toLowerCase());
+ });
+ }
+ }
+
+ function searchByMilestone(data: DataElement[], key: string): DataElement[] {
+ if (key === '') {
+ return data;
+ } else {
+ return data.filter((item) => {
+ return item.milestoneData.some((element: MilestoneData) =>
+ element.title.toLowerCase().includes(key.toLowerCase())
+ );
+ });
+ }
+ }
+
+ // README: this is slow and quite a bit of work because a lot of text has to be searched. Kill it?
+ function searchAll(data: DataElement[], key: string): DataElement[] {
+ return [
+ ...new Set([
+ ...searchBySurvey(data, key),
+ ...searchByStatus(data, key),
+ ...searchByMilestone(data, key),
+ ...searchBySurveyDescription(data, key)
+ ])
+ ];
+ }
+
+ const searchData: any[] = [
+ {
+ label: 'Alle',
+ placeholder: 'Alle Kategorien durchsuchen',
+ filterFunction: searchAll
+ },
+ {
+ label: 'Bereich',
+ placeholder: 'Nach Beobachtungsbereich suchen',
+ filterFunction: searchBySurvey
+ },
+ {
+ label: 'Bereichsbeschreibung',
+ placeholder: 'Beschreibung von Bereichen durchsuchen',
+ filterFunction: searchBySurveyDescription
+ },
+ {
+ label: 'Meilensteine',
+ placeholder: 'Nach Meilenstein suchen',
+ filterFunction: searchByMilestone
+ },
+ {
+ label: 'Status',
+ placeholder: 'Bereiche nach Status durchsuchen (fertig/unfertig)',
+ filterFunction: searchByStatus
}
];
-
+
diff --git a/frontend/src/routes/milestoneoverview/+page.svelte b/frontend/src/routes/milestoneoverview/+page.svelte
index f8ac508..93d7f77 100644
--- a/frontend/src/routes/milestoneoverview/+page.svelte
+++ b/frontend/src/routes/milestoneoverview/+page.svelte
@@ -68,6 +68,98 @@
const desc =
'Hier geht es darum, zu beschreiben, wie sich das Kind fortbewegt Und seinen Körper (Rumpf, Arme, Beine) kontrollieren kann.';
const progress = 0.5;
+
+ interface MilestoneData {
+ header: string;
+ href: string;
+ summary: string;
+ auxilliary: string;
+ complete: boolean;
+ answer: string;
+ }
+
+ function searchStatus(data: MilestoneData[], key: string): MilestoneData[] {
+ if (key === '') {
+ return data;
+ } else {
+ return data.filter((item) => {
+ // button label contains info about completion status => use for search
+ if (key === 'fertig') {
+ return item.complete === true;
+ } else if (key === 'unfertig') {
+ return item.complete === false;
+ }
+ });
+ }
+ }
+
+ function searchDescription(data: MilestoneData[], key: string): MilestoneData[] {
+ if (key === '') {
+ return data;
+ } else {
+ return data.filter((item) => {
+ return item.summary.toLowerCase().includes(key.toLowerCase());
+ });
+ }
+ }
+
+ function searchTitle(data: MilestoneData[], key: string): MilestoneData[] {
+ if (key === '') {
+ return data;
+ } else {
+ return data.filter((item) => {
+ return item.header.toLowerCase().includes(key.toLowerCase());
+ });
+ }
+ }
+
+ function searchAnswer(data: MilestoneData[], key: string): MilestoneData[] {
+ if (key === '') {
+ return data;
+ } else {
+ return data.filter((item) => {
+ return item.answer === null ? false : item.answer.toLowerCase().includes(key.toLowerCase());
+ });
+ }
+ }
+
+ function searchAll(data: MilestoneData[], key: string): MilestoneData[] {
+ return [
+ ...new Set([
+ ...searchDescription(data, key),
+ ...searchStatus(data, key),
+ ...searchTitle(data, key),
+ ...searchAnswer(data, key)
+ ])
+ ];
+ }
+ const searchData = [
+ {
+ label: 'Alle',
+ placeholder: 'Alle Kategorien durchsuchen',
+ filterFunction: searchAll
+ },
+ {
+ label: 'Status',
+ placeholder: 'Nach Status durchsuchen',
+ filterFunction: searchStatus
+ },
+ {
+ label: 'Anwort',
+ placeholder: 'Nach Antwort durchsuchen',
+ filterFunction: searchAnswer
+ },
+ {
+ label: 'Titel',
+ placeholder: 'Nach Meilenstein durchsuchen',
+ filterFunction: searchTitle
+ },
+ {
+ label: 'Beschreibung',
+ placeholder: 'Beschreibungen durchsuchen',
+ filterFunction: searchDescription
+ }
+ ];
-
+
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index 5b9ab55..044423d 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -7,5 +7,10 @@ export default defineConfig({
test: {
include: ['src/**/*.{test,spec}.{js,ts}'],
environment: 'jsdom'
+ },
+ server: {
+ host: 'localhost',
+ port: 5173,
+ strictPort: true
}
});
diff --git a/mondey_backend/.env b/mondey_backend/.env
deleted file mode 100644
index edd9c03..0000000
--- a/mondey_backend/.env
+++ /dev/null
@@ -1,9 +0,0 @@
-SECRET=abc123
-USER_DATABASE_PATH=users.db
-MILESTONE_DATABASE_PATH=milestones.db
-STATIC_FILES_PATH=static
-ENABLE_CORS=True
-HOST=localhost
-PORT=8000
-RELOAD=True
-LOG_LEVEL=info
diff --git a/mondey_backend/Dockerfile b/mondey_backend/Dockerfile
index a93f2e5..2a9b253 100644
--- a/mondey_backend/Dockerfile
+++ b/mondey_backend/Dockerfile
@@ -2,7 +2,6 @@ FROM python:3.12-slim
LABEL org.opencontainers.image.source=https://github.com/ssciwr/mondey-frontend-prototype
LABEL org.opencontainers.image.description="MONDEY backend production image"
-LABEL org.opencontainers.image.licenses=MIT
WORKDIR /app
@@ -10,4 +9,4 @@ COPY . .
RUN pip install .
-CMD ["mondey-backend", "--host", "0.0.0.0", "--port", "80", "--log-level", "info"]
+CMD ["mondey-backend"]
diff --git a/mondey_backend/README.md b/mondey_backend/README.md
index 51d0ab9..c7bc225 100644
--- a/mondey_backend/README.md
+++ b/mondey_backend/README.md
@@ -36,7 +36,6 @@ sqlite> UPDATE user SET is_superuser = 1 WHERE email = 'youremail@yourdomain.com
The backend can be configured using environment variables,
which can be set in a `.env` file in the working directory where you start the backend.
-Default settings for local development are included in [.env](.env).
## Tests
diff --git a/mondey_backend/db/README.md b/mondey_backend/db/README.md
new file mode 100644
index 0000000..6e4fde4
--- /dev/null
+++ b/mondey_backend/db/README.md
@@ -0,0 +1 @@
+This is the default folder where the databases will be created and stored when running the backend locally.
diff --git a/mondey_backend/pyproject.toml b/mondey_backend/pyproject.toml
index 8393428..53b1e74 100644
--- a/mondey_backend/pyproject.toml
+++ b/mondey_backend/pyproject.toml
@@ -24,6 +24,7 @@ dynamic = ["version"]
tests = [
"pytest",
"pytest-randomly",
+ "pytest-cov",
]
[project.scripts]
diff --git a/mondey_backend/src/mondey_backend/databases/milestones.py b/mondey_backend/src/mondey_backend/databases/milestones.py
index 67b8246..8251bd2 100644
--- a/mondey_backend/src/mondey_backend/databases/milestones.py
+++ b/mondey_backend/src/mondey_backend/databases/milestones.py
@@ -6,7 +6,7 @@
from ..settings import app_settings
engine = create_engine(
- f"sqlite:///{app_settings.MILESTONE_DATABASE_PATH}",
+ f"sqlite:///{app_settings.DATABASE_PATH}/milestones.db",
connect_args={"check_same_thread": False},
)
diff --git a/mondey_backend/src/mondey_backend/databases/users.py b/mondey_backend/src/mondey_backend/databases/users.py
index bc3f113..b2802bb 100644
--- a/mondey_backend/src/mondey_backend/databases/users.py
+++ b/mondey_backend/src/mondey_backend/databases/users.py
@@ -15,7 +15,9 @@
from ..models.users import User
from ..settings import app_settings
-engine = create_async_engine(f"sqlite+aiosqlite:///{app_settings.USER_DATABASE_PATH}")
+engine = create_async_engine(
+ f"sqlite+aiosqlite:///{app_settings.DATABASE_PATH}/users.db"
+)
async_session_maker = async_sessionmaker(engine, expire_on_commit=False)
diff --git a/mondey_backend/src/mondey_backend/main.py b/mondey_backend/src/mondey_backend/main.py
index bf2db40..c6edf16 100644
--- a/mondey_backend/src/mondey_backend/main.py
+++ b/mondey_backend/src/mondey_backend/main.py
@@ -27,7 +27,7 @@ async def lifespan(app: FastAPI):
# ensure static files directory exists
pathlib.Path(app_settings.STATIC_FILES_PATH).mkdir(parents=True, exist_ok=True)
-app = FastAPI(lifespan=lifespan, title="MONDEY API")
+app = FastAPI(lifespan=lifespan, title="MONDEY API", root_path="/api")
app.include_router(milestones.router)
app.include_router(admin.router)
app.include_router(users.router)
@@ -38,7 +38,7 @@ async def lifespan(app: FastAPI):
if app_settings.ENABLE_CORS:
app.add_middleware(
CORSMiddleware,
- allow_origins=["http://localhost:4173", "http://localhost:5173"],
+ allow_origins=["http://localhost:5173"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
diff --git a/mondey_backend/src/mondey_backend/models/milestones.py b/mondey_backend/src/mondey_backend/models/milestones.py
index 38eab60..7adae87 100644
--- a/mondey_backend/src/mondey_backend/models/milestones.py
+++ b/mondey_backend/src/mondey_backend/models/milestones.py
@@ -14,24 +14,35 @@
# avoid the weird hacks required to make relationships work across files
+class Language(SQLModel, table=True):
+ id: int | None = Field(default=None, primary_key=True)
+ lang: str = fixed_length_string_field(2, index=True)
+
+
+class LanguageCreate(SQLModel):
+ lang: str = fixed_length_string_field(2, index=True)
+
+
## MilestoneGroupText
class MilestoneGroupTextBase(SQLModel):
- title: str
- desc: str
+ title: str = ""
+ desc: str = ""
class MilestoneGroupText(MilestoneGroupTextBase, table=True):
- id: int | None = Field(default=None, primary_key=True)
group_id: int | None = Field(
- default=None, foreign_key="milestonegroup.id", index=True
+ default=None, foreign_key="milestonegroup.id", primary_key=True
+ )
+ lang_id: int | None = Field(
+ default=None, foreign_key="language.id", primary_key=True
)
- lang: str = fixed_length_string_field(2, index=True)
class MilestoneGroupTextCreate(MilestoneGroupTextBase):
- lang: str = fixed_length_string_field(2, index=True)
+ group_id: int
+ lang_id: int
class MilestoneGroupTextPublic(MilestoneGroupTextBase):
@@ -41,40 +52,31 @@ class MilestoneGroupTextPublic(MilestoneGroupTextBase):
## MilestoneGroup
-class MilestoneGroupBase(SQLModel):
- order: int = 0
-
-
-class MilestoneGroup(MilestoneGroupBase, table=True):
+class MilestoneGroup(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
- text: Mapped[dict[str, MilestoneGroupText]] = Relationship(
+ order: int
+ text: Mapped[dict[int, MilestoneGroupText]] = Relationship(
sa_relationship=relationship(
- collection_class=attribute_keyed_dict("lang"), cascade="all, delete-orphan"
+ collection_class=attribute_keyed_dict("lang_id"),
+ cascade="all, delete-orphan",
)
)
milestones: Mapped[list[Milestone]] = back_populates("group")
-class MilestoneGroupCreate(MilestoneGroupBase):
- pass
-
-
-class MilestoneGroupPublic(MilestoneGroupBase):
+class MilestoneGroupPublic(SQLModel):
id: int
- text: dict[str, MilestoneGroupTextPublic] = {}
+ text: dict[int, MilestoneGroupTextPublic] = {}
milestones: list[MilestonePublic] = []
-class MilestoneGroupAdmin(MilestoneGroupBase):
+class MilestoneGroupAdmin(SQLModel):
id: int
- text: dict[str, MilestoneGroupText] = {}
+ order: int
+ text: dict[int, MilestoneGroupText] = {}
milestones: list[Milestone] = []
-class MilestoneGroupUpdate(MilestoneGroupBase):
- pass
-
-
## MilestoneText
diff --git a/mondey_backend/src/mondey_backend/routers/admin.py b/mondey_backend/src/mondey_backend/routers/admin.py
index fae2ccd..7f7fc37 100644
--- a/mondey_backend/src/mondey_backend/routers/admin.py
+++ b/mondey_backend/src/mondey_backend/routers/admin.py
@@ -10,53 +10,34 @@
from ..dependencies import AdminDep
from ..dependencies import SessionDep
+from ..models.milestones import Language
+from ..models.milestones import LanguageCreate
from ..models.milestones import Milestone
from ..models.milestones import MilestoneCreate
from ..models.milestones import MilestoneGroup
from ..models.milestones import MilestoneGroupAdmin
-from ..models.milestones import MilestoneGroupCreate
from ..models.milestones import MilestoneGroupText
-from ..models.milestones import MilestoneGroupTextCreate
-from ..models.milestones import MilestoneGroupUpdate
from ..models.milestones import MilestonePublic
from ..models.milestones import MilestoneUpdate
router = APIRouter(prefix="/admin", tags=["admin"], dependencies=[AdminDep])
-@router.post("/milestones/", response_model=MilestonePublic)
-def create_milestone(session: SessionDep, milestone: MilestoneCreate):
- db_milestone = Milestone.model_validate(milestone)
- session.add(db_milestone)
+@router.post("/language/", response_model=Language)
+def create_language(session: SessionDep, language: LanguageCreate):
+ db_language = Language.model_validate(language)
+ session.add(db_language)
session.commit()
- session.refresh(db_milestone)
- return db_milestone
+ session.refresh(db_language)
+ return db_language
-@router.patch("/milestones/{milestone_id}", response_model=MilestonePublic)
-def update_milestone(
- session: SessionDep,
- milestone_id: int,
- milestone: MilestoneUpdate,
-):
- db_milestone = session.get(Milestone, milestone_id)
- if not db_milestone:
- raise HTTPException(status_code=404, detail="milestone not found")
- milestone_data = milestone.model_dump(exclude_unset=True)
- for key, value in milestone_data.items():
- setattr(db_milestone, key, value)
- session.add(db_milestone)
- session.commit()
- session.refresh(db_milestone)
- return db_milestone
-
-
-@router.delete("/milestones/{milestone_id}")
-def delete_milestone(session: SessionDep, milestone_id: int):
- milestone = session.get(Milestone, milestone_id)
- if not milestone:
- raise HTTPException(status_code=404, detail="milestone not found")
- session.delete(milestone)
+@router.delete("/language/{language_id}", response_model=Language)
+def delete_language(session: SessionDep, language_id: str):
+ language = session.get(Language, language_id)
+ if not language:
+ raise HTTPException(status_code=404, detail="language not found")
+ session.delete(language)
session.commit()
return {"ok": True}
@@ -69,39 +50,45 @@ def get_milestone_groups(session: SessionDep):
return milestone_groups
-@router.post("/milestone-groups/", response_model=MilestoneGroupAdmin)
-def create_milestone_group(
- session: SessionDep,
- group: MilestoneGroupCreate,
- text: list[MilestoneGroupTextCreate],
-):
- logging.critical(f"{group}")
- db_milestone_group = MilestoneGroup.model_validate(group)
+@router.post("/milestone-group/", response_model=MilestoneGroupAdmin)
+def create_milestone_group(session: SessionDep):
+ db_milestone_group = MilestoneGroup(order=0, image=None)
session.add(db_milestone_group)
session.commit()
session.refresh(db_milestone_group)
- for milestone_group_text in text:
- db_milestone_group_text = MilestoneGroupText.model_validate(
- milestone_group_text, update={"group_id": db_milestone_group.id}
+ for language in session.exec(select(Language)).all():
+ session.add(
+ MilestoneGroupText(
+ group_id=db_milestone_group.id, lang_id=language.id, title="", desc=""
+ )
)
- session.add(db_milestone_group_text)
session.commit()
+ session.refresh(db_milestone_group)
return db_milestone_group
-@router.patch(
- "/milestone-groups/{milestone_group_id}", response_model=MilestoneGroupAdmin
-)
+@router.patch("/milestone-group", response_model=MilestoneGroupAdmin)
def update_milestone_group(
session: SessionDep,
- milestone_group_id: int,
- milestone_group: MilestoneGroupUpdate,
+ milestone_group: MilestoneGroupAdmin,
):
- db_milestone_group = session.get(MilestoneGroup, milestone_group_id)
+ db_milestone_group = session.get(MilestoneGroup, milestone_group.id)
if not db_milestone_group:
raise HTTPException(status_code=404, detail="milestone_group not found")
- for key, value in milestone_group.model_dump().items():
+ for key, value in milestone_group.model_dump(
+ exclude={"text", "milestones"}
+ ).items():
setattr(db_milestone_group, key, value)
+ for text in milestone_group.text.values():
+ db_milestone_group_text = session.get(
+ MilestoneGroupText, (text.group_id, text.lang_id)
+ )
+ if not db_milestone_group_text:
+ db_milestone_group_text = text
+ else:
+ for key, value in text.model_dump().items():
+ setattr(db_milestone_group_text, key, value)
+ session.add(db_milestone_group_text)
session.add(db_milestone_group)
session.commit()
session.refresh(db_milestone_group)
@@ -136,3 +123,40 @@ async def upload_milestone_group_image(
finally:
file.file.close()
return {"filename": filename}
+
+
+@router.post("/milestones/", response_model=MilestonePublic)
+def create_milestone(session: SessionDep, milestone: MilestoneCreate):
+ db_milestone = Milestone.model_validate(milestone)
+ session.add(db_milestone)
+ session.commit()
+ session.refresh(db_milestone)
+ return db_milestone
+
+
+@router.patch("/milestones/{milestone_id}", response_model=MilestonePublic)
+def update_milestone(
+ session: SessionDep,
+ milestone_id: int,
+ milestone: MilestoneUpdate,
+):
+ db_milestone = session.get(Milestone, milestone_id)
+ if not db_milestone:
+ raise HTTPException(status_code=404, detail="milestone not found")
+ milestone_data = milestone.model_dump(exclude_unset=True)
+ for key, value in milestone_data.items():
+ setattr(db_milestone, key, value)
+ session.add(db_milestone)
+ session.commit()
+ session.refresh(db_milestone)
+ return db_milestone
+
+
+@router.delete("/milestones/{milestone_id}")
+def delete_milestone(session: SessionDep, milestone_id: int):
+ milestone = session.get(Milestone, milestone_id)
+ if not milestone:
+ raise HTTPException(status_code=404, detail="milestone not found")
+ session.delete(milestone)
+ session.commit()
+ return {"ok": True}
diff --git a/mondey_backend/src/mondey_backend/routers/milestones.py b/mondey_backend/src/mondey_backend/routers/milestones.py
index 7fb5080..c5b888c 100644
--- a/mondey_backend/src/mondey_backend/routers/milestones.py
+++ b/mondey_backend/src/mondey_backend/routers/milestones.py
@@ -6,6 +6,7 @@
from sqlmodel import select
from ..dependencies import SessionDep
+from ..models.milestones import Language
from ..models.milestones import Milestone
from ..models.milestones import MilestoneGroup
from ..models.milestones import MilestoneGroupPublic
@@ -14,6 +15,15 @@
router = APIRouter(tags=["milestones"])
+@router.get("/languages/", response_model=dict[int, str])
+def get_languages(
+ session: SessionDep,
+):
+ return {
+ language.id: language.lang for language in session.exec(select(Language)).all()
+ }
+
+
@router.get("/milestones/", response_model=list[MilestonePublic])
def get_milestones(
session: SessionDep,
diff --git a/mondey_backend/src/mondey_backend/settings.py b/mondey_backend/src/mondey_backend/settings.py
index 6c9c8f0..dfe2212 100644
--- a/mondey_backend/src/mondey_backend/settings.py
+++ b/mondey_backend/src/mondey_backend/settings.py
@@ -1,21 +1,20 @@
from __future__ import annotations
-import secrets
-
from pydantic_settings import BaseSettings
from pydantic_settings import SettingsConfigDict
class AppSettings(BaseSettings):
+ # this will load settings from environment variables or an .env file if present
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")
- SECRET: str = secrets.token_urlsafe(64)
- USER_DATABASE_PATH: str = "users.db"
- MILESTONE_DATABASE_PATH: str = "milestones.db"
+ # these defaults are for local development and are used if the environment variables are not set
+ SECRET: str = "abc123"
+ DATABASE_PATH: str = "db"
STATIC_FILES_PATH: str = "static"
- ENABLE_CORS: bool = False
+ ENABLE_CORS: bool = True
HOST: str = "localhost"
PORT: int = 8000
- RELOAD: bool = False
+ RELOAD: bool = True
LOG_LEVEL: str = "info"
diff --git a/mondey_backend/tests/conftest.py b/mondey_backend/tests/conftest.py
index 8672183..8d0975c 100644
--- a/mondey_backend/tests/conftest.py
+++ b/mondey_backend/tests/conftest.py
@@ -6,6 +6,7 @@
from mondey_backend.dependencies import current_active_user
from mondey_backend.dependencies import get_session
from mondey_backend.main import app
+from mondey_backend.models.milestones import Language
from mondey_backend.models.milestones import MilestoneGroup
from mondey_backend.models.milestones import MilestoneGroupText
from mondey_backend.models.users import UserRead
@@ -27,13 +28,16 @@ def session():
SQLModel.metadata.create_all(engine)
with Session(engine) as session:
# add some test data to the database
- session.add(MilestoneGroup(order=2, image=None))
- session.add(MilestoneGroupText(group_id=1, lang="de", title="t1", desc="d1"))
- session.add(MilestoneGroupText(group_id=1, lang="en", title="t2", desc="d2"))
- session.add(MilestoneGroup(order=1, image=None))
- session.add(MilestoneGroupText(group_id=2, lang="de", title="t3", desc="d3"))
- session.add(MilestoneGroupText(group_id=2, lang="en", title="t4", desc="d4"))
- session.add(MilestoneGroupText(group_id=2, lang="fr", title="t5", desc="d5"))
+ session.add(Language(lang="de"))
+ session.add(Language(lang="en"))
+ session.add(Language(lang="fr"))
+ session.add(MilestoneGroup(order=2))
+ session.add(MilestoneGroupText(group_id=1, lang_id=1, title="t1", desc="d1"))
+ session.add(MilestoneGroupText(group_id=1, lang_id=2, title="t2", desc="d2"))
+ session.add(MilestoneGroup(order=1))
+ session.add(MilestoneGroupText(group_id=2, lang_id=1, title="t3", desc="d3"))
+ session.add(MilestoneGroupText(group_id=2, lang_id=2, title="t4", desc="d4"))
+ session.add(MilestoneGroupText(group_id=2, lang_id=3, title="t5", desc="d5"))
session.commit()
yield session
diff --git a/mondey_backend/tests/routers/test_admin.py b/mondey_backend/tests/routers/test_admin.py
index 0e52bcb..d44cb03 100644
--- a/mondey_backend/tests/routers/test_admin.py
+++ b/mondey_backend/tests/routers/test_admin.py
@@ -1,6 +1,18 @@
from fastapi.testclient import TestClient
+def test_post_language(admin_client: TestClient):
+ response = admin_client.post("/admin/language/", json={"lang": "es"})
+ assert response.status_code == 200
+ assert response.json() == {"id": 4, "lang": "es"}
+
+
+def test_delete_language(admin_client: TestClient):
+ response = admin_client.delete("/admin/language/2")
+ assert response.status_code == 200
+ assert admin_client.get("/languages").json() == {"1": "de", "3": "fr"}
+
+
def test_get_milestone_groups(admin_client: TestClient):
response = admin_client.get("/admin/milestone-groups/")
assert response.status_code == 200
@@ -10,12 +22,21 @@ def test_get_milestone_groups(admin_client: TestClient):
"id": 2,
"order": 1,
"text": {
- "de": {"id": 3, "group_id": 2, "lang": "de", "title": "t3", "desc": "d3"},
- "en": {"id": 4, "group_id": 2, "lang": "en", "title": "t4", "desc": "d4"},
- "fr": {
- "id": 5,
+ "1": {
"group_id": 2,
- "lang": "fr",
+ "lang_id": 1,
+ "title": "t3",
+ "desc": "d3",
+ },
+ "2": {
+ "group_id": 2,
+ "lang_id": 2,
+ "title": "t4",
+ "desc": "d4",
+ },
+ "3": {
+ "group_id": 2,
+ "lang_id": 3,
"title": "t5",
"desc": "d5",
},
@@ -26,40 +47,47 @@ def test_get_milestone_groups(admin_client: TestClient):
"id": 1,
"order": 2,
"text": {
- "de": {"id": 1, "group_id": 1, "lang": "de", "title": "t1", "desc": "d1"},
- "en": {"id": 2, "group_id": 1, "lang": "en", "title": "t2", "desc": "d2"},
+ "1": {
+ "group_id": 1,
+ "lang_id": 1,
+ "title": "t1",
+ "desc": "d1",
+ },
+ "2": {
+ "group_id": 1,
+ "lang_id": 2,
+ "title": "t2",
+ "desc": "d2",
+ },
},
"milestones": [],
}
-def test_post_milestone_groups(admin_client: TestClient):
- data = {
- "group": {"order": 0},
- "text": [
- {"lang": "en", "title": "title1", "desc": "desc1"},
- {"lang": "de", "title": "title2", "desc": "desc2"},
- ],
- }
- response = admin_client.post("/admin/milestone-groups/", json=data)
+def test_post_milestone_group(admin_client: TestClient):
+ response = admin_client.post("/admin/milestone-group/")
assert response.status_code == 200
assert response.json() == {
"id": 3,
"order": 0,
"text": {
- "en": {
- "id": 6,
- "lang": "en",
+ "1": {
+ "group_id": 3,
+ "lang_id": 1,
+ "title": "",
+ "desc": "",
+ },
+ "2": {
"group_id": 3,
- "title": "title1",
- "desc": "desc1",
+ "lang_id": 2,
+ "title": "",
+ "desc": "",
},
- "de": {
- "id": 7,
- "lang": "de",
+ "3": {
"group_id": 3,
- "title": "title2",
- "desc": "desc2",
+ "lang_id": 3,
+ "title": "",
+ "desc": "",
},
},
"milestones": [],
@@ -67,20 +95,15 @@ def test_post_milestone_groups(admin_client: TestClient):
def test_patch_milestone_groups(admin_client: TestClient):
- data = {
- "order": 3,
- }
- response = admin_client.patch("/admin/milestone-groups/1", json=data)
+ data = admin_client.get("/admin/milestone-groups").json()[0]
+ data["order"] = 6
+ data["text"]["1"]["title"] = "asdsd"
+ data["text"]["1"]["desc"] = "12xzascdasdf"
+ data["text"]["2"]["title"] = "asqwdreqweqw"
+ data["text"]["2"]["desc"] = "th567"
+ response = admin_client.patch("/admin/milestone-group", json=data)
assert response.status_code == 200
- assert response.json() == {
- "id": 1,
- "order": 3,
- "text": {
- "de": {"id": 1, "group_id": 1, "lang": "de", "title": "t1", "desc": "d1"},
- "en": {"id": 2, "group_id": 1, "lang": "en", "title": "t2", "desc": "d2"},
- },
- "milestones": [],
- }
+ assert response.json() == data
def test_admin_delete_milestone_group(admin_client: TestClient):
diff --git a/mondey_backend/tests/routers/test_milestones.py b/mondey_backend/tests/routers/test_milestones.py
index cec0c88..890661f 100644
--- a/mondey_backend/tests/routers/test_milestones.py
+++ b/mondey_backend/tests/routers/test_milestones.py
@@ -3,6 +3,12 @@
@pytest.mark.parametrize("client_type", ["user_client", "admin_client"])
class TestMilestones:
+ def test_get_languages(self, client_type: str, request: pytest.FixtureRequest):
+ client = request.getfixturevalue(client_type)
+ response = client.get("/languages/")
+ assert response.status_code == 200
+ assert response.json() == {"1": "de", "2": "en", "3": "fr"}
+
def test_get_milestone_groups(
self, client_type: str, request: pytest.FixtureRequest
):
@@ -13,20 +19,18 @@ def test_get_milestone_groups(
group1, group2 = response.json()
assert group1 == {
"id": 2,
- "order": 1,
"text": {
- "de": {"title": "t3", "desc": "d3"},
- "en": {"title": "t4", "desc": "d4"},
- "fr": {"title": "t5", "desc": "d5"},
+ "1": {"title": "t3", "desc": "d3"},
+ "2": {"title": "t4", "desc": "d4"},
+ "3": {"title": "t5", "desc": "d5"},
},
"milestones": [],
}
assert group2 == {
"id": 1,
- "order": 2,
"text": {
- "de": {"title": "t1", "desc": "d1"},
- "en": {"title": "t2", "desc": "d2"},
+ "1": {"title": "t1", "desc": "d1"},
+ "2": {"title": "t2", "desc": "d2"},
},
"milestones": [],
}
@@ -39,11 +43,10 @@ def test_get_milestone_group(
assert response.status_code == 200
assert response.json() == {
"id": 2,
- "order": 1,
"text": {
- "de": {"title": "t3", "desc": "d3"},
- "en": {"title": "t4", "desc": "d4"},
- "fr": {"title": "t5", "desc": "d5"},
+ "1": {"title": "t3", "desc": "d3"},
+ "2": {"title": "t4", "desc": "d4"},
+ "3": {"title": "t5", "desc": "d5"},
},
"milestones": [],
}