From 193e43ddc517f430cb2dc33da72996686af5e077 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 9 May 2026 15:24:14 +0200 Subject: [PATCH 1/5] package update --- interface/package.json | 6 +-- interface/pnpm-lock.yaml | 102 +++++++++++++++++++-------------------- mock-api/package.json | 2 +- 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/interface/package.json b/interface/package.json index a6c710489..e51d67805 100644 --- a/interface/package.json +++ b/interface/package.json @@ -47,7 +47,7 @@ "@eslint/js": "^10.0.1", "@preact/preset-vite": "^2.10.5", "@trivago/prettier-plugin-sort-imports": "^6.0.2", - "@types/node": "^25.6.0", + "@types/node": "^25.6.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "concurrently": "^9.2.1", @@ -55,10 +55,10 @@ "eslint-config-prettier": "^10.1.8", "prettier": "^3.8.3", "rollup-plugin-visualizer": "^7.0.1", - "terser": "^5.47.0", + "terser": "^5.47.1", "typescript-eslint": "^8.59.2", "vite": "^8.0.11", "vite-plugin-imagemin": "^0.6.1" }, - "packageManager": "pnpm@10.33.4" + "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800" } diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index 86ab6ae28..b99a50178 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -71,13 +71,13 @@ importers: version: 10.0.1(eslint@10.3.0) '@preact/preset-vite': specifier: ^2.10.5 - version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) '@trivago/prettier-plugin-sort-imports': specifier: ^6.0.2 version: 6.0.2(prettier@3.8.3) '@types/node': - specifier: ^25.6.0 - version: 25.6.0 + specifier: ^25.6.2 + version: 25.6.2 '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -100,17 +100,17 @@ importers: specifier: ^7.0.1 version: 7.0.1(rolldown@1.0.0-rc.18)(rollup@4.59.0) terser: - specifier: ^5.47.0 - version: 5.47.0 + specifier: ^5.47.1 + version: 5.47.1 typescript-eslint: specifier: ^8.59.2 version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) vite: specifier: ^8.0.11 - version: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) vite-plugin-imagemin: specifier: ^0.6.1 - version: 0.6.1(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + version: 0.6.1(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) packages: @@ -985,8 +985,8 @@ packages: resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - '@types/node@25.6.0': - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + '@types/node@25.6.2': + resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1154,8 +1154,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.27: - resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + baseline-browser-mapping@2.10.28: + resolution: {integrity: sha512-Ic44hnOtFIgravCunj1ifSoQPSUrkNiJuH9Mf6jr2jjoA74icqV8wU0KuadXeOR8zuIJMOoTv0GuQjZ9ZYNMeA==} engines: {node: '>=6.0.0'} hasBin: true @@ -1191,8 +1191,8 @@ packages: brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -1486,8 +1486,8 @@ packages: duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - electron-to-chromium@1.5.352: - resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} + electron-to-chromium@1.5.353: + resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1884,8 +1884,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -2903,8 +2903,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} engines: {node: '>=10'} hasBin: true @@ -3090,8 +3090,8 @@ packages: resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==} engines: {node: '>=4'} - terser@5.47.0: - resolution: {integrity: sha512-TV+JFkQFtljk12ffyYAA4+zVF4Hs+qaROsT+Qo9o2/z39x+IUn+pvsmomiCPlp5YigfR1OdbGHOvc0L+Ca1X7g==} + terser@5.47.1: + resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==} engines: {node: '>=10'} hasBin: true @@ -3843,19 +3843,19 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0))': + '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) - vite-prerender-plugin: 0.5.13(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite-prerender-plugin: 0.5.13(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact @@ -3870,7 +3870,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0))': + '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1))': dependencies: '@babel/core': 7.29.0 '@prefresh/babel-plugin': 0.5.3 @@ -3878,7 +3878,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.29.1 - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color @@ -4061,7 +4061,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@types/imagemin-gifsicle@7.0.4': dependencies: @@ -4090,19 +4090,19 @@ snapshots: '@types/imagemin@7.0.1': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@types/json-schema@7.0.15': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@types/minimatch@6.0.0': dependencies: minimatch: 10.2.5 - '@types/node@25.6.0': + '@types/node@25.6.2': dependencies: undici-types: 7.19.2 @@ -4124,11 +4124,11 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@types/svgo@2.6.4': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: @@ -4198,7 +4198,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.7.4 + semver: 7.8.0 tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 @@ -4285,7 +4285,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.27: {} + baseline-browser-mapping@2.10.28: {} bin-build@3.0.0: dependencies: @@ -4336,7 +4336,7 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -4346,9 +4346,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.27 + baseline-browser-mapping: 2.10.28 caniuse-lite: 1.0.30001792 - electron-to-chromium: 1.5.352 + electron-to-chromium: 1.5.353 node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -4707,7 +4707,7 @@ snapshots: duplexer3@0.1.5: {} - electron-to-chromium@1.5.352: {} + electron-to-chromium@1.5.353: {} emoji-regex@10.6.0: {} @@ -5106,7 +5106,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.5.0: {} + get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: dependencies: @@ -5641,7 +5641,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minimatch@3.1.5: dependencies: @@ -6102,7 +6102,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.4: {} + semver@7.8.0: {} set-cookie-parser@2.7.2: {} @@ -6197,7 +6197,7 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 string_decoder@1.1.1: @@ -6279,7 +6279,7 @@ snapshots: temp-dir: 1.0.0 uuid: 3.4.0 - terser@5.47.0: + terser@5.47.1: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -6390,7 +6390,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-plugin-imagemin@0.6.1(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)): + vite-plugin-imagemin@0.6.1(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): dependencies: '@types/imagemin': 7.0.1 '@types/imagemin-gifsicle': 7.0.4 @@ -6415,11 +6415,11 @@ snapshots: imagemin-webp: 6.1.0 jpegtran-bin: 6.0.1 pathe: 0.2.0 - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.13(vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0)): + vite-prerender-plugin@0.5.13(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -6427,9 +6427,9 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0 - vite: 8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0) + vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) - vite@8.0.11(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.47.0): + vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -6437,10 +6437,10 @@ snapshots: rolldown: 1.0.0-rc.18 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 esbuild: 0.27.4 fsevents: 2.3.3 - terser: 5.47.0 + terser: 5.47.1 which-typed-array@1.1.20: dependencies: diff --git a/mock-api/package.json b/mock-api/package.json index 415936c9e..e02d47946 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -15,5 +15,5 @@ "itty-router": "^5.0.23", "prettier": "^3.8.3" }, - "packageManager": "pnpm@10.33.3+sha512.a19744364a7e248b92657a4ca5973f9354d21caf982579674b1c539f32c7420c47138ad8b1254df07aba9bc782d9b3029e3db34d5dbff974326eb74dac8ff489" + "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800" } From 76a23870d55905889c8416e9944c8abc33f4c547 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 9 May 2026 15:24:45 +0200 Subject: [PATCH 2/5] force littlefs to v2.0 --- platformio.ini | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 68416221c..d526fbd8c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -59,7 +59,7 @@ framework = arduino board_build.partitions = partitions/esp32_partition_4M.csv board_upload.flash_size = 4MB board_build.app_partition_name = app0 -platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.04.50/platform-espressif32.zip ; Platform 2026.04.50 Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407 +platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.05.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407 ; 16MB Flash variants [espressif32_base_16M] @@ -67,7 +67,7 @@ framework = arduino board_build.partitions = partitions/esp32_partition_16M.csv board_upload.flash_size = 16MB board_build.app_partition_name = app0 -platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.04.50/platform-espressif32.zip ; Platform 2026.04.50 Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407 +platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.05.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407 ; 32MB Flash variants [espressif32_base_32M] @@ -75,7 +75,7 @@ framework = arduino board_build.partitions = partitions/esp32_partition_32M.csv board_upload.flash_size = 32MB board_build.app_partition_name = app0 -platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.04.50/platform-espressif32.zip ; Platform 2026.04.50 Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407 +platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.05.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.8 based on IDF 5.5.4.260407 [env] build_flags = @@ -88,6 +88,7 @@ monitor_speed = 115200 monitor_filters = direct build_type = release board_build.filesystem = littlefs +board_build.littlefs_version = 2.0 lib_deps = bblanchon/ArduinoJson @ 7.4.3 ESP32Async/AsyncTCP @ 3.4.10 From 57997d0acbd1ba15d204780328c06575a285b403 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 9 May 2026 15:25:06 +0200 Subject: [PATCH 3/5] enable OTA uploads of filesystem (pre_load.json) --- .gitignore | 1 + data/pre_load.json | 45 +++++--------- src/ESP32React/UploadFileService.cpp | 91 ++++++++++++++++++++-------- src/ESP32React/UploadFileService.h | 3 +- src/core/emsesp.cpp | 10 +++ src/core/network.cpp | 2 +- src/core/system.cpp | 41 +++++++++++-- src/core/system.h | 2 + src/test/test.cpp | 39 ------------ src/test/test.h | 1 - 10 files changed, 134 insertions(+), 101 deletions(-) diff --git a/.gitignore b/.gitignore index 15466ba7c..78f38399a 100644 --- a/.gitignore +++ b/.gitignore @@ -77,3 +77,4 @@ pnpm-lock.yaml interface/.tsbuildinfo test/test_api/package-lock.json .clangd +mklittlefs diff --git a/data/pre_load.json b/data/pre_load.json index cd5fdd2c7..6459dc0a6 100644 --- a/data/pre_load.json +++ b/data/pre_load.json @@ -1,7 +1,6 @@ { "type": "systembackup", - "version": "3.8.2", - "date": "2026-03-29T13:28:15", + "version": "3.9.0", "systembackup": [ { "type": "settings", @@ -9,7 +8,7 @@ "ssid": "", "bssid": "", "password": "", - "hostname": "ems-esp", + "hostname": "ems-esp2", "static_ip_config": false, "bandwidth20": false, "nosleep": true, @@ -19,7 +18,7 @@ "tx_power": 0 }, "AP": { - "provision_mode": 2, + "provision_mode": 1, "ssid": "ems-esp", "password": "ems-esp-neo", "channel": 1, @@ -62,7 +61,7 @@ "send_response": false }, "NTP": { - "enabled": true, + "enabled": false, "server": "time.google.com", "tz_label": "Europe/Amsterdam", "tz_format": "CET-1CEST,M3.5.0,M10.5.0/3" @@ -83,7 +82,7 @@ ] }, "Settings": { - "version": "3.8.2", + "version": "3.9.0", "board_profile": "E32V2_2", "platform": "ESP32", "locale": "en", @@ -132,7 +131,7 @@ "modbus_port": 502, "modbus_max_clients": 10, "modbus_timeout": 300, - "developer_mode": true, + "developer_mode": false, "email_enabled": false, "email_ssl": false, "email_starttls": true, @@ -154,14 +153,6 @@ { "type": "customizations", "Customizations": { - "ts": [ - { - "id": "28_1767_7B13_2502", - "name": "gateway_temperature", - "offset": 0, - "is_system": true - } - ], "as": [ { "gpio": 39, @@ -207,22 +198,14 @@ } }, { - "type": "customSupport", - "Support": { - "html": [ - "This product is installed and managed by:", - "", - "Bosch Installer Example", - "", - "Nefit Road 12", - "1234 AB Amsterdam", - "Phone: +31 123 456 789", - "email: support@boschinstaller.nl", - "", - "For help and questions please contact your installer." - ], - "img_url": "https://emsesp.org/media/images/designer.png" - } + "type": "nvs", + "nvs": [ + { + "type": 1, + "key": "fresh_firmware", + "value": 0 + } + ] } ] } \ No newline at end of file diff --git a/src/ESP32React/UploadFileService.cpp b/src/ESP32React/UploadFileService.cpp index 3d4e99152..4d0209d1f 100644 --- a/src/ESP32React/UploadFileService.cpp +++ b/src/ESP32React/UploadFileService.cpp @@ -4,6 +4,7 @@ #include #include +// #include static String getFilenameExtension(const String & filename) { const auto pos = filename.lastIndexOf('.'); @@ -16,8 +17,8 @@ static String getFilenameExtension(const String & filename) { UploadFileService::UploadFileService(AsyncWebServer * server, SecurityManager * securityManager) : _securityManager(securityManager) , _is_firmware(false) + , _is_filesystem(false) , _md5() { - // upload a file via a form server->on( UPLOAD_FILE_PATH, HTTP_POST, @@ -41,8 +42,14 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri const String extension = getFilenameExtension(filename); const std::size_t filesize = request->contentLength(); - _is_firmware = false; - if ((extension == "bin") && (filesize > 1000000)) { + _is_firmware = false; + _is_filesystem = false; + + if (extension == "bin" && filename.endsWith("littlefs.bin")) { + // LittleFS filesystem image + _is_filesystem = true; + _md5[0] = '\0'; // clear any stale md5 so Update.end() doesn't compare against it + } else if ((extension == "bin") && (filesize > 2000000)) { _is_firmware = true; } else if (extension == "json") { _md5[0] = '\0'; // clear md5 @@ -88,6 +95,7 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri #endif // it's firmware - initialize the ArduinoOTA updater emsesp::EMSESP::logger().info("Uploading firmware file %s (size: %d KB). Please wait...", filename.c_str(), filesize / 1024); + // turn off UART to prevent interference with the upload emsesp::EMSuart::stop(); @@ -96,28 +104,55 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri Update.setMD5(_md5.data()); _md5.front() = '\0'; } - request->onDisconnect([this] { handleEarlyDisconnect(); }); // success, let's make sure we end the update if the client hangs up + request->onDisconnect([this] { handleDisconnect(); }); // success, let's make sure we end the update if the client hangs up } else { handleError(request, 507); // failed to begin, send an error response Insufficient Storage return; } + } else if (_is_filesystem) { + // LittleFS filesystem image - flash directly to the spiffs/littlefs partition + emsesp::EMSESP::logger().info("Uploading filesystem image %s (size: %u KB). Please wait...", filename.c_str(), static_cast(filesize / 1024)); + emsesp::EMSuart::stop(); + LittleFS.end(); // unmount LittleFS before we overwrite the partition under it + + // request->contentLength() is the multipart HTTP body size, not the file size, + // so it can exceed the partition by a few hundred bytes. Use UPDATE_SIZE_UNKNOWN + // and let the Update library size against the whole partition. + if (Update.begin(UPDATE_SIZE_UNKNOWN, U_SPIFFS)) { + // emsesp::EMSESP::logger().info("Update.begin(U_SPIFFS) ok, partition size %u bytes", static_cast(Update.size())); + request->onDisconnect([this] { handleDisconnect(); }); + } else { + emsesp::EMSESP::logger().err("Update.begin(U_SPIFFS) failed: %s", Update.errorString()); + handleError(request, 507); + return; + } } else { // its a normal file, open a new temp file to write the contents too request->_tempFile = LittleFS.open(TEMP_FILENAME_PATH, "w"); } } - if (!_is_firmware) { - if (len && len != request->_tempFile.write(data, len)) { // stream the incoming chunk to the opened file - handleError(request, 507); // 507-Insufficient Storage - } - } else if (!request->_tempObject) { // if we haven't delt with an error, continue with the firmware update - if (Update.write(data, len) != len) { - handleError(request, 500); // internal error, failed - return; - } - if (final && !Update.end(true)) { - handleError(request, 500); // internal error, failed + if (_is_firmware || _is_filesystem) { + if (!request->_tempObject) { // if we haven't delt with an error, continue with the OTA update + if (Update.write(data, len) != len) { + emsesp::EMSESP::logger().err("Update.write failed at offset %u (chunk %u): %s", + static_cast(Update.progress()), + static_cast(len), + Update.errorString()); + handleError(request, 500); // internal error, failed + return; + } + if (final) { + if (!Update.end(true)) { + emsesp::EMSESP::logger().err("Update.end failed: %s", Update.errorString()); + handleError(request, 500); + return; + } + } + } else { + if (len && len != request->_tempFile.write(data, len)) { // stream the incoming chunk to the opened file + handleError(request, 507); // 507-Insufficient Storage + } } } } @@ -135,11 +170,13 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) { return; } - // check if it was a firmware upgrade - // if no error, send the success response as a JSON - if (_is_firmware && !request->_tempObject) { - // set NVS to tell EMS-ESP this is a new fresh firmware on next restart - emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true); + // check if it was a firmware or filesystem image upgrade + // if no error, send the success response and request a restart + if ((_is_firmware || _is_filesystem) && !request->_tempObject) { + if (_is_firmware) { + // set NVS to tell EMS-ESP this is a new fresh firmware on next restart + emsesp::EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, true); + } AsyncWebServerResponse * response = request->beginResponse(200); request->send(response); @@ -178,15 +215,21 @@ void UploadFileService::handleError(AsyncWebServerRequest * request, int code) { // that is caught by the web code. Unfortunately the http error code is not sent to the client on fast network connections if (code == 406) { request->client()->close(); - _is_firmware = false; + _is_firmware = false; + _is_filesystem = false; Update.abort(); } + + // if we aborted a filesystem upload, remount LittleFS so the device keeps working + if (_is_filesystem) { + LittleFS.begin(); + } } -void UploadFileService::handleEarlyDisconnect() { +void UploadFileService::handleDisconnect() { emsesp::EMSESP::logger().info("Upload finished"); emsesp::EMSESP::system_.uart_init(); // re-enable UART - _is_firmware = false; - Update.abort(); + _is_firmware = false; + _is_filesystem = false; } diff --git a/src/ESP32React/UploadFileService.h b/src/ESP32React/UploadFileService.h index 352342148..4c8a20dbb 100644 --- a/src/ESP32React/UploadFileService.h +++ b/src/ESP32React/UploadFileService.h @@ -22,13 +22,14 @@ class UploadFileService { private: SecurityManager * _securityManager; bool _is_firmware; + bool _is_filesystem; std::array _md5; void handleUpload(AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t * data, size_t len, bool final); void uploadComplete(AsyncWebServerRequest * request); void handleError(AsyncWebServerRequest * request, int code); - void handleEarlyDisconnect(); + void handleDisconnect(); }; #endif \ No newline at end of file diff --git a/src/core/emsesp.cpp b/src/core/emsesp.cpp index 330210591..a550e8307 100644 --- a/src/core/emsesp.cpp +++ b/src/core/emsesp.cpp @@ -1711,6 +1711,11 @@ void EMSESP::start() { bool factory_settings = false; #endif +#if defined(EMSESP_DEBUG) + // LOG_DEBUG("Listing root directory before:"); + // system_.listDir("/", 3); // show the contents of the root directory +#endif + // start NVS storage if (!nvs_.begin("ems-esp", false, "nvs1")) { // try bigger nvs partition on 16M flash first nvs_.begin("ems-esp", false, "nvs"); // fallback to small nvs @@ -1725,6 +1730,11 @@ void EMSESP::start() { // loads core system services settings (mqtt, ap, ntp etc) esp32React.begin(); +#if defined(EMSESP_DEBUG) + // LOG_DEBUG("Listing root directory after:"); + // system_.listDir("/", 3); // show the contents of the root directory +#endif + #ifndef EMSESP_STANDALONE if (factory_settings) { LOG_WARNING("No settings found on filesystem. Using factory settings."); diff --git a/src/core/network.cpp b/src/core/network.cpp index ff9420ae9..bf09d8288 100644 --- a/src/core/network.cpp +++ b/src/core/network.cpp @@ -412,7 +412,7 @@ void Network::startmDNS() const { MDNS.addService("telnet", "tcp", 23); // add our telnet console MDNS.addServiceTxt("http", "tcp", "address", address_s.c_str()); - emsesp::EMSESP::logger().info("Starting mDNS Responder service"); + emsesp::EMSESP::logger().info("Starting mDNS Responder service for %s", address_s.c_str()); #endif } diff --git a/src/core/system.cpp b/src/core/system.cpp index ad33f5c13..093d73b37 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -732,18 +732,16 @@ void System::start() { last_system_check_ = 0; // force the LED to go from fast flash to pulse uart_init(); // start UART syslog_init(); // start syslog - modbus_init(); // start modbus + modbus_init(); // start modbus } // button single click void System::button_OnClick(PButton & b) { LOG_NOTICE("Button pressed - single click"); -#if defined(EMSESP_TEST) #ifndef EMSESP_STANDALONE // show filesystem - Test::listDir(LittleFS, "/", 3); -#endif + listDir("/", 3); #endif } @@ -3478,4 +3476,39 @@ void System::restore_snapshot_gpios(std::vector & u_gpios, std::vector Date: Tue, 12 May 2026 19:44:59 +0200 Subject: [PATCH 4/5] fix json uploads --- src/ESP32React/UploadFileService.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/ESP32React/UploadFileService.cpp b/src/ESP32React/UploadFileService.cpp index 4d0209d1f..0d8c471cb 100644 --- a/src/ESP32React/UploadFileService.cpp +++ b/src/ESP32React/UploadFileService.cpp @@ -133,9 +133,10 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri } if (_is_firmware || _is_filesystem) { - if (!request->_tempObject) { // if we haven't delt with an error, continue with the OTA update + if (!request->_tempObject) { + //continue with the OTA update if (Update.write(data, len) != len) { - emsesp::EMSESP::logger().err("Update.write failed at offset %u (chunk %u): %s", + emsesp::EMSESP::logger().err("OTA update failed at offset %u (chunk %u): %s", static_cast(Update.progress()), static_cast(len), Update.errorString()); @@ -144,15 +145,16 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri } if (final) { if (!Update.end(true)) { - emsesp::EMSESP::logger().err("Update.end failed: %s", Update.errorString()); - handleError(request, 500); + emsesp::EMSESP::logger().err("OTA update failed: %s", Update.errorString()); + handleError(request, 500); // internal error, failed return; } } - } else { - if (len && len != request->_tempFile.write(data, len)) { // stream the incoming chunk to the opened file - handleError(request, 507); // 507-Insufficient Storage - } + } + } else { + // stream the incoming chunk to the opened file + if (len && len != request->_tempFile.write(data, len)) { + handleError(request, 507); // 507-Insufficient Storage } } } From fcc56a9bf664e7ea32b3ae481117ad83bb21901f Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 12 May 2026 19:45:04 +0200 Subject: [PATCH 5/5] package update --- interface/package.json | 6 +- interface/pnpm-lock.yaml | 366 +++++++++++++++++++-------------------- 2 files changed, 186 insertions(+), 186 deletions(-) diff --git a/interface/package.json b/interface/package.json index e51d67805..15589b20c 100644 --- a/interface/package.json +++ b/interface/package.json @@ -47,7 +47,7 @@ "@eslint/js": "^10.0.1", "@preact/preset-vite": "^2.10.5", "@trivago/prettier-plugin-sort-imports": "^6.0.2", - "@types/node": "^25.6.2", + "@types/node": "^25.7.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "concurrently": "^9.2.1", @@ -56,8 +56,8 @@ "prettier": "^3.8.3", "rollup-plugin-visualizer": "^7.0.1", "terser": "^5.47.1", - "typescript-eslint": "^8.59.2", - "vite": "^8.0.11", + "typescript-eslint": "^8.59.3", + "vite": "^8.0.12", "vite-plugin-imagemin": "^0.6.1" }, "packageManager": "pnpm@10.33.4+sha512.1c67b3b359b2d408119ba1ed289f34b8fc3c6873412bec6fd264fbdc82489e510fcbecb9ce9d22dae7f3b76269d8441046014bdca53b9979cd7a561ad631b800" diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index b99a50178..6cbebc05a 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -71,13 +71,13 @@ importers: version: 10.0.1(eslint@10.3.0) '@preact/preset-vite': specifier: ^2.10.5 - version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) '@trivago/prettier-plugin-sort-imports': specifier: ^6.0.2 version: 6.0.2(prettier@3.8.3) '@types/node': - specifier: ^25.6.2 - version: 25.6.2 + specifier: ^25.7.0 + version: 25.7.0 '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -98,19 +98,19 @@ importers: version: 3.8.3 rollup-plugin-visualizer: specifier: ^7.0.1 - version: 7.0.1(rolldown@1.0.0-rc.18)(rollup@4.59.0) + version: 7.0.1(rolldown@1.0.0)(rollup@4.59.0) terser: specifier: ^5.47.1 version: 5.47.1 typescript-eslint: - specifier: ^8.59.2 - version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) + specifier: ^8.59.3 + version: 8.59.3(eslint@10.3.0)(typescript@6.0.3) vite: - specifier: ^8.0.11 - version: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + specifier: ^8.0.12 + version: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) vite-plugin-imagemin: specifier: ^0.6.1 - version: 0.6.1(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + version: 0.6.1(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) packages: @@ -631,8 +631,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.128.0': - resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -646,8 +646,8 @@ packages: '@prefresh/babel-plugin@0.5.3': resolution: {integrity: sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==} - '@prefresh/core@1.5.9': - resolution: {integrity: sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==} + '@prefresh/core@1.5.10': + resolution: {integrity: sha512-7yPTFbG56sutaFu8krp3B4a200KOFUvrtlllKWRuLjsYXo9UUucHOZRcer+gtgMkFTpv6ob8TGcTwA32bSwa1w==} peerDependencies: preact: ^10.0.0 || ^11.0.0-0 @@ -660,103 +660,103 @@ packages: preact: ^10.4.0 || ^11.0.0-0 vite: '>=2.0.0' - '@rolldown/binding-android-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} + '@rolldown/binding-android-arm64@1.0.0': + resolution: {integrity: sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} + '@rolldown/binding-darwin-arm64@1.0.0': + resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.18': - resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} + '@rolldown/binding-darwin-x64@1.0.0': + resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': - resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} + '@rolldown/binding-freebsd-x64@1.0.0': + resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': - resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} + '@rolldown/binding-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} + '@rolldown/binding-linux-s390x-gnu@1.0.0': + resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} + '@rolldown/binding-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} + '@rolldown/binding-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} + '@rolldown/binding-openharmony-arm64@1.0.0': + resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': - resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} + '@rolldown/binding-wasm32-wasi@1.0.0': + resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} + '@rolldown/binding-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} + '@rolldown/binding-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.18': - resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -985,8 +985,8 @@ packages: resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - '@types/node@25.6.2': - resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} + '@types/node@25.7.0': + resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1013,63 +1013,63 @@ packages: '@types/svgo@2.6.4': resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} - '@typescript-eslint/eslint-plugin@8.59.2': - resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} + '@typescript-eslint/eslint-plugin@8.59.3': + resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.2 + '@typescript-eslint/parser': ^8.59.3 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.2': - resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} + '@typescript-eslint/parser@8.59.3': + resolution: {integrity: sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.2': - resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} + '@typescript-eslint/project-service@8.59.3': + resolution: {integrity: sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.2': - resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} + '@typescript-eslint/scope-manager@8.59.3': + resolution: {integrity: sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.2': - resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} + '@typescript-eslint/tsconfig-utils@8.59.3': + resolution: {integrity: sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.2': - resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} + '@typescript-eslint/type-utils@8.59.3': + resolution: {integrity: sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.2': - resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} + '@typescript-eslint/types@8.59.3': + resolution: {integrity: sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.2': - resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} + '@typescript-eslint/typescript-estree@8.59.3': + resolution: {integrity: sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.2': - resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} + '@typescript-eslint/utils@8.59.3': + resolution: {integrity: sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.2': - resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} + '@typescript-eslint/visitor-keys@8.59.3': + resolution: {integrity: sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -1154,8 +1154,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.28: - resolution: {integrity: sha512-Ic44hnOtFIgravCunj1ifSoQPSUrkNiJuH9Mf6jr2jjoA74icqV8wU0KuadXeOR8zuIJMOoTv0GuQjZ9ZYNMeA==} + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -2473,8 +2473,8 @@ packages: node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - node-releases@2.0.38: - resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + node-releases@2.0.44: + resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -2837,8 +2837,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rolldown@1.0.0-rc.18: - resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3156,8 +3156,8 @@ packages: peerDependencies: typescript: '>=3.5.1' - typescript-eslint@8.59.2: - resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} + typescript-eslint@8.59.3: + resolution: {integrity: sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3171,8 +3171,8 @@ packages: unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici-types@7.21.0: + resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -3220,8 +3220,8 @@ packages: peerDependencies: vite: 5.x || 6.x || 7.x || 8.x - vite@8.0.11: - resolution: {integrity: sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==} + vite@8.0.12: + resolution: {integrity: sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3839,23 +3839,23 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.128.0': {} + '@oxc-project/types@0.129.0': {} '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1))': + '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) - vite-prerender-plugin: 0.5.13(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) + vite-prerender-plugin: 0.5.13(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact @@ -3864,74 +3864,74 @@ snapshots: '@prefresh/babel-plugin@0.5.3': {} - '@prefresh/core@1.5.9(preact@10.29.1)': + '@prefresh/core@1.5.10(preact@10.29.1)': dependencies: preact: 10.29.1 '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1))': + '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1))': dependencies: '@babel/core': 7.29.0 '@prefresh/babel-plugin': 0.5.3 - '@prefresh/core': 1.5.9(preact@10.29.1) + '@prefresh/core': 1.5.10(preact@10.29.1) '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.29.1 - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.18': + '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': + '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.18': + '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': + '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': + '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + '@rolldown/binding-wasm32-wasi@1.0.0': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rolldown/pluginutils@1.0.0-rc.18': {} + '@rolldown/pluginutils@1.0.0': {} '@rollup/pluginutils@4.2.1': dependencies: @@ -4061,7 +4061,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 25.6.2 + '@types/node': 25.7.0 '@types/imagemin-gifsicle@7.0.4': dependencies: @@ -4090,21 +4090,21 @@ snapshots: '@types/imagemin@7.0.1': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 '@types/json-schema@7.0.15': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 '@types/minimatch@6.0.0': dependencies: minimatch: 10.2.5 - '@types/node@25.6.2': + '@types/node@25.7.0': dependencies: - undici-types: 7.19.2 + undici-types: 7.21.0 '@types/parse-json@4.0.2': {} @@ -4124,20 +4124,20 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 '@types/svgo@2.6.4': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 - '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/parser': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/type-utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -4146,41 +4146,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3 eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.3(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) - '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.2': + '@typescript-eslint/scope-manager@8.59.3': dependencies: - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 - '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.3(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) debug: 4.4.3 eslint: 10.3.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -4188,14 +4188,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.2': {} + '@typescript-eslint/types@8.59.3': {} - '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.59.3(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/visitor-keys': 8.59.2 + '@typescript-eslint/project-service': 8.59.3(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@6.0.3) + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3 minimatch: 10.2.5 semver: 7.8.0 @@ -4205,20 +4205,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.3(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.3 + '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.2': + '@typescript-eslint/visitor-keys@8.59.3': dependencies: - '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/types': 8.59.3 eslint-visitor-keys: 5.0.1 acorn-jsx@5.3.2(acorn@8.16.0): @@ -4285,7 +4285,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.28: {} + baseline-browser-mapping@2.10.29: {} bin-build@3.0.0: dependencies: @@ -4346,10 +4346,10 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.28 + baseline-browser-mapping: 2.10.29 caniuse-lite: 1.0.30001792 electron-to-chromium: 1.5.353 - node-releases: 2.0.38 + node-releases: 2.0.44 update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-alloc-unsafe@1.1.0: {} @@ -5671,7 +5671,7 @@ snapshots: css-select: 5.2.2 he: 1.2.0 - node-releases@2.0.38: {} + node-releases@2.0.44: {} normalize-package-data@2.5.0: dependencies: @@ -6007,35 +6007,35 @@ snapshots: dependencies: glob: 7.2.3 - rolldown@1.0.0-rc.18: + rolldown@1.0.0: dependencies: - '@oxc-project/types': 0.128.0 - '@rolldown/pluginutils': 1.0.0-rc.18 + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-x64': 1.0.0-rc.18 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 + '@rolldown/binding-android-arm64': 1.0.0 + '@rolldown/binding-darwin-arm64': 1.0.0 + '@rolldown/binding-darwin-x64': 1.0.0 + '@rolldown/binding-freebsd-x64': 1.0.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0 + '@rolldown/binding-linux-arm64-gnu': 1.0.0 + '@rolldown/binding-linux-arm64-musl': 1.0.0 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0 + '@rolldown/binding-linux-s390x-gnu': 1.0.0 + '@rolldown/binding-linux-x64-gnu': 1.0.0 + '@rolldown/binding-linux-x64-musl': 1.0.0 + '@rolldown/binding-openharmony-arm64': 1.0.0 + '@rolldown/binding-wasm32-wasi': 1.0.0 + '@rolldown/binding-win32-arm64-msvc': 1.0.0 + '@rolldown/binding-win32-x64-msvc': 1.0.0 - rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-rc.18)(rollup@4.59.0): + rollup-plugin-visualizer@7.0.1(rolldown@1.0.0)(rollup@4.59.0): dependencies: open: 11.0.0 picomatch: 4.0.4 source-map: 0.7.6 yargs: 18.0.0 optionalDependencies: - rolldown: 1.0.0-rc.18 + rolldown: 1.0.0 rollup: 4.59.0 rollup@4.59.0: @@ -6339,12 +6339,12 @@ snapshots: dependencies: typescript: 6.0.3 - typescript-eslint@8.59.2(eslint@10.3.0)(typescript@6.0.3): + typescript-eslint@8.59.3(eslint@10.3.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.3(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0)(typescript@6.0.3) eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: @@ -6357,7 +6357,7 @@ snapshots: buffer: 5.7.1 through: 2.3.8 - undici-types@7.19.2: {} + undici-types@7.21.0: {} universalify@2.0.1: {} @@ -6390,7 +6390,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-plugin-imagemin@0.6.1(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): + vite-plugin-imagemin@0.6.1(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)): dependencies: '@types/imagemin': 7.0.1 '@types/imagemin-gifsicle': 7.0.4 @@ -6415,11 +6415,11 @@ snapshots: imagemin-webp: 6.1.0 jpegtran-bin: 6.0.1 pathe: 0.2.0 - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.13(vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1)): + vite-prerender-plugin@0.5.13(vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -6427,17 +6427,17 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0 - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1) + vite: 8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1) - vite@8.0.11(@types/node@25.6.2)(esbuild@0.27.4)(terser@5.47.1): + vite@8.0.12(@types/node@25.7.0)(esbuild@0.27.4)(terser@5.47.1): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.14 - rolldown: 1.0.0-rc.18 + rolldown: 1.0.0 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 esbuild: 0.27.4 fsevents: 2.3.3 terser: 5.47.1