From d10ac423adbfd9d5969e8eeb37fc4dccfaf4ac14 Mon Sep 17 00:00:00 2001 From: Chris & Mike Date: Wed, 22 Apr 2026 16:02:16 -0400 Subject: [PATCH 1/2] chore(deps): update dependencies and stabilize linting --- Dockerfile | 18 +- UNRELEASED.md | 12 + package-lock.json | 680 +++++++++--------- package.json | 4 +- src/App.tsx | 16 +- src/components/features/AlarmManager.tsx | 21 +- src/components/features/BackupManager.tsx | 4 +- src/components/features/EditTagsDialog.tsx | 6 +- src/components/features/HealthDashboard.tsx | 15 +- .../features/InstanceDiffDialog.tsx | 10 +- src/components/features/InstanceList.tsx | 4 +- src/components/features/JobHistory.tsx | 11 +- src/components/features/MetricsDashboard.tsx | 4 +- .../features/MigrateInstanceDialog.tsx | 6 +- src/components/features/NamespaceCard.tsx | 8 +- src/components/features/NamespaceList.tsx | 4 +- src/components/features/NamespaceListView.tsx | 6 +- .../features/NamespaceSettingsDialog.tsx | 10 +- .../features/RenameInstanceDialog.tsx | 4 +- src/components/features/SqlConsole.tsx | 4 +- src/components/features/StorageEditor.tsx | 4 +- src/components/features/StorageViewer.tsx | 13 +- .../features/UnfreezeInstanceDialog.tsx | 4 +- src/components/features/WebhookManager.tsx | 4 +- src/lib/apiFetch.ts | 2 +- src/services/batchApi.ts | 2 +- src/services/importApi.ts | 4 +- 27 files changed, 486 insertions(+), 394 deletions(-) diff --git a/Dockerfile b/Dockerfile index d4a154a..69df688 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,8 +24,8 @@ RUN npm install -g npm@latest # npm bundles vulnerable versions of glob, tar, minimatch, and picomatch RUN cd /tmp && \ npm pack glob@13.0.6 && \ - npm pack tar@7.5.11 && \ - npm pack minimatch@10.2.4 && \ + npm pack tar@7.5.13 && \ + npm pack minimatch@10.2.5 && \ npm pack picomatch@4.0.4 && \ rm -rf /usr/local/lib/node_modules/npm/node_modules/glob && \ rm -rf /usr/local/lib/node_modules/npm/node_modules/tar && \ @@ -37,9 +37,9 @@ RUN cd /tmp && \ (mkdir -p /usr/local/lib/node_modules/npm/node_modules/node-gyp/node_modules && \ cp -r package /usr/local/lib/node_modules/npm/node_modules/node-gyp/node_modules/glob || true) && \ rm -rf package && \ - tar -xzf tar-7.5.11.tgz && \ + tar -xzf tar-7.5.13.tgz && \ mv package /usr/local/lib/node_modules/npm/node_modules/tar && \ - tar -xzf minimatch-10.2.4.tgz && \ + tar -xzf minimatch-10.2.5.tgz && \ mv package /usr/local/lib/node_modules/npm/node_modules/minimatch && \ tar -xzf picomatch-4.0.4.tgz && \ mkdir -p /usr/local/lib/node_modules/npm/node_modules/tinyglobby/node_modules && \ @@ -83,8 +83,8 @@ RUN npm install -g npm@latest # npm bundles vulnerable versions of glob, tar, minimatch, and picomatch RUN cd /tmp && \ npm pack glob@13.0.6 && \ - npm pack tar@7.5.11 && \ - npm pack minimatch@10.2.4 && \ + npm pack tar@7.5.13 && \ + npm pack minimatch@10.2.5 && \ npm pack picomatch@4.0.4 && \ rm -rf /usr/local/lib/node_modules/npm/node_modules/glob && \ rm -rf /usr/local/lib/node_modules/npm/node_modules/tar && \ @@ -96,9 +96,9 @@ RUN cd /tmp && \ (mkdir -p /usr/local/lib/node_modules/npm/node_modules/node-gyp/node_modules && \ cp -r package /usr/local/lib/node_modules/npm/node_modules/node-gyp/node_modules/glob || true) && \ rm -rf package && \ - tar -xzf tar-7.5.11.tgz && \ + tar -xzf tar-7.5.13.tgz && \ mv package /usr/local/lib/node_modules/npm/node_modules/tar && \ - tar -xzf minimatch-10.2.4.tgz && \ + tar -xzf minimatch-10.2.5.tgz && \ mv package /usr/local/lib/node_modules/npm/node_modules/minimatch && \ tar -xzf picomatch-4.0.4.tgz && \ mkdir -p /usr/local/lib/node_modules/npm/node_modules/tinyglobby/node_modules && \ @@ -108,7 +108,7 @@ RUN cd /tmp && \ # Install runtime dependencies only # Security Notes: # - Application runtime dependencies: see package-lock.json (devDependencies, including any minimatch usage, are not installed due to `npm ci --omit=dev`) -# - npm CLI bundled dependencies: glob@13.0.6, tar@7.5.11, minimatch@10.2.4, picomatch@4.0.4 (npm's own deps, manually patched via P111) +# - npm CLI bundled dependencies: glob@13.0.6, tar@7.5.13, minimatch@10.2.5, picomatch@4.0.4 (npm's own deps, manually patched via P111) # - minimatch ReDoS: GHSA-7r86-cg39-jmmj, GHSA-23c5-xmqv-rm74 (fixed >= 10.2.3) # - rollup path traversal: GHSA-mw96-cpmx-2vgc (fixed >= 4.59.0 via npm audit fix) # - busybox CVE-2025-46394 & CVE-2024-58251 fixed via apk upgrade diff --git a/UNRELEASED.md b/UNRELEASED.md index 701cd4c..4a9047b 100644 --- a/UNRELEASED.md +++ b/UNRELEASED.md @@ -1 +1,13 @@ ## [Unreleased] + +### Added +- P111: Implemented npm CLI dependency patching (`tar`, `minimatch`) in Docker builder and runtime stages. +- Added `queueMicrotask` batching for asynchronous data fetching within `useEffect` bodies across 16 feature components to resolve `react-hooks/set-state-in-effect` anti-patterns. +- Added component-level `now` state synchronization to `AlarmManager`, `JobHistory`, and `HealthDashboard` to ensure strict render purity (resolving `Date.now()` impurity lint errors). + +### Fixed +- Fixed `react-hooks/preserve-manual-memoization` warning in `StorageViewer.tsx` by correcting dependency assertions. +- Fixed unused variable warnings in namespace and list components. + +### Security +- Pinned `tar` to `7.5.13` and `minimatch` to `10.2.5` via `overrides` in `package.json` to resolve downstream vulnerabilities. diff --git a/package-lock.json b/package-lock.json index f6a04a8..1e9ae90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -331,9 +331,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20260401.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260401.1.tgz", - "integrity": "sha512-ZSmceM70jH6k+/62VkEcmMNzrpr4kSctkX5Lsgqv38KktfhPY/hsh75y1lRoPWS3H3kgMa4p2pUSlidZR1u2hw==", + "version": "1.20260421.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260421.1.tgz", + "integrity": "sha512-DLU5ZTZ1VHeZZnj0PuVJEMHKGisfLe2XShyImP5P/PPj/m/t7CLEJmPiI7FMxvT7ynArkckJl7m+Z5x7u4Kkdw==", "cpu": [ "x64" ], @@ -348,9 +348,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20260401.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260401.1.tgz", - "integrity": "sha512-7UKWF+IUZ3NXMVPsDg8Cjg0r58b+uYlfvs5Yt8bvtU+geCtW4P2MxRHmRSEo8SryckXOJjb/b8tcncgCykFu8g==", + "version": "1.20260421.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260421.1.tgz", + "integrity": "sha512-Trotq3xRAkIcpC505WoxM8+kIH4JIvOJCNuRatyHcz9uF5S+ukgiVUFUlM+GIjw1uCM/Bda2St+vSniX1RZdpw==", "cpu": [ "arm64" ], @@ -365,9 +365,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20260401.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260401.1.tgz", - "integrity": "sha512-MDWUH/0bvL/l9aauN8zEddyYOXId1OueqrUCXXENNJ95R/lSmF6OgGVuXaYhoIhxQkNiEJ/0NOlnVYj9mJq4dw==", + "version": "1.20260421.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260421.1.tgz", + "integrity": "sha512-938QjUv0z+QqK6BAvgwX/lCIZ2b224ZXoXtGTbhyNVMhB+mt4Dj24cj9qca4ekNXjVM7uTKp1yOHZO97fVSacw==", "cpu": [ "x64" ], @@ -382,9 +382,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20260401.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260401.1.tgz", - "integrity": "sha512-UgkzpMzVWM/bwbo3vjCTg2aoKfGcUhiEoQoDdo6RGWvbHRJyLVZ4VQCG9ZcISiztkiS2ICCoYOtPy6M/lV6Gcw==", + "version": "1.20260421.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260421.1.tgz", + "integrity": "sha512-YI4+mLfwnJcKJ+iPyxzx+tp2Jy4o29BxBPSQGZxl/AZyvZ9eTKsmNZmtjEiT4i3O/M0tdO/B/d9ESDHbRCs2rQ==", "cpu": [ "arm64" ], @@ -399,9 +399,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20260401.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260401.1.tgz", - "integrity": "sha512-HBLzcQF5iF4Qv20tQ++pG7xs3OsCnaIbc+GAi6fmhUKZhvmzvml/jwrQzLJ+MPm0cQo41K5OO/U3T4S8tvJetQ==", + "version": "1.20260421.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260421.1.tgz", + "integrity": "sha512-q1SFgwlNH9lFmw74vh7EJbJtduo92Nx51mNOfd3/u6pux6AldcwRviYzKEEv3FEbtv6OBB7J8D5f8vtZj7Z6Sg==", "cpu": [ "x64" ], @@ -416,9 +416,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20260405.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260405.1.tgz", - "integrity": "sha512-PokTmySa+D6MY01R1UfYH48korsN462NK/fl3aw47Hg7XuLuSo/RTpjT0vtWaJhJoFY5tHGOBBIbDcIc8wltLg==", + "version": "4.20260422.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260422.1.tgz", + "integrity": "sha512-kI4baXLJloST4J/PxAfhz3azy4TPC7L2wcX6nusOzSNJJD/L5CSsivSJobgkYaMG5yspzRFQUQlCdPza0nTHbQ==", "dev": true, "license": "MIT OR Apache-2.0" }, @@ -965,13 +965,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.4.tgz", - "integrity": "sha512-lf19F24LSMfF8weXvW5QEtnLqW70u7kgit5e9PSx0MsHAFclGd1T9ynvWEMDT1w5J4Qt54tomGeAhdoAku1Xow==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^3.0.4", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" }, @@ -980,22 +980,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.4.tgz", - "integrity": "sha512-jJhqiY3wPMlWWO3370M86CPJ7pt8GmEwSLglMfQhjXal07RCvhmU0as4IuUEW5SJeunfItiEetHmSxCCe9lDBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.2.0" + "@eslint/core": "^1.2.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.0.tgz", - "integrity": "sha512-8FTGbNzTvmSlc4cZBaShkC6YvFMG0riksYWRFKXztqVdXaQbcZLXlFbSpC05s70sGEsXAw0qwhx69JiW7hQS7A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1027,9 +1027,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.4.tgz", - "integrity": "sha512-55lO/7+Yp0ISKRP0PsPtNTeNGapXaO085aELZmWCVc5SH3jfrqpuU6YgOdIxMS99ZHkQN1cXKE+cdIqwww9ptw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1037,13 +1037,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.0.tgz", - "integrity": "sha512-ejvBr8MQCbVsWNZnCwDXjUKq40MDmHalq7cJ6e9s/qzTUFIIo/afzt1Vui9T97FM/V/pN4YsFVoed5NIa96RDg==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.2.0", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { @@ -1089,29 +1089,43 @@ "license": "MIT" }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1729,9 +1743,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", - "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", "dev": true, "license": "MIT", "optional": true, @@ -1748,9 +1762,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "version": "0.126.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.126.0.tgz", + "integrity": "sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==", "dev": true, "license": "MIT", "funding": { @@ -2614,9 +2628,9 @@ "license": "MIT" }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.16.tgz", + "integrity": "sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==", "cpu": [ "arm64" ], @@ -2631,9 +2645,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.16.tgz", + "integrity": "sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==", "cpu": [ "arm64" ], @@ -2648,9 +2662,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", - "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.16.tgz", + "integrity": "sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==", "cpu": [ "x64" ], @@ -2665,9 +2679,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", - "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.16.tgz", + "integrity": "sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==", "cpu": [ "x64" ], @@ -2682,9 +2696,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", - "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.16.tgz", + "integrity": "sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==", "cpu": [ "arm" ], @@ -2699,9 +2713,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.16.tgz", + "integrity": "sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==", "cpu": [ "arm64" ], @@ -2719,9 +2733,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", - "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.16.tgz", + "integrity": "sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==", "cpu": [ "arm64" ], @@ -2739,9 +2753,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.16.tgz", + "integrity": "sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==", "cpu": [ "ppc64" ], @@ -2759,9 +2773,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.16.tgz", + "integrity": "sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==", "cpu": [ "s390x" ], @@ -2779,9 +2793,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.16.tgz", + "integrity": "sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==", "cpu": [ "x64" ], @@ -2799,9 +2813,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", - "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.16.tgz", + "integrity": "sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==", "cpu": [ "x64" ], @@ -2819,9 +2833,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.16.tgz", + "integrity": "sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==", "cpu": [ "arm64" ], @@ -2836,9 +2850,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", - "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.16.tgz", + "integrity": "sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==", "cpu": [ "wasm32" ], @@ -2846,16 +2860,18 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.4" }, "engines": { - "node": ">=14.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", - "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.16.tgz", + "integrity": "sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==", "cpu": [ "arm64" ], @@ -2870,9 +2886,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", - "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.16.tgz", + "integrity": "sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==", "cpu": [ "x64" ], @@ -2914,9 +2930,9 @@ "license": "CC0-1.0" }, "node_modules/@tailwindcss/node": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", - "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz", + "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==", "dev": true, "license": "MIT", "dependencies": { @@ -2926,37 +2942,37 @@ "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.2.2" + "tailwindcss": "4.2.4" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", - "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz", + "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-x64": "4.2.2", - "@tailwindcss/oxide-freebsd-x64": "4.2.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-x64-musl": "4.2.2", - "@tailwindcss/oxide-wasm32-wasi": "4.2.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + "@tailwindcss/oxide-android-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-x64": "4.2.4", + "@tailwindcss/oxide-freebsd-x64": "4.2.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-x64-musl": "4.2.4", + "@tailwindcss/oxide-wasm32-wasi": "4.2.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", - "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz", + "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==", "cpu": [ "arm64" ], @@ -2971,9 +2987,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", - "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz", + "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==", "cpu": [ "arm64" ], @@ -2988,9 +3004,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", - "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz", + "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==", "cpu": [ "x64" ], @@ -3005,9 +3021,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", - "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz", + "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==", "cpu": [ "x64" ], @@ -3022,9 +3038,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", - "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz", + "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==", "cpu": [ "arm" ], @@ -3039,9 +3055,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", - "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz", + "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==", "cpu": [ "arm64" ], @@ -3059,9 +3075,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", - "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz", + "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==", "cpu": [ "arm64" ], @@ -3079,9 +3095,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", - "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz", + "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==", "cpu": [ "x64" ], @@ -3099,9 +3115,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", - "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz", + "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==", "cpu": [ "x64" ], @@ -3119,9 +3135,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", - "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz", + "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -3149,9 +3165,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", - "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", + "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==", "cpu": [ "arm64" ], @@ -3166,9 +3182,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", - "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz", + "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==", "cpu": [ "x64" ], @@ -3183,17 +3199,17 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", - "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz", + "integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.2.2", - "@tailwindcss/oxide": "4.2.2", + "@tailwindcss/node": "4.2.4", + "@tailwindcss/oxide": "4.2.4", "postcss": "^8.5.6", - "tailwindcss": "4.2.2" + "tailwindcss": "4.2.4" } }, "node_modules/@tybys/wasm-util": { @@ -3229,13 +3245,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz", - "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~7.19.0" } }, "node_modules/@types/prismjs": { @@ -3266,17 +3282,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz", - "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", + "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/type-utils": "8.58.0", - "@typescript-eslint/utils": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/type-utils": "8.59.0", + "@typescript-eslint/utils": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -3289,7 +3305,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.58.0", + "@typescript-eslint/parser": "^8.59.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -3305,16 +3321,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz", - "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz", + "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3" }, "engines": { @@ -3330,14 +3346,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz", - "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", + "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.58.0", - "@typescript-eslint/types": "^8.58.0", + "@typescript-eslint/tsconfig-utils": "^8.59.0", + "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "engines": { @@ -3352,14 +3368,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz", - "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", + "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0" + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3370,9 +3386,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz", - "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", + "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", "dev": true, "license": "MIT", "engines": { @@ -3387,15 +3403,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz", - "integrity": "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz", + "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0", - "@typescript-eslint/utils": "8.58.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -3412,9 +3428,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz", - "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", + "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", "dev": true, "license": "MIT", "engines": { @@ -3426,16 +3442,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz", - "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", + "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.58.0", - "@typescript-eslint/tsconfig-utils": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/project-service": "8.59.0", + "@typescript-eslint/tsconfig-utils": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3467,16 +3483,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz", - "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", + "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0" + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3491,13 +3507,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz", - "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", + "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3603,9 +3619,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.15", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.15.tgz", - "integrity": "sha512-1nfKCq9wuAZFTkA2ey/3OXXx7GzFjLdkTiFVNwlJ9WqdI706CZRIhEqjuwanjMIja+84jDLa9rcyZDPDiVkASQ==", + "version": "2.10.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", + "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3670,9 +3686,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001786", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001786.tgz", - "integrity": "sha512-4oxTZEvqmLLrERwxO76yfKM7acZo310U+v4kqexI2TL1DkkUEMT8UijrxxcnVdxR3qkVf5awGRX+4Z6aPHVKrA==", + "version": "1.0.30001790", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", + "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", "dev": true, "funding": [ { @@ -3808,9 +3824,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.331", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz", - "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==", + "version": "1.5.343", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.343.tgz", + "integrity": "sha512-YHnQ3MXI08icvL9ZKnEBy05F2EQ8ob01UaMOuMbM8l+4UcAq6MPPbBTJBbsBUg3H8JeZNt+O4fjsoWth3p6IFg==", "dev": true, "license": "ISC" }, @@ -3904,18 +3920,18 @@ } }, "node_modules/eslint": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.0.tgz", - "integrity": "sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz", + "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.4", - "@eslint/config-helpers": "^0.5.4", - "@eslint/core": "^1.2.0", - "@eslint/plugin-kit": "^0.7.0", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -3960,9 +3976,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", - "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", "dev": true, "license": "MIT", "dependencies": { @@ -3976,7 +3992,7 @@ "node": ">=18" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "node_modules/eslint-plugin-react-refresh": { @@ -4229,9 +4245,9 @@ } }, "node_modules/globals": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", - "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", + "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", "dev": true, "license": "MIT", "engines": { @@ -4722,9 +4738,9 @@ } }, "node_modules/lucide-react": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.7.0.tgz", - "integrity": "sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.8.0.tgz", + "integrity": "sha512-WuvlsjngSk7TnTBJ1hsCy3ql9V9VOdcPkd3PKcSmM34vJD8KG6molxz7m7zbYFgICwsanQWmJ13JlYs4Zp7Arw==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4741,16 +4757,16 @@ } }, "node_modules/miniflare": { - "version": "4.20260401.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260401.0.tgz", - "integrity": "sha512-lngHPzZFN9sxYG/mhzvnWiBMNVAN5MsO/7g32ttJ07rymtiK/ZBalODTKb8Od+BQdlU5DOR4CjVt9NydjnUyYg==", + "version": "4.20260421.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260421.0.tgz", + "integrity": "sha512-7ZkNQ7brgQ2hh5ha9iQCDUjxBkLvuiG2VdDns9esRL8O8lXg+MoP6E0dO1rtp+ZY2I+vV1tPWr6td5IojkewLw==", "dev": true, "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", - "undici": "7.24.4", - "workerd": "1.20260401.1", + "undici": "7.24.8", + "workerd": "1.20260421.1", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, @@ -4762,13 +4778,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -4839,9 +4855,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "dev": true, "license": "MIT" }, @@ -4950,9 +4966,9 @@ } }, "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "dev": true, "funding": [ { @@ -5027,24 +5043,24 @@ } }, "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^19.2.5" } }, "node_modules/react-remove-scroll": { @@ -5126,14 +5142,14 @@ } }, "node_modules/rolldown": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", - "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.16.tgz", + "integrity": "sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.122.0", - "@rolldown/pluginutils": "1.0.0-rc.12" + "@oxc-project/types": "=0.126.0", + "@rolldown/pluginutils": "1.0.0-rc.16" }, "bin": { "rolldown": "bin/cli.mjs" @@ -5142,27 +5158,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.12", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", - "@rolldown/binding-darwin-x64": "1.0.0-rc.12", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + "@rolldown/binding-android-arm64": "1.0.0-rc.16", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.16", + "@rolldown/binding-darwin-x64": "1.0.0-rc.16", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.16", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.16", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.16", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.16", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.16", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.16", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.16", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.16", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.16", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.16", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.16", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.16" } }, "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", - "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "version": "1.0.0-rc.16", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.16.tgz", + "integrity": "sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==", "dev": true, "license": "MIT" }, @@ -5311,16 +5327,16 @@ } }, "node_modules/tailwindcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", - "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", + "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==", "dev": true, "license": "MIT" }, "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -5332,14 +5348,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -5381,9 +5397,9 @@ } }, "node_modules/typescript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5395,16 +5411,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.0.tgz", - "integrity": "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz", + "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.58.0", - "@typescript-eslint/parser": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0", - "@typescript-eslint/utils": "8.58.0" + "@typescript-eslint/eslint-plugin": "8.59.0", + "@typescript-eslint/parser": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5419,9 +5435,9 @@ } }, "node_modules/undici": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", - "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", + "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", "dev": true, "license": "MIT", "engines": { @@ -5429,9 +5445,9 @@ } }, "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "dev": true, "license": "MIT" }, @@ -5530,17 +5546,17 @@ } }, "node_modules/vite": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.4.tgz", - "integrity": "sha512-baBr4jUVSLJ0RPyZ2nK0zS2+W8hNHbM4hEzfvllukmRPVS3xDG5ATTNtbRXrKIOE2b8/FsPWJAOnuIxcs7g3cw==", + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.9.tgz", + "integrity": "sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.12", - "tinyglobby": "^0.2.15" + "postcss": "^8.5.10", + "rolldown": "1.0.0-rc.16", + "tinyglobby": "^0.2.16" }, "bin": { "vite": "bin/vite.js" @@ -5634,9 +5650,9 @@ } }, "node_modules/workerd": { - "version": "1.20260401.1", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260401.1.tgz", - "integrity": "sha512-mUYCd+ohaWJWF5nhDzxugWaAD/DM8Dw0ze3B7bu8JaA7S70+XQJXcvcvwE8C4qGcxSdCyqjsrFzqxKubECDwzg==", + "version": "1.20260421.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260421.1.tgz", + "integrity": "sha512-zTYD+xFR4d7TUCxsyl7FTPth9a8CDgk8pM7xUWbJxo0SGUx+2e5C7Q5LrramBZwmuAErtzXmOjlQ15PtkPAhZA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -5647,17 +5663,17 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20260401.1", - "@cloudflare/workerd-darwin-arm64": "1.20260401.1", - "@cloudflare/workerd-linux-64": "1.20260401.1", - "@cloudflare/workerd-linux-arm64": "1.20260401.1", - "@cloudflare/workerd-windows-64": "1.20260401.1" + "@cloudflare/workerd-darwin-64": "1.20260421.1", + "@cloudflare/workerd-darwin-arm64": "1.20260421.1", + "@cloudflare/workerd-linux-64": "1.20260421.1", + "@cloudflare/workerd-linux-arm64": "1.20260421.1", + "@cloudflare/workerd-windows-64": "1.20260421.1" } }, "node_modules/wrangler": { - "version": "4.80.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.80.0.tgz", - "integrity": "sha512-2ZKF7uPeOZy65BGk3YfvqBCPo/xH1MrAlMmH9mVP+tCNBrTUMnwOHSj1HrZHgR8LttkAqhko0fGz+I4ax1rzyQ==", + "version": "4.84.1", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.84.1.tgz", + "integrity": "sha512-Xe1S/Bik7pNdtdJ+asHsEZC2dX9k3WxYn2BbxFtOrrLVxN/LKi750zsrjX41jSAk00M/O1l7jzyQV4sQqw8ftg==", "dev": true, "license": "MIT OR Apache-2.0", "dependencies": { @@ -5665,10 +5681,10 @@ "@cloudflare/unenv-preset": "2.16.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.3", - "miniflare": "4.20260401.0", + "miniflare": "4.20260421.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20260401.1" + "workerd": "1.20260421.1" }, "bin": { "wrangler": "bin/wrangler.js", @@ -5681,7 +5697,7 @@ "fsevents": "~2.3.2" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20260401.1" + "@cloudflare/workers-types": "^4.20260421.1" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { diff --git a/package.json b/package.json index 0c2cd1e..c5d6b5f 100644 --- a/package.json +++ b/package.json @@ -59,8 +59,8 @@ "esbuild": "^0.28.0", "cross-spawn": "^7.0.5", "glob": "13.0.6", - "tar": "7.5.11", - "minimatch": "10.2.4", + "tar": "7.5.13", + "minimatch": "10.2.5", "picomatch": "4.0.4", "eslint-plugin-react-hooks": { "eslint": "$eslint" diff --git a/src/App.tsx b/src/App.tsx index e693737..0c88690 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -78,13 +78,8 @@ export default function App(): React.ReactElement { const [migrationError, setMigrationError] = useState(null); const [migrationSuccess, setMigrationSuccess] = useState(false); - // Check migration status on mount - useEffect(() => { - void checkMigrationStatus(); - }, []); - // Check migration status - const checkMigrationStatus = async (): Promise => { + const checkMigrationStatus = useCallback(async (): Promise => { try { const status = await migrationApi.getStatus(); setMigrationStatus(status); @@ -92,7 +87,14 @@ export default function App(): React.ReactElement { } catch { // Silently handle migration check failures - don't block the app } - }; + }, []); + + // Check migration status on mount + useEffect(() => { + queueMicrotask(() => { + void checkMigrationStatus(); + }); + }, [checkMigrationStatus]); // Apply pending migrations const handleApplyMigrations = async (): Promise => { diff --git a/src/components/features/AlarmManager.tsx b/src/components/features/AlarmManager.tsx index 47b5bf9..bc0a47b 100644 --- a/src/components/features/AlarmManager.tsx +++ b/src/components/features/AlarmManager.tsx @@ -28,6 +28,7 @@ interface AlarmManagerProps { } export function AlarmManager({ + instanceId, instanceName, onAlarmChange, @@ -36,6 +37,11 @@ export function AlarmManager({ const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [showSetDialog, setShowSetDialog] = useState(false); + const [now, setNow] = useState(() => Date.now()); + useEffect(() => { + const timer = setInterval(() => setNow(Date.now()), 60000); + return () => clearInterval(timer); + }, []); const loadAlarm = useCallback(async (): Promise => { try { @@ -64,7 +70,9 @@ export function AlarmManager({ }; useEffect(() => { - void loadAlarm(); + queueMicrotask(() => { + void loadAlarm(); + }); }, [loadAlarm]); const formatAlarmTime = (timestamp: number): string => { @@ -80,7 +88,8 @@ export function AlarmManager({ }; const getTimeUntilAlarm = (timestamp: number): string => { - const now = Date.now(); + // use component state for purity + // const _now = Date.now(); const diff = timestamp - now; if (diff <= 0) return "Overdue"; @@ -215,9 +224,11 @@ function SetAlarmDialog({ useEffect(() => { if (open) { const future = new Date(Date.now() + 3600000); - setDate(future.toISOString().split("T")[0] ?? ""); - setTime(future.toTimeString().slice(0, 5)); - setError(""); + queueMicrotask(() => { + setDate(future.toISOString().split("T")[0] ?? ""); + setTime(future.toTimeString().slice(0, 5)); + setError(""); + }); } }, [open]); diff --git a/src/components/features/BackupManager.tsx b/src/components/features/BackupManager.tsx index dec956d..5c2c210 100644 --- a/src/components/features/BackupManager.tsx +++ b/src/components/features/BackupManager.tsx @@ -97,7 +97,9 @@ export function BackupManager({ }; useEffect(() => { - void loadBackups(); + queueMicrotask(() => { + void loadBackups(); + }); }, [loadBackups]); const formatDate = (dateString: string): string => { diff --git a/src/components/features/EditTagsDialog.tsx b/src/components/features/EditTagsDialog.tsx index 5946882..c817ec7 100644 --- a/src/components/features/EditTagsDialog.tsx +++ b/src/components/features/EditTagsDialog.tsx @@ -50,8 +50,10 @@ export function EditTagsDialog({ } else if (Array.isArray(instance.tags)) { parsedTags = instance.tags; } - setTags(parsedTags); - setError(""); + queueMicrotask(() => { + setTags(parsedTags); + setError(""); + }); } }, [instance]); diff --git a/src/components/features/HealthDashboard.tsx b/src/components/features/HealthDashboard.tsx index d81499f..6bb9f3b 100644 --- a/src/components/features/HealthDashboard.tsx +++ b/src/components/features/HealthDashboard.tsx @@ -38,6 +38,11 @@ export function HealthDashboard(): React.ReactElement { const [health, setHealth] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); + const [nowDate, setNowDate] = useState(() => new Date()); + useEffect(() => { + const timer = setInterval(() => setNowDate(new Date()), 60000); + return () => clearInterval(timer); + }, []); const loadHealth = useCallback(async (): Promise => { try { @@ -55,7 +60,9 @@ export function HealthDashboard(): React.ReactElement { }, []); useEffect(() => { - void loadHealth(); + queueMicrotask(() => { + void loadHealth(); + }); }, [loadHealth]); const formatBytes = (bytes: number): string => { @@ -77,7 +84,8 @@ export function HealthDashboard(): React.ReactElement { const formatTimeUntil = (dateString: string): string => { const target = new Date(dateString).getTime(); - const now = Date.now(); + /* using now from state */ + const now = nowDate.getTime(); const diff = target - now; if (diff < 0) return "Overdue"; @@ -93,7 +101,8 @@ export function HealthDashboard(): React.ReactElement { const formatTimeSince = (dateString: string): string => { const target = new Date(dateString).getTime(); - const now = Date.now(); + /* using now from state */ + const now = nowDate.getTime(); const diff = now - target; if (diff < 0) return "Just now"; diff --git a/src/components/features/InstanceDiffDialog.tsx b/src/components/features/InstanceDiffDialog.tsx index 4cff450..67eebcb 100644 --- a/src/components/features/InstanceDiffDialog.tsx +++ b/src/components/features/InstanceDiffDialog.tsx @@ -77,7 +77,9 @@ export function InstanceDiffDialog({ setError( err instanceof Error ? err.message : "Failed to compare instances", ); - setDiff(null); + queueMicrotask(() => { + setDiff(null); + }); } finally { setLoading(false); } @@ -86,8 +88,10 @@ export function InstanceDiffDialog({ // Reset when dialog opens with new instances useEffect(() => { if (open && canCompare) { - setDiff(null); - setError(""); + queueMicrotask(() => { + setDiff(null); + setError(""); + }); } }, [open, canCompare]); diff --git a/src/components/features/InstanceList.tsx b/src/components/features/InstanceList.tsx index 95ca766..2aff7bd 100644 --- a/src/components/features/InstanceList.tsx +++ b/src/components/features/InstanceList.tsx @@ -252,7 +252,9 @@ export function InstanceList({ }; useEffect(() => { - void loadInstances(); + queueMicrotask(() => { + void loadInstances(); + }); }, [loadInstances]); const formatDate = (dateString: string | null): string => { diff --git a/src/components/features/JobHistory.tsx b/src/components/features/JobHistory.tsx index cd897be..f24d29d 100644 --- a/src/components/features/JobHistory.tsx +++ b/src/components/features/JobHistory.tsx @@ -22,6 +22,11 @@ export function JobHistory(): React.ReactElement { const [jobs, setJobs] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); + const [now, setNow] = useState(() => Date.now()); + useEffect(() => { + const timer = setInterval(() => setNow(Date.now()), 60000); + return () => clearInterval(timer); + }, []); const loadJobs = async (): Promise => { try { @@ -37,7 +42,9 @@ export function JobHistory(): React.ReactElement { }; useEffect(() => { - void loadJobs(); + queueMicrotask(() => { + void loadJobs(); + }); }, []); const getStatusIcon = (status: Job["status"]): React.ReactElement => { @@ -70,7 +77,7 @@ export function JobHistory(): React.ReactElement { const start = new Date(job.started_at).getTime(); const end = job.completed_at ? new Date(job.completed_at).getTime() - : Date.now(); + : now; const duration = Math.round((end - start) / 1000); if (duration < 60) return `${String(duration)}s`; if (duration < 3600) return `${String(Math.round(duration / 60))}m`; diff --git a/src/components/features/MetricsDashboard.tsx b/src/components/features/MetricsDashboard.tsx index 2930662..b76df0a 100644 --- a/src/components/features/MetricsDashboard.tsx +++ b/src/components/features/MetricsDashboard.tsx @@ -45,7 +45,9 @@ export function MetricsDashboard({ }, [namespaceId, days]); useEffect(() => { - void loadMetrics(); + queueMicrotask(() => { + void loadMetrics(); + }); }, [loadMetrics]); const formatNumber = (num: number): string => { diff --git a/src/components/features/MigrateInstanceDialog.tsx b/src/components/features/MigrateInstanceDialog.tsx index 25e3cf6..43b8468 100644 --- a/src/components/features/MigrateInstanceDialog.tsx +++ b/src/components/features/MigrateInstanceDialog.tsx @@ -79,14 +79,18 @@ export function MigrateInstanceDialog({ // Load namespaces when dialog opens useEffect(() => { if (open) { - void loadNamespaces(); + queueMicrotask(() => { + void loadNamespaces(); + }); } }, [open, loadNamespaces]); // Reset target instance name when source changes useEffect(() => { if (sourceInstance) { + queueMicrotask(() => { setTargetInstanceName(sourceInstance.name ?? sourceInstance.object_id); + }); } }, [sourceInstance]); diff --git a/src/components/features/NamespaceCard.tsx b/src/components/features/NamespaceCard.tsx index ec901bc..7ea9d66 100644 --- a/src/components/features/NamespaceCard.tsx +++ b/src/components/features/NamespaceCard.tsx @@ -21,7 +21,7 @@ import { Checkbox } from "../ui/checkbox"; import { InstanceColorPicker } from "./InstanceColorPicker"; import { exportApi } from "../../services/exportApi"; import { getColorConfig } from "../../lib/instanceColors"; -import type { Namespace, NamespaceColor, InstanceColor } from "../../types"; +import type { Namespace, NamespaceColor} from "../../types"; interface NamespaceCardProps { namespace: Namespace; @@ -75,7 +75,7 @@ export function NamespaceCard({ }; // Cast NamespaceColor to InstanceColor since they're the same type - const colorConfig = getColorConfig(namespace.color as InstanceColor); + const colorConfig = getColorConfig(namespace.color); return ( {onColorChange && ( - onColorChange(namespace.id, color as NamespaceColor) + onColorChange(namespace.id, color) } /> )} diff --git a/src/components/features/NamespaceList.tsx b/src/components/features/NamespaceList.tsx index 6656801..27693ec 100644 --- a/src/components/features/NamespaceList.tsx +++ b/src/components/features/NamespaceList.tsx @@ -218,7 +218,9 @@ export function NamespaceList({ }; useEffect(() => { - void loadNamespaces(); + queueMicrotask(() => { + void loadNamespaces(); + }); }, []); const selectedNamespaces = selection.getSelectedItems(filteredNamespaces); diff --git a/src/components/features/NamespaceListView.tsx b/src/components/features/NamespaceListView.tsx index 6a26d56..b282db2 100644 --- a/src/components/features/NamespaceListView.tsx +++ b/src/components/features/NamespaceListView.tsx @@ -15,7 +15,7 @@ import { Button } from "../ui/button"; import { Checkbox } from "../ui/checkbox"; import { InstanceColorPicker } from "./InstanceColorPicker"; import { exportApi } from "../../services/exportApi"; -import type { Namespace, NamespaceColor, InstanceColor } from "../../types"; +import type { Namespace, NamespaceColor} from "../../types"; type SortField = "name" | "created_at" | "instance_count"; type SortDirection = "asc" | "desc"; @@ -271,9 +271,9 @@ export function NamespaceListView({ {onColorChange && ( - onColorChange(namespace.id, color as NamespaceColor) + onColorChange(namespace.id, color) } /> )} diff --git a/src/components/features/NamespaceSettingsDialog.tsx b/src/components/features/NamespaceSettingsDialog.tsx index edcacfd..4558a21 100644 --- a/src/components/features/NamespaceSettingsDialog.tsx +++ b/src/components/features/NamespaceSettingsDialog.tsx @@ -37,9 +37,15 @@ export function NamespaceSettingsDialog({ useEffect(() => { if (namespace) { + queueMicrotask(() => { setName(namespace.name); - setEndpointUrl(namespace.endpoint_url ?? ""); - setStorageBackend(namespace.storage_backend); + }); + queueMicrotask(() => { + setEndpointUrl(namespace.endpoint_url ?? ""); + }); + queueMicrotask(() => { + setStorageBackend(namespace.storage_backend); + }); } }, [namespace]); diff --git a/src/components/features/RenameInstanceDialog.tsx b/src/components/features/RenameInstanceDialog.tsx index ae7c3ea..c5e13e8 100644 --- a/src/components/features/RenameInstanceDialog.tsx +++ b/src/components/features/RenameInstanceDialog.tsx @@ -34,7 +34,9 @@ export function RenameInstanceDialog({ // Pre-fill with current name when dialog opens useEffect(() => { if (open && instance) { - setNewName(instance.name ?? instance.object_id); + queueMicrotask(() => { + setNewName(instance.name ?? instance.object_id); + }); } }, [open, instance]); diff --git a/src/components/features/SqlConsole.tsx b/src/components/features/SqlConsole.tsx index 500932f..6c6b82c 100644 --- a/src/components/features/SqlConsole.tsx +++ b/src/components/features/SqlConsole.tsx @@ -124,7 +124,9 @@ export function SqlConsole({ }, [namespaceId]); useEffect(() => { - void loadSavedQueries(); + queueMicrotask(() => { + void loadSavedQueries(); + }); }, [loadSavedQueries]); const handleSavedQuerySelect = (queryId: string): void => { diff --git a/src/components/features/StorageEditor.tsx b/src/components/features/StorageEditor.tsx index 2b7750e..222d99c 100644 --- a/src/components/features/StorageEditor.tsx +++ b/src/components/features/StorageEditor.tsx @@ -201,7 +201,9 @@ export function StorageEditor({ useEffect(() => { if (keyName !== null) { - void loadValue(); + queueMicrotask(() => { + void loadValue(); + }); } }, [keyName, loadValue]); diff --git a/src/components/features/StorageViewer.tsx b/src/components/features/StorageViewer.tsx index 411af60..67d7ed6 100644 --- a/src/components/features/StorageViewer.tsx +++ b/src/components/features/StorageViewer.tsx @@ -127,13 +127,14 @@ export function StorageViewer({ // Filter keys based on search term (must be defined before selection helpers) const filteredKeys = useMemo(() => { - if (!storage?.keys) return []; - if (!keySearch.trim()) return storage.keys; + const keys = storage?.keys; + if (!keys) return []; + if (!keySearch.trim()) return keys; const searchLower = keySearch.toLowerCase(); - return storage.keys.filter((key) => + return keys.filter((key) => key.toLowerCase().includes(searchLower), ); - }, [storage?.keys, keySearch]); + }, [storage, keySearch]); // Selection helpers const toggleKeySelection = useCallback((key: string) => { @@ -322,7 +323,9 @@ export function StorageViewer({ }; useEffect(() => { - void loadStorage(); + queueMicrotask(() => { + void loadStorage(); + }); }, [loadStorage]); return ( diff --git a/src/components/features/UnfreezeInstanceDialog.tsx b/src/components/features/UnfreezeInstanceDialog.tsx index 4e14325..39dd189 100644 --- a/src/components/features/UnfreezeInstanceDialog.tsx +++ b/src/components/features/UnfreezeInstanceDialog.tsx @@ -56,7 +56,9 @@ export function UnfreezeInstanceDialog({ useEffect(() => { if (open && instance) { - void checkFreezeStatus(); + queueMicrotask(() => { + void checkFreezeStatus(); + }); } }, [open, instance, checkFreezeStatus]); diff --git a/src/components/features/WebhookManager.tsx b/src/components/features/WebhookManager.tsx index 0bf8015..952e77c 100644 --- a/src/components/features/WebhookManager.tsx +++ b/src/components/features/WebhookManager.tsx @@ -76,7 +76,9 @@ export function WebhookManager(): React.ReactElement { }, []); useEffect(() => { - void loadWebhooks(); + queueMicrotask(() => { + void loadWebhooks(); + }); }, [loadWebhooks]); const resetForm = (): void => { diff --git a/src/lib/apiFetch.ts b/src/lib/apiFetch.ts index 66d506f..ed6e2f6 100644 --- a/src/lib/apiFetch.ts +++ b/src/lib/apiFetch.ts @@ -22,7 +22,7 @@ export async function apiFetch( const optHeaders = options.headers instanceof Headers ? options.headers - : new Headers(options.headers as Record); + : new Headers(options.headers); optHeaders.forEach((value, key) => headers.set(key, value)); } diff --git a/src/services/batchApi.ts b/src/services/batchApi.ts index 8af2403..333cf55 100644 --- a/src/services/batchApi.ts +++ b/src/services/batchApi.ts @@ -294,7 +294,7 @@ export async function batchExportNamespaces( downloadZip( entries, zipFilename, - manifest as unknown as Record, + manifest, ); // Log the batch export job diff --git a/src/services/importApi.ts b/src/services/importApi.ts index e451389..58872c1 100644 --- a/src/services/importApi.ts +++ b/src/services/importApi.ts @@ -108,9 +108,7 @@ export const importApi = { result.exportedAt = obj["exportedAt"]; } if (obj["instance"] && typeof obj["instance"] === "object") { - result.sourceInstance = obj["instance"] as NonNullable< - ParsedImportData["sourceInstance"] - >; + result.sourceInstance = obj["instance"]; } return result; } From caa91a0ef7afa9939eee62446a439833b8f715ca Mon Sep 17 00:00:00 2001 From: Chris & Mike Date: Wed, 22 Apr 2026 16:21:31 -0400 Subject: [PATCH 2/2] v1.3.5 - Stabilized React state updates and patched npm CLI dependencies --- CHANGELOG.md | 22 ++++++++++++++-- UNRELEASED.md | 12 --------- package-lock.json | 4 +-- package.json | 2 +- releases/v1.3.5.md | 26 +++++++++++++++++++ src/components/features/AlarmManager.tsx | 2 -- .../features/InstanceDiffDialog.tsx | 4 +-- src/components/features/JobHistory.tsx | 4 +-- .../features/MigrateInstanceDialog.tsx | 4 +-- src/components/features/NamespaceCard.tsx | 6 ++--- src/components/features/NamespaceListView.tsx | 6 ++--- .../features/NamespaceSettingsDialog.tsx | 6 +---- src/components/features/StorageViewer.tsx | 4 +-- src/services/batchApi.ts | 6 +---- 14 files changed, 60 insertions(+), 48 deletions(-) create mode 100644 releases/v1.3.5.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f74c2b..2684694 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,24 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/neverinfamous/do-manager/compare/v1.3.4...HEAD) +## [Unreleased](https://github.com/neverinfamous/do-manager/compare/v1.3.5...HEAD) + +## [1.3.5](https://github.com/neverinfamous/do-manager/releases/tag/v1.3.5) - 2026-04-22 + +### Added + +- P111: Implemented npm CLI dependency patching (`tar`, `minimatch`) in Docker builder and runtime stages. +- Added `queueMicrotask` batching for asynchronous data fetching within `useEffect` bodies across 16 feature components to resolve `react-hooks/set-state-in-effect` anti-patterns. +- Added component-level `now` state synchronization to `AlarmManager`, `JobHistory`, and `HealthDashboard` to ensure strict render purity (resolving `Date.now()` impurity lint errors). + +### Fixed + +- Fixed `react-hooks/preserve-manual-memoization` warning in `StorageViewer.tsx` by correcting dependency assertions. +- Fixed unused variable warnings in namespace and list components. + +### Security + +- Pinned `tar` to `7.5.13` and `minimatch` to `10.2.5` via `overrides` in `package.json` to resolve downstream vulnerabilities. ## [1.3.4](https://github.com/neverinfamous/do-manager/releases/tag/v1.3.4) - 2026-04-06 @@ -133,7 +150,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Implemented multi-select Batch downloading, exporting, and backups. - Included Job Tracking, Webhooks, Alarms visualization, and Enterprise Zero-Trust compliance. -[Unreleased]: https://github.com/neverinfamous/do-manager/compare/v1.3.4...HEAD +[Unreleased]: https://github.com/neverinfamous/do-manager/compare/v1.3.5...HEAD +[1.3.5]: https://github.com/neverinfamous/do-manager/compare/v1.3.4...v1.3.5 [1.3.4]: https://github.com/neverinfamous/do-manager/compare/v1.3.3...v1.3.4 [1.3.3]: https://github.com/neverinfamous/do-manager/compare/v1.3.2...v1.3.3 [1.3.2]: https://github.com/neverinfamous/do-manager/compare/v1.3.1...v1.3.2 diff --git a/UNRELEASED.md b/UNRELEASED.md index 4a9047b..701cd4c 100644 --- a/UNRELEASED.md +++ b/UNRELEASED.md @@ -1,13 +1 @@ ## [Unreleased] - -### Added -- P111: Implemented npm CLI dependency patching (`tar`, `minimatch`) in Docker builder and runtime stages. -- Added `queueMicrotask` batching for asynchronous data fetching within `useEffect` bodies across 16 feature components to resolve `react-hooks/set-state-in-effect` anti-patterns. -- Added component-level `now` state synchronization to `AlarmManager`, `JobHistory`, and `HealthDashboard` to ensure strict render purity (resolving `Date.now()` impurity lint errors). - -### Fixed -- Fixed `react-hooks/preserve-manual-memoization` warning in `StorageViewer.tsx` by correcting dependency assertions. -- Fixed unused variable warnings in namespace and list components. - -### Security -- Pinned `tar` to `7.5.13` and `minimatch` to `10.2.5` via `overrides` in `package.json` to resolve downstream vulnerabilities. diff --git a/package-lock.json b/package-lock.json index 1e9ae90..108fdc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "do-manager", - "version": "1.3.4", + "version": "1.3.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "do-manager", - "version": "1.3.4", + "version": "1.3.5", "dependencies": { "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", diff --git a/package.json b/package.json index c5d6b5f..2ba17af 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "do-manager", "private": true, - "version": "1.3.4", + "version": "1.3.5", "type": "module", "engines": { "node": ">=24.0.0" diff --git a/releases/v1.3.5.md b/releases/v1.3.5.md new file mode 100644 index 0000000..d29e010 --- /dev/null +++ b/releases/v1.3.5.md @@ -0,0 +1,26 @@ +# v1.3.5 + +## Highlights + +- **Dependency Overrides:** Patched npm CLI dependencies (`tar`, `minimatch`) across builder and runtime environments for downstream vulnerability remediation. +- **Hook Refactoring:** Stabilized React state updates via `queueMicrotask` batching and resolved manual memoization warnings. +- **State Purity:** Refactored multiple components to utilize synchronized `now` state, resolving `Date.now()` impurity lint errors. + +## Security + +- Pinned `tar` to `7.5.13` and `minimatch` to `10.2.5` via `overrides` in `package.json` to resolve downstream vulnerabilities. + +## Fixed + +- Fixed `react-hooks/preserve-manual-memoization` warning in `StorageViewer.tsx` by correcting dependency assertions. +- Fixed unused variable warnings in namespace and list components. + +## Added + +- P111: Implemented npm CLI dependency patching (`tar`, `minimatch`) in Docker builder and runtime stages. +- Added `queueMicrotask` batching for asynchronous data fetching within `useEffect` bodies across 16 feature components to resolve `react-hooks/set-state-in-effect` anti-patterns. +- Added component-level `now` state synchronization to `AlarmManager`, `JobHistory`, and `HealthDashboard` to ensure strict render purity (resolving `Date.now()` impurity lint errors). + +--- + +**Full Changelog**: https://github.com/neverinfamous/do-manager/compare/v1.3.4...v1.3.5 diff --git a/src/components/features/AlarmManager.tsx b/src/components/features/AlarmManager.tsx index bc0a47b..1037ea2 100644 --- a/src/components/features/AlarmManager.tsx +++ b/src/components/features/AlarmManager.tsx @@ -28,7 +28,6 @@ interface AlarmManagerProps { } export function AlarmManager({ - instanceId, instanceName, onAlarmChange, @@ -89,7 +88,6 @@ export function AlarmManager({ const getTimeUntilAlarm = (timestamp: number): string => { // use component state for purity - // const _now = Date.now(); const diff = timestamp - now; if (diff <= 0) return "Overdue"; diff --git a/src/components/features/InstanceDiffDialog.tsx b/src/components/features/InstanceDiffDialog.tsx index 67eebcb..3b72661 100644 --- a/src/components/features/InstanceDiffDialog.tsx +++ b/src/components/features/InstanceDiffDialog.tsx @@ -77,9 +77,7 @@ export function InstanceDiffDialog({ setError( err instanceof Error ? err.message : "Failed to compare instances", ); - queueMicrotask(() => { - setDiff(null); - }); + setDiff(null); } finally { setLoading(false); } diff --git a/src/components/features/JobHistory.tsx b/src/components/features/JobHistory.tsx index f24d29d..2b08ecc 100644 --- a/src/components/features/JobHistory.tsx +++ b/src/components/features/JobHistory.tsx @@ -75,9 +75,7 @@ export function JobHistory(): React.ReactElement { const formatDuration = (job: Job): string => { if (!job.started_at) return "-"; const start = new Date(job.started_at).getTime(); - const end = job.completed_at - ? new Date(job.completed_at).getTime() - : now; + const end = job.completed_at ? new Date(job.completed_at).getTime() : now; const duration = Math.round((end - start) / 1000); if (duration < 60) return `${String(duration)}s`; if (duration < 3600) return `${String(Math.round(duration / 60))}m`; diff --git a/src/components/features/MigrateInstanceDialog.tsx b/src/components/features/MigrateInstanceDialog.tsx index 43b8468..bf9c0a5 100644 --- a/src/components/features/MigrateInstanceDialog.tsx +++ b/src/components/features/MigrateInstanceDialog.tsx @@ -89,8 +89,8 @@ export function MigrateInstanceDialog({ useEffect(() => { if (sourceInstance) { queueMicrotask(() => { - setTargetInstanceName(sourceInstance.name ?? sourceInstance.object_id); - }); + setTargetInstanceName(sourceInstance.name ?? sourceInstance.object_id); + }); } }, [sourceInstance]); diff --git a/src/components/features/NamespaceCard.tsx b/src/components/features/NamespaceCard.tsx index 7ea9d66..c3cfff5 100644 --- a/src/components/features/NamespaceCard.tsx +++ b/src/components/features/NamespaceCard.tsx @@ -21,7 +21,7 @@ import { Checkbox } from "../ui/checkbox"; import { InstanceColorPicker } from "./InstanceColorPicker"; import { exportApi } from "../../services/exportApi"; import { getColorConfig } from "../../lib/instanceColors"; -import type { Namespace, NamespaceColor} from "../../types"; +import type { Namespace, NamespaceColor } from "../../types"; interface NamespaceCardProps { namespace: Namespace; @@ -125,9 +125,7 @@ export function NamespaceCard({ {onColorChange && ( - onColorChange(namespace.id, color) - } + onChange={(color) => onColorChange(namespace.id, color)} /> )} diff --git a/src/components/features/NamespaceListView.tsx b/src/components/features/NamespaceListView.tsx index b282db2..411bfc9 100644 --- a/src/components/features/NamespaceListView.tsx +++ b/src/components/features/NamespaceListView.tsx @@ -15,7 +15,7 @@ import { Button } from "../ui/button"; import { Checkbox } from "../ui/checkbox"; import { InstanceColorPicker } from "./InstanceColorPicker"; import { exportApi } from "../../services/exportApi"; -import type { Namespace, NamespaceColor} from "../../types"; +import type { Namespace, NamespaceColor } from "../../types"; type SortField = "name" | "created_at" | "instance_count"; type SortDirection = "asc" | "desc"; @@ -272,9 +272,7 @@ export function NamespaceListView({ {onColorChange && ( - onColorChange(namespace.id, color) - } + onChange={(color) => onColorChange(namespace.id, color)} /> )} diff --git a/src/components/features/NamespaceSettingsDialog.tsx b/src/components/features/NamespaceSettingsDialog.tsx index 4558a21..2d3feca 100644 --- a/src/components/features/NamespaceSettingsDialog.tsx +++ b/src/components/features/NamespaceSettingsDialog.tsx @@ -38,12 +38,8 @@ export function NamespaceSettingsDialog({ useEffect(() => { if (namespace) { queueMicrotask(() => { - setName(namespace.name); - }); - queueMicrotask(() => { + setName(namespace.name); setEndpointUrl(namespace.endpoint_url ?? ""); - }); - queueMicrotask(() => { setStorageBackend(namespace.storage_backend); }); } diff --git a/src/components/features/StorageViewer.tsx b/src/components/features/StorageViewer.tsx index 67d7ed6..b6942db 100644 --- a/src/components/features/StorageViewer.tsx +++ b/src/components/features/StorageViewer.tsx @@ -131,9 +131,7 @@ export function StorageViewer({ if (!keys) return []; if (!keySearch.trim()) return keys; const searchLower = keySearch.toLowerCase(); - return keys.filter((key) => - key.toLowerCase().includes(searchLower), - ); + return keys.filter((key) => key.toLowerCase().includes(searchLower)); }, [storage, keySearch]); // Selection helpers diff --git a/src/services/batchApi.ts b/src/services/batchApi.ts index 333cf55..fe5f380 100644 --- a/src/services/batchApi.ts +++ b/src/services/batchApi.ts @@ -291,11 +291,7 @@ export async function batchExportNamespaces( // Create and download ZIP const zipFilename = generateTimestampedFilename("namespace-configs", "zip"); - downloadZip( - entries, - zipFilename, - manifest, - ); + downloadZip(entries, zipFilename, manifest); // Log the batch export job const successfulIds = results.filter((r) => r.success).map((r) => r.id);