From 6bb31a574d914dc6a333143531dd73422696f9e7 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sun, 8 Nov 2026 21:32:22 -0500 Subject: [PATCH] build(web): upgrade to Node 26 LTS and TypeScript 7 --- .devcontainer/Dockerfile | 4 +- .../workflows/reliability-qualification.yml | 2 +- .nvmrc | 2 +- Dockerfile | 6 +- README.md | 2 +- docs/BUILD.md | 2 +- docs/RELEASE_PROCESS.md | 6 +- docs/api/contracts/toolchain.md | 11 +- package-lock.json | 18 +- package.json | 4 +- scripts/README.md | 2 +- tests/contracts/mqtt-sink.ts | 2 +- tests/contracts/tooling/generator.test.mjs | 2 +- tests/performance/active-recording.md | 2 +- tests/performance/browser-startup.md | 2 +- tests/performance/observations/README.md | 2 +- tests/reliability/README.md | 2 +- tools/rust-transpile/Dockerfile | 2 +- web/VITE.md | 9 + web/package-lock.json | 512 ++++++++++++++++-- web/package.json | 11 +- web/tests/README.md | 2 +- web/tests/RUNNING_TESTS_LOCALLY.md | 2 +- 23 files changed, 506 insertions(+), 103 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 41ad7d9b9..e4eed33b7 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,11 +1,11 @@ FROM ubuntu:24.04 -ARG NODE_MAJOR=24 +ARG NODE_MAJOR=26 # Avoid interactive prompts during package install ENV DEBIAN_FRONTEND=noninteractive -# Install the Node 24 LTS baseline required by Babel 8 and the web toolchain. +# Install the Node 26 LTS baseline used by the web toolchain. RUN apt-get update && apt-get install -y curl ca-certificates gnupg \ && curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash - \ && apt-get install -y nodejs diff --git a/.github/workflows/reliability-qualification.yml b/.github/workflows/reliability-qualification.yml index 1e4cbb517..2abe1ac3d 100644 --- a/.github/workflows/reliability-qualification.yml +++ b/.github/workflows/reliability-qualification.yml @@ -39,7 +39,7 @@ jobs: - uses: actions/setup-node@v6 with: - node-version: '24.22.1' + node-version-file: .nvmrc - uses: actions/setup-go@v6 with: diff --git a/.nvmrc b/.nvmrc index ce62013c3..1dda03ddb 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -24.22.1 +26.13.0 diff --git a/Dockerfile b/Dockerfile index aaab90ca3..86a564fba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ARG SQLITE_AUTOCONF_VERSION=3540100 ARG LIBUV_VERSION=1.53.0 ARG LLHTTP_VERSION=9.4.3 ARG LLHTTP_TARBALL_SHA256=1eb813c7437b31a87496a1cd3ed79f00746720f5e7e29c79b42c02cb69f36c39 -ARG NODE_MAJOR=24 +ARG NODE_MAJOR=26 ARG DEB_BUILD=false FROM debian:${DEBIAN_SUITE}-slim AS target-sysroot @@ -59,8 +59,8 @@ ENV DEBIAN_FRONTEND=noninteractive COPY --from=target-sysroot / /opt/target-sysroot/ # Install build dependencies including Node.js and target FFmpeg dev libraries. -# Node.js comes from NodeSource so every Debian suite uses the Node 24 LTS -# baseline required by the Babel 8 web test toolchain. +# Node.js comes from NodeSource so every Debian suite uses the Node 26 LTS +# baseline used by the web toolchain. # sid ships Go 1.26+/FFmpeg 9.x; trixie ships Go 1.24+/FFmpeg 7.x. # # ARMv7 is cross-compiled on the x86_64 runner. Compiling LiteRT/XNNPACK under diff --git a/README.md b/README.md index 2d10f36c2..649f4437b 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ environment variables and upgrades are covered in the [Docker guide](docs/DOCKER | **Home Assistant** | Add [opensensor/lightnvr-hassio-addons](https://github.com/opensensor/lightnvr-hassio-addons) under *Settings → Add-ons → Add-on Store → ⋮ → Repositories*, then install LightNVR. See [Home Assistant](docs/HOME_ASSISTANT.md). | | **Debian / Ubuntu** | `.deb` packages for amd64, arm64 and armhf are attached to each [release](https://github.com/opensensor/lightNVR/releases). | | **Windows** | [Podman + WSL2](docs/WINDOWS_PODMAN.md) | -| **From source** | [Build guide](docs/BUILD.md): FFmpeg ≥ 7.1, Node.js 24, CMake. Required for embedded targets. | +| **From source** | [Build guide](docs/BUILD.md): FFmpeg ≥ 7.1, Node.js 26, CMake. Required for embedded targets. | ### First login diff --git a/docs/BUILD.md b/docs/BUILD.md index f881a40f2..87d096c6d 100644 --- a/docs/BUILD.md +++ b/docs/BUILD.md @@ -41,7 +41,7 @@ sudo apt-get install -y \ - `libmbedtls-dev` is **required** for ONVIF and authentication. - `libmosquitto-dev` (≥ 2.0) and `libyaml-dev` are optional. Without them CMake prints a warning and builds without MQTT, or without go2rtc override validation. -- Building the web UI needs **Node.js 24** (the version in `.nvmrc`). Distribution packages +- Building the web UI needs **Node.js 26** (the version in `.nvmrc`). Distribution packages are often older; use [NodeSource](https://github.com/nodesource/distributions) or [nvm](https://github.com/nvm-sh/nvm). diff --git a/docs/RELEASE_PROCESS.md b/docs/RELEASE_PROCESS.md index 456af8965..147136966 100644 --- a/docs/RELEASE_PROCESS.md +++ b/docs/RELEASE_PROCESS.md @@ -207,7 +207,7 @@ When you push a tag, GitHub Actions automatically: releases. 2. **Builds web assets** during the Docker build: - - Installs Node.js 24.x LTS + - Installs Node.js 26.x LTS - Runs `npm ci --ignore-scripts` from the committed lockfile - Runs `npm run build` to build with Vite - Copies built assets to `/var/lib/lightnvr/www/` in the runtime image @@ -324,10 +324,10 @@ If the Docker build fails to find web assets: ### Local build doesn't match Docker build -This can happen if you have different Node.js versions. The Docker build uses Node.js 24.x LTS. To match locally: +This can happen if you have different Node.js versions. The Docker build uses Node.js 26.x LTS. To match locally: ```bash -# Install the version pinned in .nvmrc (Node.js 24.x LTS) +# Install the version pinned in .nvmrc (Node.js 26.x LTS) nvm install nvm use diff --git a/docs/api/contracts/toolchain.md b/docs/api/contracts/toolchain.md index d1e5187c2..a4c9d2ef6 100644 --- a/docs/api/contracts/toolchain.md +++ b/docs/api/contracts/toolchain.md @@ -1,14 +1,15 @@ # Contract toolchain -T3 installs exact versions without changing any pre-existing locked package -version: Redocly CLI 2.75.0, openapi-typescript 7.13.0, Ajv 8.20.0, +The contract tooling pins exact versions: Redocly CLI 2.76.0, +openapi-typescript 7.13.0, Ajv 8.20.0, ajv-formats 3.0.1, esbuild 0.28.2, root TypeScript 5.9.3 and Node types -24.19.2. The docs-only web dependency is swagger-ui-dist 5.34.1. -The application retains TypeScript 6.0.3 and its existing dependencies. +26.6.6. The docs-only web dependency is swagger-ui-dist 5.34.1. +The application checks types with TypeScript 7.0.2 through `@typescript/native`; +its `typescript` alias provides the TypeScript 6 compatibility API for ESLint. Root TypeScript is 5.9.3 because openapi-typescript 7.13.0 declares a `^5.x` peer dependency. No force/legacy-peer-deps override is used. Generated declarations -are independently compiled with **both** root TS 5.9.3 and application TS 6.0.3, +are independently compiled with **both** root TS 5.9.3 and application TS 7.0.2, with strict mode and library checking enabled. The root compiler also checks all contract TS/config files via `tests/contracts/tsconfig.json`; existing integration and load test typing remains the separate T18 task. diff --git a/package-lock.json b/package-lock.json index 6b1cef9ec..40edb84b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "devDependencies": { "@playwright/test": "^1.62.1", "@redocly/cli": "2.76.0", - "@types/node": "24.19.2", + "@types/node": "26.6.6", "ajv": "8.20.0", "ajv-formats": "3.0.1", "esbuild": "0.28.2", @@ -21,7 +21,7 @@ "typescript": "5.9.3" }, "engines": { - "node": ">=24.11.0 <25" + "node": ">=26.13.0 <27" } }, "node_modules/@babel/code-frame": { @@ -1205,13 +1205,13 @@ } }, "node_modules/@types/node": { - "version": "24.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz", - "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==", + "version": "26.6.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.6.tgz", + "integrity": "sha512-MzQj+8Kx3XI40OmUAE6Qoh58ZMNstNNMwn2nfd3qWsfe7nDNSqJNzes4njhz6AHwrSHOffSLwXU6yb474Q4aog==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": ">=7.24.0 <7.24.7" + "undici-types": "~8.9.0" } }, "node_modules/acorn": { @@ -1787,9 +1787,9 @@ } }, "node_modules/undici-types": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", - "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 6a8237b1c..6cc1120b8 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "LightNVR Integration Tests", "engines": { - "node": ">=24.11.0 <25" + "node": ">=26.13.0 <27" }, "scripts": { "test": "npx playwright test", @@ -25,7 +25,7 @@ "devDependencies": { "@playwright/test": "^1.62.1", "@redocly/cli": "2.76.0", - "@types/node": "24.19.2", + "@types/node": "26.6.6", "ajv": "8.20.0", "ajv-formats": "3.0.1", "esbuild": "0.28.2", diff --git a/scripts/README.md b/scripts/README.md index a0951074d..ce19a0c4f 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -132,7 +132,7 @@ sudo systemctl start lightnvr **Building C backend:** GCC/Clang, CMake, libsqlite3-dev, libuv1-dev -**Building web frontend:** Node.js (v24.11+ and <25), npm +**Building web frontend:** Node.js (v26.13+ and <27), npm **Screenshot capture:** Node.js, Playwright, Chromium diff --git a/tests/contracts/mqtt-sink.ts b/tests/contracts/mqtt-sink.ts index a14b84a04..a0093a12d 100644 --- a/tests/contracts/mqtt-sink.ts +++ b/tests/contracts/mqtt-sink.ts @@ -9,7 +9,7 @@ export async function startMqttSink(port = 0) { sockets.add(socket);socket.on('close',()=>sockets.delete(socket));socket.on('error',()=>{}); let buffered=Buffer.alloc(0); socket.on('data',chunk=>{ - buffered=Buffer.concat([buffered,chunk]); + buffered=Buffer.concat([buffered,typeof chunk==='string'?Buffer.from(chunk):chunk]); while(buffered.length>=2){ let remaining=0,multiplier=1,end=1; for(;endspawnSync(process.execPath,[path.join(root,compiler),'-p',path.join(directory,'tsconfig.json')],{encoding:'utf8'}); const good=run();assert.equal(good.status,0,good.stdout); await writeFile(path.join(directory,'consumer.ts'),positive+"const wrong: components['schemas']['Fixture'] = {identity:{id:'synthetic'},count:'zero',variant:1}; void wrong;\n"); diff --git a/tests/performance/active-recording.md b/tests/performance/active-recording.md index 3eb398b5d..ac2851f64 100644 --- a/tests/performance/active-recording.md +++ b/tests/performance/active-recording.md @@ -1,6 +1,6 @@ # Bounded active recording measurement -From the repository root, with a Release native build, Node 24, Linux `/proc`, +From the repository root, with a Release native build, Node 26, Linux `/proc`, and FFmpeg/ffprobe with libx264: ```sh diff --git a/tests/performance/browser-startup.md b/tests/performance/browser-startup.md index 8f1908e19..8e412c3b3 100644 --- a/tests/performance/browser-startup.md +++ b/tests/performance/browser-startup.md @@ -7,7 +7,7 @@ fixture binary, then run from the repository root: node tests/performance/browser-startup.ts --binary build/mobile-review/bin/lightnvr --output build/browser-startup --samples 3 ``` -The output directory must be new. Requires Node 24, Playwright Chromium, +The output directory must be new. Requires Node 26, Playwright Chromium, FFmpeg/ffprobe with libx264 and the native fixture dependencies. All media, credentials and configuration belong to the isolated loopback fixture. diff --git a/tests/performance/observations/README.md b/tests/performance/observations/README.md index 3e1caec78..70c84b01f 100644 --- a/tests/performance/observations/README.md +++ b/tests/performance/observations/README.md @@ -113,7 +113,7 @@ node tests/performance/observations/compare.mjs repeat \ build/perf-observations/disabled-run1/results.json build/perf-observations/disabled-run2/results.json ``` -The harness needs Node 24, ffmpeg/ffprobe with libx264, go2rtc on `PATH` (or +The harness needs Node 26, ffmpeg/ffprobe with libx264, go2rtc on `PATH` (or `--go2rtc`), `findmnt`/`lsblk`, and Linux `/proc`. Use `--keep` to keep the fixture directory (server log, DB, media). diff --git a/tests/reliability/README.md b/tests/reliability/README.md index c83f85617..442259308 100644 --- a/tests/reliability/README.md +++ b/tests/reliability/README.md @@ -250,7 +250,7 @@ preparation. It does not claim to have recompiled those executables. The manual workflow `.github/workflows/reliability-qualification.yml` runs only through **workflow_dispatch**. It adds no push/PR or branch-protection check. -It installs coherent Debian sid dependencies, Node 24 and Go matching `go.mod`, +It installs coherent Debian sid dependencies, Node 26 and Go matching `go.mod`, then builds and runs as an unprivileged user. Its private `TMPDIR` isolates storage-fault results. Current Go patch tests and the native reconciliation test run before interrupted-recording, storage-fault, reconnect/lifecycle and genuine diff --git a/tools/rust-transpile/Dockerfile b/tools/rust-transpile/Dockerfile index 90c347587..47d9e2d21 100644 --- a/tools/rust-transpile/Dockerfile +++ b/tools/rust-transpile/Dockerfile @@ -14,7 +14,7 @@ ARG CLANG_MAJOR=21 ARG C2RUST_REVISION=10c776738db3f6b202dd1cade85fcdd3c1ada6f8 ARG RUST_TOOLCHAIN=nightly-2026-03-03 ARG C2RUST_BUILD_TOOLCHAIN=1.95.0 -ARG NODE_VERSION=24.22.1 +ARG NODE_VERSION=26.13.0 ENV DEBIAN_FRONTEND=noninteractive LC_ALL=C.UTF-8 \ RUSTUP_HOME=/opt/rustup CARGO_HOME=/opt/cargo \ diff --git a/web/VITE.md b/web/VITE.md index 94d1f6936..fb0317223 100644 --- a/web/VITE.md +++ b/web/VITE.md @@ -69,6 +69,15 @@ Vite compiles `.ts` and `.tsx` with Oxc using the same Preact JSX settings as `.jsx`, and only strips types. `npm run typecheck` is what checks them, and CI runs it in `static-analysis.yml`. +Typechecking uses TypeScript 7.0.2 through the `@typescript/native` npm alias, +which supplies `tsc`. The `typescript` alias supplies the TypeScript 6 compatibility +API (and `tsc6`) required by `typescript-eslint`. This follows Microsoft's +[side-by-side setup](https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/#running-side-by-side-with-typescript-6.0). +Keep both aliases until the linter supports the native compiler API. The root +package retains TypeScript 5.9 for the OpenAPI generator's compiler API and peer +dependency; contract tests check generated types with both the root compiler and +the frontend's TypeScript 7 compiler. Node typings use 26 to match `.nvmrc`. + - `tsconfig.base.json` holds the shared strict options. Do not relax them. - `tsconfig.json` covers `js/**`; Vite's client types come from `js/env.d.ts`. - `tsconfig.tests.json` covers TS tests under `tests/` with Jest and Node types. diff --git a/web/package-lock.json b/web/package-lock.json index 06afd744b..af40cab25 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -17,7 +17,7 @@ "dayjs": "^1.11.23", "hls.js": "^1.7.4", "htm": "^3.1.1", - "preact": "^11.1.1", + "preact": "^11.2.0", "qrcode": "^1.5.4", "swagger-ui-dist": "5.34.1", "tailwindcss": "^4.3.5", @@ -25,14 +25,15 @@ "webrtc-adapter": "^9.0.6" }, "devDependencies": { - "@babel/core": "^8.0.10", + "@babel/core": "^8.1.0", "@babel/plugin-transform-react-jsx": "8.0.1", "@babel/preset-env": "^8.0.7", "@babel/preset-typescript": "8.0.7", "@prefresh/vite": "^4.0.1", "@sentry/vite-plugin": "^11.11.0", "@types/jest": "30.0.0", - "@types/node": "24.19.2", + "@types/node": "26.6.6", + "@typescript/native": "npm:typescript@7.0.2", "@vitejs/plugin-legacy": "^8.2.4", "autoprefixer": "^10.6.2", "babel-jest": "^30.5.2", @@ -44,13 +45,13 @@ "postcss": "^8.5.32", "postcss-import": "^17.0.1", "selenium-webdriver": "^4.52.0", - "typescript": "6.0.3", + "typescript": "npm:@typescript/typescript6@6.0.2", "typescript-eslint": "8.72.1", "vite": "^8.3.6", "vite-plugin-compression": "^0.5.1" }, "engines": { - "node": ">=24.11.0 <25" + "node": ">=26.13.0 <27" } }, "node_modules/@alloc/quick-lru": { @@ -90,20 +91,20 @@ } }, "node_modules/@babel/core": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.10.tgz", - "integrity": "sha512-T6dEcoMJ3L1hyLuNfRXcVlqQrN79kU/SB5bDygVgQNIOUgStdyEGzigtRA9K+9Coh7SZUSt543oWRBxvqYdyuQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-8.1.0.tgz", + "integrity": "sha512-3jqm7xh3kJCmIeOK8sk6/EvOWdSzvOqvjt0tJEDOHHmzWjcQSvIh2/tq1I9RA741tl0QZdMzPJWCulWE+Dy5ww==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.6", - "@babel/generator": "^8.0.10", + "@babel/generator": "^8.1.0", "@babel/helper-compilation-targets": "^8.0.7", - "@babel/helpers": "^8.0.10", - "@babel/parser": "^8.0.10", + "@babel/helpers": "^8.1.0", + "@babel/parser": "^8.1.0", "@babel/template": "^8.0.0", - "@babel/traverse": "^8.0.10", - "@babel/types": "^8.0.10", + "@babel/traverse": "^8.1.0", + "@babel/types": "^8.1.0", "@types/gensync": "^1.0.5", "convert-source-map": "^2.0.0", "empathic": "^2.0.1", @@ -136,14 +137,14 @@ } }, "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.10.tgz", - "integrity": "sha512-iC9p3U4Y3vp0qKjRcfFeNzpj+kkK8BVYZTbQepBWVD7vOBLH6ji0drNzKPTPtumFd2w2r/hbEKYjG4pscKa4bg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.1.0.tgz", + "integrity": "sha512-7fiBJ61wDV3AHbg7n/EfLBv3RU+lsdRP8QNJnydkKWA7e48FnnvKQWbVHsJQCBE7JHTj4xlzZL9fvQYsBUip2A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^8.0.10", - "@babel/types": "^8.0.10", + "@babel/parser": "^8.1.0", + "@babel/types": "^8.1.0", "@jridgewell/gen-mapping": "0.4.0-beta.0", "@jridgewell/trace-mapping": "^0.3.31", "@types/jsesc": "^2.5.0", @@ -184,13 +185,13 @@ } }, "node_modules/@babel/core/node_modules/@babel/parser": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.10.tgz", - "integrity": "sha512-h+ah2Kg0ne1Vii892dShj9gky9I5jPzkd8x4s/3xgN/P2bMWmHS3qq59tum3mCVjCBXI8uqfYyYtrfp1Mz6+1w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.1.0.tgz", + "integrity": "sha512-fpqZYAC+Tthr19JbEKxXhCGutvfm/+roMe+ULrgUKI+GVyzkQiTMTSheORcWIAzW8T3Oo3W5UavWSvAWmsp7fA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.10" + "@babel/types": "^8.1.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -215,18 +216,18 @@ } }, "node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.10.tgz", - "integrity": "sha512-t5DaGzMi9WlhMSFT2YavI8gl8yGihoQymSQUkIq9+MUh5tO3Vx9KHwr5gMCzeBdYkvs00xNvr18PxtQTRayucA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.1.0.tgz", + "integrity": "sha512-oQ0QI6MR4cm6bOR/Ua5HLPxvO7vborT7Le5HNt9GmZUKpNsaPl2yj4gsQ440lXaZjc4vmUbSeVgEcK4cHuCL2A==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^8.0.6", - "@babel/generator": "^8.0.10", + "@babel/generator": "^8.1.0", "@babel/helper-globals": "^8.0.6", - "@babel/parser": "^8.0.10", + "@babel/parser": "^8.1.0", "@babel/template": "^8.0.0", - "@babel/types": "^8.0.10", + "@babel/types": "^8.1.0", "obug": "^3.0.0" }, "engines": { @@ -234,9 +235,9 @@ } }, "node_modules/@babel/core/node_modules/@babel/types": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.10.tgz", - "integrity": "sha512-KV8Y+teoRsmXeEPS4sCJY1kwV+hcPzHP1qQqgCxrjKOehLdBaxpsFBfoJ8MXWFV80y6Jw56+TM95wR0Per8dYw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.1.0.tgz", + "integrity": "sha512-8V8aSTDx012YPmDQF30vrokyxVFdRAU2YBS2VzrnfLAGkP8floVnjckwgFcD0Jrvf6GWMSRdCrYVsk3tyMwZRg==", "dev": true, "license": "MIT", "dependencies": { @@ -1630,14 +1631,14 @@ "license": "MIT" }, "node_modules/@babel/helpers": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.10.tgz", - "integrity": "sha512-tBG9yuaR26JJWFafcl/Dk4eib6bkRJ9H5e6lENcwZqFudA9ImNCuMXLjB3/t+Ub7/DOZv2Rmi5LCOi8q2DCekQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.1.0.tgz", + "integrity": "sha512-949bjw10dhaRdtQeCpfVShFA4jIcto97BkqmWnRjpzyQuHVZ7EDriaoCn/4D8h1NqSKlmI20xPU0vHf3jQbQRg==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^8.0.0", - "@babel/types": "^8.0.10" + "@babel/types": "^8.1.0" }, "engines": { "node": "^22.18.0 || >=24.11.0" @@ -1678,13 +1679,13 @@ } }, "node_modules/@babel/helpers/node_modules/@babel/parser": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.10.tgz", - "integrity": "sha512-h+ah2Kg0ne1Vii892dShj9gky9I5jPzkd8x4s/3xgN/P2bMWmHS3qq59tum3mCVjCBXI8uqfYyYtrfp1Mz6+1w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.1.0.tgz", + "integrity": "sha512-fpqZYAC+Tthr19JbEKxXhCGutvfm/+roMe+ULrgUKI+GVyzkQiTMTSheORcWIAzW8T3Oo3W5UavWSvAWmsp7fA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^8.0.10" + "@babel/types": "^8.1.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1709,9 +1710,9 @@ } }, "node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.10.tgz", - "integrity": "sha512-KV8Y+teoRsmXeEPS4sCJY1kwV+hcPzHP1qQqgCxrjKOehLdBaxpsFBfoJ8MXWFV80y6Jw56+TM95wR0Per8dYw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.1.0.tgz", + "integrity": "sha512-8V8aSTDx012YPmDQF30vrokyxVFdRAU2YBS2VzrnfLAGkP8floVnjckwgFcD0Jrvf6GWMSRdCrYVsk3tyMwZRg==", "dev": true, "license": "MIT", "dependencies": { @@ -7830,13 +7831,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz", - "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==", + "version": "26.6.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.6.tgz", + "integrity": "sha512-MzQj+8Kx3XI40OmUAE6Qoh58ZMNstNNMwn2nfd3qWsfe7nDNSqJNzes4njhz6AHwrSHOffSLwXU6yb474Q4aog==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": ">=7.24.0 <7.24.7" + "undici-types": "~8.9.0" } }, "node_modules/@types/stack-utils": { @@ -8093,6 +8094,397 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript/native": { + "name": "typescript", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/@typescript/old": { + "name": "typescript", + "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": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", @@ -15244,9 +15636,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-11.1.1.tgz", - "integrity": "sha512-vpFVfai437pbuLri7XVeslCPfrEZX6Z1S2gV+MOFrA/kji+NKUXvH7y01EnVjA1guLigfkVp77Sqipd4SIllCg==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-11.2.0.tgz", + "integrity": "sha512-/HfHI/7N84e6GrWBJ3J280z3mLaRJiDcSvj/A+y/4AbLnND/1UlGHe1sR6oYuTGwId0nP7dqDU9OnLxMPZ7xBg==", "license": "MIT", "funding": { "type": "opencollective", @@ -16619,17 +17011,17 @@ } }, "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "name": "@typescript/typescript6", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript6/-/typescript6-6.0.2.tgz", + "integrity": "sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==", "dev": true, "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "@typescript/old": "npm:typescript@^6" }, - "engines": { - "node": ">=14.17" + "bin": { + "tsc6": "bin/tsc6" } }, "node_modules/typescript-eslint": { @@ -16676,9 +17068,9 @@ } }, "node_modules/undici-types": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", - "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", "dev": true, "license": "MIT" }, diff --git a/web/package.json b/web/package.json index d1086a5d4..9e8c46800 100644 --- a/web/package.json +++ b/web/package.json @@ -4,7 +4,7 @@ "description": "LightNVR Web Interface", "type": "module", "engines": { - "node": ">=24.11.0 <25" + "node": ">=26.13.0 <27" }, "scripts": { "start": "vite", @@ -28,7 +28,7 @@ "dayjs": "^1.11.23", "hls.js": "^1.7.4", "htm": "^3.1.1", - "preact": "^11.1.1", + "preact": "^11.2.0", "qrcode": "^1.5.4", "swagger-ui-dist": "5.34.1", "tailwindcss": "^4.3.5", @@ -36,14 +36,15 @@ "webrtc-adapter": "^9.0.6" }, "devDependencies": { - "@babel/core": "^8.0.10", + "@babel/core": "^8.1.0", "@babel/plugin-transform-react-jsx": "8.0.1", "@babel/preset-env": "^8.0.7", "@babel/preset-typescript": "8.0.7", "@prefresh/vite": "^4.0.1", "@sentry/vite-plugin": "^11.11.0", "@types/jest": "30.0.0", - "@types/node": "24.19.2", + "@types/node": "26.6.6", + "@typescript/native": "npm:typescript@7.0.2", "@vitejs/plugin-legacy": "^8.2.4", "autoprefixer": "^10.6.2", "babel-jest": "^30.5.2", @@ -55,7 +56,7 @@ "postcss": "^8.5.32", "postcss-import": "^17.0.1", "selenium-webdriver": "^4.52.0", - "typescript": "6.0.3", + "typescript": "npm:@typescript/typescript6@6.0.2", "typescript-eslint": "8.72.1", "vite": "^8.3.6", "vite-plugin-compression": "^0.5.1" diff --git a/web/tests/README.md b/web/tests/README.md index 3ae264938..d60cbf272 100644 --- a/web/tests/README.md +++ b/web/tests/README.md @@ -53,7 +53,7 @@ The `utils` directory contains helper functions for common test operations: Before running the tests, make sure you have the following installed: -1. Node.js 24.11+ (24.x) and npm +1. Node.js 26.13+ (26.x) and npm 2. Chrome and/or Firefox browsers 3. Application running with authentication (username: `admin`, password: `admin`) diff --git a/web/tests/RUNNING_TESTS_LOCALLY.md b/web/tests/RUNNING_TESTS_LOCALLY.md index efc8a0a08..15e39b661 100644 --- a/web/tests/RUNNING_TESTS_LOCALLY.md +++ b/web/tests/RUNNING_TESTS_LOCALLY.md @@ -6,7 +6,7 @@ This guide provides detailed instructions for running the Selenium-based automat Before running the tests, ensure you have the following installed: -1. **Node.js 24.11+ (24.x) and npm**: Required to run JavaScript-based tests +1. **Node.js 26.13+ (26.x) and npm**: Required to run JavaScript-based tests - Download from [nodejs.org](https://nodejs.org/) - Verify installation with `node -v` and `npm -v`