diff --git a/.github/workflows/build-lawndon.yaml b/.github/workflows/build-lawndon.yaml index c66e320..5cf77df 100644 --- a/.github/workflows/build-lawndon.yaml +++ b/.github/workflows/build-lawndon.yaml @@ -93,6 +93,7 @@ jobs: tags: | ghcr.io/${{ github.repository_owner }}/lawndon-pi-server:${{ github.ref_name }} ghcr.io/${{ github.repository_owner }}/lawndon-pi-server:${{ github.sha }} + ghcr.io/${{ github.repository_owner }}/lawndon-pi-server:latest - name: Build and push UI image uses: docker/build-push-action@v6 @@ -104,3 +105,4 @@ jobs: tags: | ghcr.io/${{ github.repository_owner }}/lawndon-pi-ui:${{ github.ref_name }} ghcr.io/${{ github.repository_owner }}/lawndon-pi-ui:${{ github.sha }} + ghcr.io/${{ github.repository_owner }}/lawndon-pi-ui:latest diff --git a/pi/Dockerfile.ui b/pi/Dockerfile.ui index 5e9ccbd..2a3d982 100644 --- a/pi/Dockerfile.ui +++ b/pi/Dockerfile.ui @@ -15,7 +15,8 @@ RUN pnpm build # Runtime stage FROM nginx:alpine -COPY --from=build /usr/src/app/ui/dist /usr/share/nginx/html +COPY --from=build /usr/src/app/ui/dist /app +COPY --from=build /usr/src/app/ui/nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] diff --git a/pi/docker-compose.yaml b/pi/docker-compose.yaml index e92adc4..f9369c5 100644 --- a/pi/docker-compose.yaml +++ b/pi/docker-compose.yaml @@ -13,9 +13,7 @@ services: - app_network ui: - image: ghcr.io/jordojordo/uwb-ui:latest - environment: - VITE_NODE_ENV: production + image: ghcr.io/jordojordo/lawndon-pi-ui:latest ports: - "80:80" # Expose UI depends_on: diff --git a/pi/package.sh b/pi/package.sh deleted file mode 100755 index 0f33b8b..0000000 --- a/pi/package.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -set -e - -PROJECT_NAME="lawndon-pi" -TARGET_ARCHIVE="$PROJECT_NAME.tar.gz" -PI_USER="pi" -PI_HOST="192.168.12.1" -PI_PATH="/home/pi" - -echo "Starting the build and packaging process" - -echo "Cleaning up old builds" -rm -rf $PROJECT_NAME $TARGET_ARCHIVE - -echo "Building UI" -pnpm install:ui -pnpm build:ui - -echo "Building server" -pnpm install:server -pnpm build:server - -echo "Preparing the package directory" -mkdir $PROJECT_NAME -cp -r server/dist $PROJECT_NAME/server -cp -r server/node_modules $PROJECT_NAME/server -cp -r ui/dist $PROJECT_NAME/ui -cp -r config $PROJECT_NAME/ -cp package.json $PROJECT_NAME/ - -echo "Creating the tar.gz archive" -tar -czf $TARGET_ARCHIVE $PROJECT_NAME - -echo "Build and transfer complete" -echo "To run the app on the Raspberry Pi:" -echo "1. SSH into your Raspberry Pi: ssh $PI_USER@$PI_HOST" -echo "2. Unpack the archive: tar -xzf $TARGET_ARCHIVE" -echo "3. Navigate to the project: cd $PROJECT_NAME" -echo "4. Start the backend server: node server/server.js" diff --git a/pi/server/package.json b/pi/server/package.json index 561ecd2..6844c56 100644 --- a/pi/server/package.json +++ b/pi/server/package.json @@ -25,7 +25,7 @@ "devDependencies": { "@types/cors": "^2.8.17", "@types/express": "^5.0.0", - "@types/node": "^22.9.3", + "@types/node": "^22.10.0", "eslint": "^9.15.0", "globals": "^15.12.0", "http-proxy-middleware": "^3.0.3", diff --git a/pi/server/pnpm-lock.yaml b/pi/server/pnpm-lock.yaml index 3ccd431..77f056b 100644 --- a/pi/server/pnpm-lock.yaml +++ b/pi/server/pnpm-lock.yaml @@ -31,8 +31,8 @@ importers: specifier: ^5.0.0 version: 5.0.0 '@types/node': - specifier: ^22.9.3 - version: 22.9.4 + specifier: ^22.10.0 + version: 22.10.0 eslint: specifier: ^9.15.0 version: 9.15.0 @@ -47,10 +47,10 @@ importers: version: 3.1.7 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.9.4)(typescript@5.7.2) + version: 10.9.2(@types/node@22.10.0)(typescript@5.7.2) ts-node-dev: specifier: ^2.0.0 - version: 2.0.0(@types/node@22.9.4)(typescript@5.7.2) + version: 2.0.0(@types/node@22.10.0)(typescript@5.7.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -159,8 +159,8 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/express-serve-static-core@5.0.1': - resolution: {integrity: sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==} + '@types/express-serve-static-core@5.0.2': + resolution: {integrity: sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==} '@types/express@5.0.0': resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} @@ -177,8 +177,8 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/node@22.9.4': - resolution: {integrity: sha512-d9RWfoR7JC/87vj7n+PVTzGg9hDyuFjir3RxUHbjFSKNd9mpxbxwMEyaCim/ddCmy4IuW7HjTzF3g9p3EtWEOg==} + '@types/node@22.10.0': + resolution: {integrity: sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==} '@types/qs@6.9.17': resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} @@ -1007,8 +1007,8 @@ packages: undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -1148,23 +1148,23 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.9.4 + '@types/node': 22.10.0 '@types/connect@3.4.38': dependencies: - '@types/node': 22.9.4 + '@types/node': 22.10.0 '@types/cookie@0.4.1': {} '@types/cors@2.8.17': dependencies: - '@types/node': 22.9.4 + '@types/node': 22.10.0 '@types/estree@1.0.6': {} - '@types/express-serve-static-core@5.0.1': + '@types/express-serve-static-core@5.0.2': dependencies: - '@types/node': 22.9.4 + '@types/node': 22.10.0 '@types/qs': 6.9.17 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -1172,7 +1172,7 @@ snapshots: '@types/express@5.0.0': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 5.0.1 + '@types/express-serve-static-core': 5.0.2 '@types/qs': 6.9.17 '@types/serve-static': 1.15.7 @@ -1180,15 +1180,15 @@ snapshots: '@types/http-proxy@1.17.15': dependencies: - '@types/node': 22.9.4 + '@types/node': 22.10.0 '@types/json-schema@7.0.15': {} '@types/mime@1.3.5': {} - '@types/node@22.9.4': + '@types/node@22.10.0': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/qs@6.9.17': {} @@ -1197,12 +1197,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.9.4 + '@types/node': 22.10.0 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.9.4 + '@types/node': 22.10.0 '@types/send': 0.17.4 '@types/strip-bom@3.0.0': {} @@ -1388,7 +1388,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 22.9.4 + '@types/node': 22.10.0 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -2006,7 +2006,7 @@ snapshots: tree-kill@1.2.2: {} - ts-node-dev@2.0.0(@types/node@22.9.4)(typescript@5.7.2): + ts-node-dev@2.0.0(@types/node@22.10.0)(typescript@5.7.2): dependencies: chokidar: 3.6.0 dynamic-dedupe: 0.3.0 @@ -2016,7 +2016,7 @@ snapshots: rimraf: 2.7.1 source-map-support: 0.5.21 tree-kill: 1.2.2 - ts-node: 10.9.2(@types/node@22.9.4)(typescript@5.7.2) + ts-node: 10.9.2(@types/node@22.10.0)(typescript@5.7.2) tsconfig: 7.0.0 typescript: 5.7.2 transitivePeerDependencies: @@ -2024,14 +2024,14 @@ snapshots: - '@swc/wasm' - '@types/node' - ts-node@10.9.2(@types/node@22.9.4)(typescript@5.7.2): + ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.9.4 + '@types/node': 22.10.0 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -2064,7 +2064,7 @@ snapshots: undefsafe@2.0.5: {} - undici-types@6.19.8: {} + undici-types@6.20.0: {} unpipe@1.0.0: {} diff --git a/pi/ui/.env b/pi/ui/.env new file mode 100644 index 0000000..859bf67 --- /dev/null +++ b/pi/ui/.env @@ -0,0 +1 @@ +VITE_API_URL="http://localhost:5000" \ No newline at end of file diff --git a/pi/ui/env.d.ts b/pi/ui/env.d.ts index 27abeaf..c3540f9 100644 --- a/pi/ui/env.d.ts +++ b/pi/ui/env.d.ts @@ -1,8 +1,7 @@ // / interface ImportMetaEnv { - readonly VITE_NODE_ENV: string; - readonly VITE_BACKEND_URL: string; + readonly VITE_API_URL: string; readonly BASE_URL: string; readonly PROD: boolean } diff --git a/pi/ui/nginx.conf b/pi/ui/nginx.conf index dbd9288..e17598d 100644 --- a/pi/ui/nginx.conf +++ b/pi/ui/nginx.conf @@ -40,10 +40,20 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; + add_header Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With"; + + # Handle preflight requests + if ($request_method = 'OPTIONS') { + return 204; + } + access_log /var/log/nginx/api_access.log main; } - location /ws/ { + location /socket.io/ { proxy_pass http://server:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; @@ -52,6 +62,16 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; + add_header Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With"; + + # Handle preflight requests + if ($request_method = 'OPTIONS') { + return 204; + } + access_log /var/log/nginx/websocket_access.log main; } diff --git a/pi/ui/package.json b/pi/ui/package.json index 6b89254..1328e29 100644 --- a/pi/ui/package.json +++ b/pi/ui/package.json @@ -7,28 +7,26 @@ "dev": "NODE_ENV=development vite", "build": "vue-tsc --build --force && vite build", "preview": "vite preview", - "lint": "eslint . --fix", - "format": "prettier --write src/" + "lint": "eslint . --fix" }, "dependencies": { "d3": "^7.9.0", "pinia": "^2.2.6", "socket.io-client": "^4.8.1", "vue": "^3.5.13", - "vue-router": "^4.4.5" + "vue-router": "^4.5.0" }, "devDependencies": { "@tsconfig/node22": "^22.0.0", "@types/d3": "^7.4.3", - "@types/node": "^22.9.3", + "@types/node": "^22.10.0", "@vitejs/plugin-vue": "^5.2.0", "@vue/eslint-config-prettier": "^10.1.0", - "@vue/eslint-config-typescript": "^14.1.3", + "@vue/eslint-config-typescript": "^14.1.4", "@vue/tsconfig": "^0.6.0", "eslint": "^9.15.0", "eslint-plugin-vue": "^9.31.0", "npm-run-all2": "^7.0.1", - "prettier": "^3.3.3", "typescript": "~5.6.3", "vite": "^5.4.11", "vite-plugin-vue-devtools": "^7.6.4", diff --git a/pi/ui/pnpm-lock.yaml b/pi/ui/pnpm-lock.yaml index ed26d91..44a422b 100644 --- a/pi/ui/pnpm-lock.yaml +++ b/pi/ui/pnpm-lock.yaml @@ -21,7 +21,7 @@ importers: specifier: ^3.5.13 version: 3.5.13(typescript@5.6.3) vue-router: - specifier: ^4.4.5 + specifier: ^4.5.0 version: 4.5.0(vue@3.5.13(typescript@5.6.3)) devDependencies: '@tsconfig/node22': @@ -31,17 +31,17 @@ importers: specifier: ^7.4.3 version: 7.4.3 '@types/node': - specifier: ^22.9.3 - version: 22.9.4 + specifier: ^22.10.0 + version: 22.10.0 '@vitejs/plugin-vue': specifier: ^5.2.0 - version: 5.2.0(vite@5.4.11(@types/node@22.9.4))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.0(vite@5.4.11(@types/node@22.10.0))(vue@3.5.13(typescript@5.6.3)) '@vue/eslint-config-prettier': specifier: ^10.1.0 version: 10.1.0(eslint@9.15.0)(prettier@3.4.0) '@vue/eslint-config-typescript': - specifier: ^14.1.3 - version: 14.1.4(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-plugin-vue@9.31.0(eslint@9.15.0))(eslint@9.15.0)(typescript@5.6.3) + specifier: ^14.1.4 + version: 14.1.4(@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3))(eslint-plugin-vue@9.31.0(eslint@9.15.0))(eslint@9.15.0)(typescript@5.6.3) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) @@ -54,18 +54,15 @@ importers: npm-run-all2: specifier: ^7.0.1 version: 7.0.1 - prettier: - specifier: ^3.3.3 - version: 3.4.0 typescript: specifier: ~5.6.3 version: 5.6.3 vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.9.4) + version: 5.4.11(@types/node@22.10.0) vite-plugin-vue-devtools: specifier: ^7.6.4 - version: 7.6.4(rollup@4.27.4)(vite@5.4.11(@types/node@22.9.4))(vue@3.5.13(typescript@5.6.3)) + version: 7.6.4(rollup@4.27.4)(vite@5.4.11(@types/node@22.10.0))(vue@3.5.13(typescript@5.6.3)) vue-tsc: specifier: ^2.1.10 version: 2.1.10(typescript@5.6.3) @@ -627,8 +624,8 @@ packages: '@types/d3-time-format@4.0.3': resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} @@ -651,11 +648,11 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.9.4': - resolution: {integrity: sha512-d9RWfoR7JC/87vj7n+PVTzGg9hDyuFjir3RxUHbjFSKNd9mpxbxwMEyaCim/ddCmy4IuW7HjTzF3g9p3EtWEOg==} + '@types/node@22.10.0': + resolution: {integrity: sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==} - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + '@typescript-eslint/eslint-plugin@8.16.0': + resolution: {integrity: sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -665,8 +662,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + '@typescript-eslint/parser@8.16.0': + resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -675,12 +672,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + '@typescript-eslint/scope-manager@8.16.0': + resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + '@typescript-eslint/type-utils@8.16.0': + resolution: {integrity: sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -689,12 +686,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + '@typescript-eslint/types@8.16.0': + resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + '@typescript-eslint/typescript-estree@8.16.0': + resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -702,8 +699,8 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + '@typescript-eslint/utils@8.16.0': + resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -712,8 +709,8 @@ packages: typescript: optional: true - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + '@typescript-eslint/visitor-keys@8.16.0': + resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-vue@5.2.0': @@ -889,8 +886,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001683: - resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==} + caniuse-lite@1.0.30001684: + resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1086,8 +1083,8 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} - electron-to-chromium@1.5.64: - resolution: {integrity: sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==} + electron-to-chromium@1.5.65: + resolution: {integrity: sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==} engine.io-client@6.6.2: resolution: {integrity: sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==} @@ -1416,8 +1413,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string@0.30.13: - resolution: {integrity: sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} @@ -1697,8 +1694,8 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - ts-api-utils@1.4.1: - resolution: {integrity: sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==} + ts-api-utils@1.4.2: + resolution: {integrity: sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -1714,8 +1711,8 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typescript-eslint@8.15.0: - resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} + typescript-eslint@8.16.0: + resolution: {integrity: sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1729,8 +1726,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -1769,8 +1766,8 @@ packages: peerDependencies: vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 - vite-plugin-vue-inspector@5.2.0: - resolution: {integrity: sha512-wWxyb9XAtaIvV/Lr7cqB1HIzmHZFVUJsTNm3yAxkS87dgh/Ky4qr2wDEWNxF23fdhVa3jQ8MZREpr4XyiuaRqA==} + vite-plugin-vue-inspector@5.3.0: + resolution: {integrity: sha512-F6JNRUOrZl8FaUCTxPhsOLn2ka7N7Sz9ppxmmEwpybVBDYnhelbNnnlZpeFPc4ULnxbitSi8b0V2C0KT3CjReg==} peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 @@ -2364,7 +2361,7 @@ snapshots: '@types/d3-scale@4.0.8': dependencies: - '@types/d3-time': 3.0.3 + '@types/d3-time': 3.0.4 '@types/d3-selection@3.0.11': {} @@ -2374,7 +2371,7 @@ snapshots: '@types/d3-time-format@4.0.3': {} - '@types/d3-time@3.0.3': {} + '@types/d3-time@3.0.4': {} '@types/d3-timer@3.0.2': {} @@ -2414,7 +2411,7 @@ snapshots: '@types/d3-scale-chromatic': 3.0.3 '@types/d3-selection': 3.0.11 '@types/d3-shape': 3.1.6 - '@types/d3-time': 3.0.3 + '@types/d3-time': 3.0.4 '@types/d3-time-format': 4.0.3 '@types/d3-timer': 3.0.2 '@types/d3-transition': 3.0.9 @@ -2426,34 +2423,34 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.9.4': + '@types/node@22.10.0': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/parser': 8.16.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/type-utils': 8.16.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 eslint: 9.15.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.1(typescript@5.6.3) + ts-api-utils: 1.4.2(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 eslint: 9.15.0 optionalDependencies: @@ -2461,60 +2458,60 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.15.0': + '@typescript-eslint/scope-manager@8.16.0': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.16.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0)(typescript@5.6.3) debug: 4.3.7 eslint: 9.15.0 - ts-api-utils: 1.4.1(typescript@5.6.3) + ts-api-utils: 1.4.2(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.16.0': {} - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.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.4.1(typescript@5.6.3) + ts-api-utils: 1.4.2(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.16.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) eslint: 9.15.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.15.0': + '@typescript-eslint/visitor-keys@8.16.0': dependencies: - '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.9.4))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.10.0))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 5.4.11(@types/node@22.9.4) + vite: 5.4.11(@types/node@22.10.0) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.10': @@ -2580,7 +2577,7 @@ snapshots: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 - magic-string: 0.30.13 + magic-string: 0.30.14 postcss: 8.4.49 source-map-js: 1.2.1 @@ -2596,14 +2593,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.9.4))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.10.0))(vue@3.5.13(typescript@5.6.3))': dependencies: '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.9.4)) + vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.10.0)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite @@ -2631,13 +2628,13 @@ snapshots: transitivePeerDependencies: - '@types/eslint' - '@vue/eslint-config-typescript@14.1.4(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint-plugin-vue@9.31.0(eslint@9.15.0))(eslint@9.15.0)(typescript@5.6.3)': + '@vue/eslint-config-typescript@14.1.4(@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3))(eslint-plugin-vue@9.31.0(eslint@9.15.0))(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) eslint: 9.15.0 eslint-plugin-vue: 9.31.0(eslint@9.15.0) fast-glob: 3.3.2 - typescript-eslint: 8.15.0(eslint@9.15.0)(typescript@5.6.3) + typescript-eslint: 8.16.0(eslint@9.15.0)(typescript@5.6.3) vue-eslint-parser: 9.4.3(eslint@9.15.0) optionalDependencies: typescript: 5.6.3 @@ -2731,8 +2728,8 @@ snapshots: browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001683 - electron-to-chromium: 1.5.64 + caniuse-lite: 1.0.30001684 + electron-to-chromium: 1.5.65 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -2742,7 +2739,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001683: {} + caniuse-lite@1.0.30001684: {} chalk@4.1.2: dependencies: @@ -2948,7 +2945,7 @@ snapshots: dependencies: robust-predicates: 3.0.2 - electron-to-chromium@1.5.64: {} + electron-to-chromium@1.5.65: {} engine.io-client@6.6.2: dependencies: @@ -3287,7 +3284,7 @@ snapshots: dependencies: yallist: 3.1.1 - magic-string@0.30.13: + magic-string@0.30.14: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -3544,7 +3541,7 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@1.4.1(typescript@5.6.3): + ts-api-utils@1.4.2(typescript@5.6.3): dependencies: typescript: 5.6.3 @@ -3556,11 +3553,11 @@ snapshots: type-fest@0.20.2: {} - typescript-eslint@8.15.0(eslint@9.15.0)(typescript@5.6.3): + typescript-eslint@8.16.0(eslint@9.15.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.16.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0)(typescript@5.6.3) eslint: 9.15.0 optionalDependencies: typescript: 5.6.3 @@ -3569,7 +3566,7 @@ snapshots: typescript@5.6.3: {} - undici-types@6.19.8: {} + undici-types@6.20.0: {} universalify@2.0.1: {} @@ -3585,11 +3582,11 @@ snapshots: util-deprecate@1.0.2: {} - vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.9.4)): + vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.10.0)): dependencies: - vite: 5.4.11(@types/node@22.9.4) + vite: 5.4.11(@types/node@22.10.0) - vite-plugin-inspect@0.8.8(rollup@4.27.4)(vite@5.4.11(@types/node@22.9.4)): + vite-plugin-inspect@0.8.8(rollup@4.27.4)(vite@5.4.11(@types/node@22.10.0)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.27.4) @@ -3600,28 +3597,28 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.0 - vite: 5.4.11(@types/node@22.9.4) + vite: 5.4.11(@types/node@22.10.0) transitivePeerDependencies: - rollup - supports-color - vite-plugin-vue-devtools@7.6.4(rollup@4.27.4)(vite@5.4.11(@types/node@22.9.4))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.4(rollup@4.27.4)(vite@5.4.11(@types/node@22.10.0))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.9.4))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.10.0))(vue@3.5.13(typescript@5.6.3)) '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 execa: 8.0.1 sirv: 3.0.0 - vite: 5.4.11(@types/node@22.9.4) - vite-plugin-inspect: 0.8.8(rollup@4.27.4)(vite@5.4.11(@types/node@22.9.4)) - vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.9.4)) + vite: 5.4.11(@types/node@22.10.0) + vite-plugin-inspect: 0.8.8(rollup@4.27.4)(vite@5.4.11(@types/node@22.10.0)) + vite-plugin-vue-inspector: 5.3.0(vite@5.4.11(@types/node@22.10.0)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.9.4)): + vite-plugin-vue-inspector@5.3.0(vite@5.4.11(@types/node@22.10.0)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -3631,18 +3628,18 @@ snapshots: '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) '@vue/compiler-dom': 3.5.13 kolorist: 1.8.0 - magic-string: 0.30.13 - vite: 5.4.11(@types/node@22.9.4) + magic-string: 0.30.14 + vite: 5.4.11(@types/node@22.10.0) transitivePeerDependencies: - supports-color - vite@5.4.11(@types/node@22.9.4): + vite@5.4.11(@types/node@22.10.0): dependencies: esbuild: 0.21.5 postcss: 8.4.49 rollup: 4.27.4 optionalDependencies: - '@types/node': 22.9.4 + '@types/node': 22.10.0 fsevents: 2.3.3 vscode-uri@3.0.8: {} diff --git a/pi/ui/src/components/UWBVisualization.vue b/pi/ui/src/components/UWBVisualization.vue index 217ec07..f33493d 100644 --- a/pi/ui/src/components/UWBVisualization.vue +++ b/pi/ui/src/components/UWBVisualization.vue @@ -16,7 +16,7 @@ interface AnchorConfig { export default defineComponent({ name: 'UWBVisualization', setup() { - const backendUrl = import.meta.env.VITE_BACKEND_URL || 'http://localhost:5000'; + const backendUrl = import.meta.env.VITE_API_URL || window.location.origin; const socket = inject('socket') as Socket; const uwbData = ref([]); diff --git a/pi/ui/src/main.ts b/pi/ui/src/main.ts index 57cfd44..6c8739c 100644 --- a/pi/ui/src/main.ts +++ b/pi/ui/src/main.ts @@ -9,7 +9,7 @@ import router from './router'; const app = createApp(App); -const backendUrl = import.meta.env.VITE_BACKEND_URL || 'http://localhost:5000'; +const backendUrl = import.meta.env.VITE_API_URL || window.location.origin; const socket: Socket = io(backendUrl, { transports: ['websocket'] }); app.provide('socket', socket); diff --git a/pi/ui/vite.config.ts b/pi/ui/vite.config.ts index 6c1b071..65a696c 100644 --- a/pi/ui/vite.config.ts +++ b/pi/ui/vite.config.ts @@ -1,9 +1,30 @@ import { fileURLToPath, URL } from 'node:url'; +import os from 'os'; import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import vueDevTools from 'vite-plugin-vue-devtools'; +function getLocalIP() { + const networkInterfaces = os.networkInterfaces(); + + for (const interfaceName in networkInterfaces) { + const interfaceInfo = networkInterfaces[interfaceName]; + + if (!interfaceInfo) { + continue; + } + + for (const info of interfaceInfo) { + if (info.family === 'IPv4' && !info.internal) { + return info.address; + } + } + } + + return 'localhost'; // Fallback to localhost if no external IP is found +} + // https://vite.dev/config/ export default defineConfig({ plugins: [ @@ -11,5 +32,8 @@ export default defineConfig({ vueDevTools(), ], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } }, - server: { proxy: { '/api': 'http://localhost:5000' } }, + server: { + proxy: { '/api': 'http://localhost:5000' }, + host: getLocalIP() + }, });