From f221ceaf56423679c632cbd0653482433c50e2d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Sep 2026 06:39:20 +0000 Subject: [PATCH 1/4] Bump next from 16.2.12 to 16.3.3 Bumps [next](https://github.com/vercel/next.js) from 16.2.12 to 16.3.3. - [Release notes](https://github.com/vercel/next.js/releases) - [Commits](https://github.com/vercel/next.js/compare/v16.2.12...v16.3.3) --- updated-dependencies: - dependency-name: next dependency-version: 16.3.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 473 ++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 287 insertions(+), 188 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97244cc..573d056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@tailwindcss/postcss": "^4.3.3", "@types/react": "19.2.17", "@types/react-dom": "^19.2.3", - "next": "^16.2.12", + "next": "^16.3.3", "postcss": "^8.5.27", "react": "^19.2.8", "react-dom": "^19.2.8", @@ -903,6 +903,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -921,9 +922,9 @@ } }, "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "license": "MIT", "optional": true, "engines": { @@ -931,9 +932,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", + "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", "cpu": [ "arm64" ], @@ -943,19 +944,19 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "@img/sharp-libvips-darwin-arm64": "1.3.3" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", + "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", "cpu": [ "x64" ], @@ -965,19 +966,38 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "@img/sharp-libvips-darwin-x64": "1.3.3" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", + "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", + "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", "cpu": [ "arm64" ], @@ -991,9 +1011,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", + "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", "cpu": [ "x64" ], @@ -1007,12 +1027,15 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", + "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", "cpu": [ "arm" ], + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1023,12 +1046,15 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", + "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1039,12 +1065,15 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", + "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1055,12 +1084,15 @@ } }, "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", + "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", "cpu": [ "riscv64" ], + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1071,12 +1103,15 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", + "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1087,12 +1122,15 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", + "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1103,12 +1141,15 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", + "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1119,12 +1160,15 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", + "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1135,204 +1179,254 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", + "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", "cpu": [ "arm" ], + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" + "@img/sharp-libvips-linux-arm": "1.3.3" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", + "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" + "@img/sharp-libvips-linux-arm64": "1.3.3" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", + "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" + "@img/sharp-libvips-linux-ppc64": "1.3.3" } }, "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", + "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", "cpu": [ "riscv64" ], + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" + "@img/sharp-libvips-linux-riscv64": "1.3.3" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", + "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "@img/sharp-libvips-linux-s390x": "1.3.3" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", + "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "@img/sharp-libvips-linux-x64": "1.3.3" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", + "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", + "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "1.3.3" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", + "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", + "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", "cpu": [ "wasm32" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "license": "Apache-2.0", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.7.0" + "@img/sharp-wasm32": "0.35.4" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", + "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", "cpu": [ "arm64" ], @@ -1342,16 +1436,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", + "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", "cpu": [ "ia32" ], @@ -1361,16 +1455,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz", + "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==", "cpu": [ "x64" ], @@ -1380,7 +1474,7 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" @@ -2025,15 +2119,15 @@ } }, "node_modules/@next/env": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.12.tgz", - "integrity": "sha512-d0Z5Bc13Fa4nR8pFAKx2jay2yhJM16vlfHbTzYnUQAxlNb6B6lmn4hjt69lYNt4kRtyYP6gEM49lPRHNbIyneg==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.3.3.tgz", + "integrity": "sha512-U2eYQRwXj+dsqxV79zFqExDdatnNY/ZWc2nsJU1p/OgT7fd3dXwlF6OjYaFQCfMoeTA19PWq+wVmYgimVA+V+g==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.12.tgz", - "integrity": "sha512-0W1R0teHWJrqKX0FH20IzzIWAOuGtBxPGuObrxy1lE8hQvCFj49KE8a3WUg0D7sq6rn6zkM4c7YGUnhudBS6oA==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.3.3.tgz", + "integrity": "sha512-8Hiv32QJPwdV6KYJ8meR9SBA061tQqnIKTJDocvOXlEQqib0xMFpzArosuffFUUc0sslbh7QQ8a3Yey1QV8EIw==", "cpu": [ "arm64" ], @@ -2047,9 +2141,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.12.tgz", - "integrity": "sha512-Hy5Ls099+aFUmOLmIgPfLqNi6iCwhL3uQCssz5rWk+5Nkc6TUKCE83DY5BbNylfm3+mfwcSFnLRfrZDJhVxdtw==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.3.3.tgz", + "integrity": "sha512-A1lgKgwVchRYmSe467zdwhxT9040dd8lH+o65sL5Jet8fjB4kegw/rDyPIpYVRb6jAqwXFOJpjIXJLxQKLiE3A==", "cpu": [ "x64" ], @@ -2063,9 +2157,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.12.tgz", - "integrity": "sha512-+YqU2h1cQkHsGfvjAsrSmst8UIFBibBGm5x3Xgel8NLMiDQtNOM4sM2GOEMvG5YiOBNeN/Ykk8cQC2S0Xrqljg==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.3.3.tgz", + "integrity": "sha512-bf0FIssMFueU2dm7vQEWWxk0c8UjKTdW0yzuh0sQsD8pf1+KCLDdaqhYZNMYGmXwEOiHAUzgBKudovIlcvvBjg==", "cpu": [ "arm64" ], @@ -2082,9 +2176,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.12.tgz", - "integrity": "sha512-0qjhiYBaKAqF63LA1ZWAAnKTzFUguAaZiRa5etMLGGPj/B6uEVjtIZldIzFEp3wHlB0koK6aTzqPtSdplTCjoA==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.3.3.tgz", + "integrity": "sha512-W7viwCk9JY/cAkdz/A273rd5bb3RgT/IHwR7Upv90tunjBWNtAAhGhoecHh+teRNRSinuAFmE+l7fwZ4YKkrXg==", "cpu": [ "arm64" ], @@ -2101,9 +2195,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.12.tgz", - "integrity": "sha512-7A3q26W+h7gnA15uqBToNuDqBEFZZcqh0mW2mn4AJh/G5pdg2RVE3n4slzLEliASZFG3NmsbEzng/x2Sh09mBg==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.3.3.tgz", + "integrity": "sha512-0W46zw1N3ODpI6n0GeivHvvob1pooozgZVqy65k0mh4/7vr+FbY9+WpHzNVXjHipJf/A3FDheBG19H1s5A25rA==", "cpu": [ "x64" ], @@ -2120,9 +2214,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.12.tgz", - "integrity": "sha512-qSjL/uppm+cbh21s72Ss8gkiOhQ4dExWHNGOWy6eZV7STj5WsKehgxT61beSsOj+YYQuTplL376lOCdMQU5T8w==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.3.3.tgz", + "integrity": "sha512-H4mBso8ZTMBPtdT0PN0pBx2ayTvQuTuvS6qT13d77yVFJXAPCxkyIhLTmdMaGTJs0krQYI/qpzdHijCeihXhbg==", "cpu": [ "x64" ], @@ -2139,9 +2233,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.12.tgz", - "integrity": "sha512-X6hzsOUJac/e7AWSbn9gQ9nzHld1xWP5iyjHpYWvud8pufB679O1xg4JDyKr8Xd69Jvd+kM2Der6uftiZCmjYA==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.3.3.tgz", + "integrity": "sha512-cTMUJpcEGmeywofCUfhR+rSsoE33+rVPnPEYNTNdLNlsOeEg/vktOsKUSTb28vUGqD2jkm4Zaskcwn7OCI6FQg==", "cpu": [ "arm64" ], @@ -2155,9 +2249,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.12.tgz", - "integrity": "sha512-F6fakeHuFTLOPt0bslQJdf+xtT+WIP9DVn/m4y1w1mRnVPyh3D/cNvzlRkxM444xfm+IvvYNSOrKiA2CDJ0Uxw==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.3.3.tgz", + "integrity": "sha512-2VR4cTBzHXaBjnGsuH6GyJjENzQOmHeAh11uY1iUhjm3j5dEUrVJuUj+VL78jaGi/Dik8xS76zEj18BsFhlVZQ==", "cpu": [ "x64" ], @@ -2527,9 +2621,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -6294,16 +6388,16 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/next/-/next-16.2.12.tgz", - "integrity": "sha512-iD59eYQWmbFcEbX7v/acG5DRym9iw1DdaPoD0WTA920naWsE25wShzJW4+UvAs8MK9EC2kBfIH6vtto1H1PHGw==", + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/next/-/next-16.3.3.tgz", + "integrity": "sha512-tuRTx1nQ/yVw83cwJBo9F+njGUgMn3UHQycreWHB8XsStvvAh1AthbI8/4IpKnFaF58F+iSiHejYOlMQ/eq83g==", "license": "MIT", "dependencies": { - "@next/env": "16.2.12", - "@swc/helpers": "0.5.15", + "@next/env": "16.3.3", + "@swc/helpers": "0.5.23", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", + "postcss": "8.5.23", "styled-jsx": "5.1.6" }, "bin": { @@ -6313,15 +6407,15 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.2.12", - "@next/swc-darwin-x64": "16.2.12", - "@next/swc-linux-arm64-gnu": "16.2.12", - "@next/swc-linux-arm64-musl": "16.2.12", - "@next/swc-linux-x64-gnu": "16.2.12", - "@next/swc-linux-x64-musl": "16.2.12", - "@next/swc-win32-arm64-msvc": "16.2.12", - "@next/swc-win32-x64-msvc": "16.2.12", - "sharp": "^0.34.5" + "@next/swc-darwin-arm64": "16.3.3", + "@next/swc-darwin-x64": "16.3.3", + "@next/swc-linux-arm64-gnu": "16.3.3", + "@next/swc-linux-arm64-musl": "16.3.3", + "@next/swc-linux-x64-gnu": "16.3.3", + "@next/swc-linux-x64-musl": "16.3.3", + "@next/swc-win32-arm64-msvc": "16.3.3", + "@next/swc-win32-x64-msvc": "16.3.3", + "sharp": "^0.35.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -6347,9 +6441,9 @@ } }, "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", "funding": [ { "type": "opencollective", @@ -6366,9 +6460,9 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -6838,54 +6932,59 @@ } }, "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz", + "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@img/colour": "^1.0.0", + "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", - "semver": "^7.7.3" + "semver": "^7.8.5" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" + "@img/sharp-darwin-arm64": "0.35.4", + "@img/sharp-darwin-x64": "0.35.4", + "@img/sharp-freebsd-wasm32": "0.35.4", + "@img/sharp-libvips-darwin-arm64": "1.3.3", + "@img/sharp-libvips-darwin-x64": "1.3.3", + "@img/sharp-libvips-linux-arm": "1.3.3", + "@img/sharp-libvips-linux-arm64": "1.3.3", + "@img/sharp-libvips-linux-ppc64": "1.3.3", + "@img/sharp-libvips-linux-riscv64": "1.3.3", + "@img/sharp-libvips-linux-s390x": "1.3.3", + "@img/sharp-libvips-linux-x64": "1.3.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", + "@img/sharp-libvips-linuxmusl-x64": "1.3.3", + "@img/sharp-linux-arm": "0.35.4", + "@img/sharp-linux-arm64": "0.35.4", + "@img/sharp-linux-ppc64": "0.35.4", + "@img/sharp-linux-riscv64": "0.35.4", + "@img/sharp-linux-s390x": "0.35.4", + "@img/sharp-linux-x64": "0.35.4", + "@img/sharp-linuxmusl-arm64": "0.35.4", + "@img/sharp-linuxmusl-x64": "0.35.4", + "@img/sharp-webcontainers-wasm32": "0.35.4", + "@img/sharp-win32-arm64": "0.35.4", + "@img/sharp-win32-ia32": "0.35.4", + "@img/sharp-win32-x64": "0.35.4" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/sharp/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "optional": true, "bin": { diff --git a/package.json b/package.json index d85d8c1..10768d6 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@tailwindcss/postcss": "^4.3.3", "@types/react": "19.2.17", "@types/react-dom": "^19.2.3", - "next": "^16.2.12", + "next": "^16.3.3", "postcss": "^8.5.27", "react": "^19.2.8", "react-dom": "^19.2.8", From 1beb5b8820b91b5c580eaf0f1da58e5a20b38085 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Fri, 11 Sep 2026 09:14:24 +0100 Subject: [PATCH 2/4] move tests to __tests__ --- {app/components => __tests__}/Block.test.tsx | 0 {app/components => __tests__}/CheckToggle.test.tsx | 0 {app => __tests__}/Footer.test.tsx | 0 {app/components => __tests__}/GroupUtils.test.ts | 2 +- {app/components => __tests__}/Groups.test.tsx | 0 {app/components => __tests__}/Instrument.test.ts | 0 {app/components => __tests__}/InstrumentWallCard.test.tsx | 0 {app/components => __tests__}/InstrumentsDisplay.test.ts | 0 {app => __tests__}/Navbar.test.tsx | 0 {app/components => __tests__}/PVutils.test.ts | 0 {app/components => __tests__}/ScienceGroup.test.tsx | 0 {app/components => __tests__}/TargetStation.test.tsx | 0 {app/components => __tests__}/TopBar.test.ts | 0 {app/components => __tests__}/__snapshots__/Block.test.tsx.snap | 0 {app => __tests__}/__snapshots__/Footer.test.tsx.snap | 0 .../components => __tests__}/__snapshots__/Groups.test.tsx.snap | 0 .../__snapshots__/InstrumentWallCard.test.tsx.snap | 0 {app => __tests__}/__snapshots__/Navbar.test.tsx.snap | 0 .../__snapshots__/ScienceGroup.test.tsx.snap | 0 .../__snapshots__/TargetStation.test.tsx.snap | 0 {app/components => __tests__}/__snapshots__/TopBar.test.ts.snap | 0 {app => __tests__}/__snapshots__/page.test.tsx.snap | 0 {app/components => __tests__}/dehex_and_decompress.test.ts | 2 +- {app/components => __tests__}/getRunstateColours.test.ts | 0 {app => __tests__}/page.test.tsx | 0 next-env.d.ts | 1 + tsconfig.json | 2 +- 27 files changed, 4 insertions(+), 3 deletions(-) rename {app/components => __tests__}/Block.test.tsx (100%) rename {app/components => __tests__}/CheckToggle.test.tsx (100%) rename {app => __tests__}/Footer.test.tsx (100%) rename {app/components => __tests__}/GroupUtils.test.ts (91%) rename {app/components => __tests__}/Groups.test.tsx (100%) rename {app/components => __tests__}/Instrument.test.ts (100%) rename {app/components => __tests__}/InstrumentWallCard.test.tsx (100%) rename {app/components => __tests__}/InstrumentsDisplay.test.ts (100%) rename {app => __tests__}/Navbar.test.tsx (100%) rename {app/components => __tests__}/PVutils.test.ts (100%) rename {app/components => __tests__}/ScienceGroup.test.tsx (100%) rename {app/components => __tests__}/TargetStation.test.tsx (100%) rename {app/components => __tests__}/TopBar.test.ts (100%) rename {app/components => __tests__}/__snapshots__/Block.test.tsx.snap (100%) rename {app => __tests__}/__snapshots__/Footer.test.tsx.snap (100%) rename {app/components => __tests__}/__snapshots__/Groups.test.tsx.snap (100%) rename {app/components => __tests__}/__snapshots__/InstrumentWallCard.test.tsx.snap (100%) rename {app => __tests__}/__snapshots__/Navbar.test.tsx.snap (100%) rename {app/components => __tests__}/__snapshots__/ScienceGroup.test.tsx.snap (100%) rename {app/components => __tests__}/__snapshots__/TargetStation.test.tsx.snap (100%) rename {app/components => __tests__}/__snapshots__/TopBar.test.ts.snap (100%) rename {app => __tests__}/__snapshots__/page.test.tsx.snap (100%) rename {app/components => __tests__}/dehex_and_decompress.test.ts (99%) rename {app/components => __tests__}/getRunstateColours.test.ts (100%) rename {app => __tests__}/page.test.tsx (100%) diff --git a/app/components/Block.test.tsx b/__tests__/Block.test.tsx similarity index 100% rename from app/components/Block.test.tsx rename to __tests__/Block.test.tsx diff --git a/app/components/CheckToggle.test.tsx b/__tests__/CheckToggle.test.tsx similarity index 100% rename from app/components/CheckToggle.test.tsx rename to __tests__/CheckToggle.test.tsx diff --git a/app/Footer.test.tsx b/__tests__/Footer.test.tsx similarity index 100% rename from app/Footer.test.tsx rename to __tests__/Footer.test.tsx diff --git a/app/components/GroupUtils.test.ts b/__tests__/GroupUtils.test.ts similarity index 91% rename from app/components/GroupUtils.test.ts rename to __tests__/GroupUtils.test.ts index e4601b3..1f410e5 100644 --- a/app/components/GroupUtils.test.ts +++ b/__tests__/GroupUtils.test.ts @@ -1,5 +1,5 @@ import { tBlockMapping } from "@/app/types"; -import { checkIfAllBlocksInGroupAreHidden } from "./GroupUtils"; +import { checkIfAllBlocksInGroupAreHidden } from "@/app/components/GroupUtils"; test("group with all hidden blocks returns true", () => { let blocks: tBlockMapping = new Map(); diff --git a/app/components/Groups.test.tsx b/__tests__/Groups.test.tsx similarity index 100% rename from app/components/Groups.test.tsx rename to __tests__/Groups.test.tsx diff --git a/app/components/Instrument.test.ts b/__tests__/Instrument.test.ts similarity index 100% rename from app/components/Instrument.test.ts rename to __tests__/Instrument.test.ts diff --git a/app/components/InstrumentWallCard.test.tsx b/__tests__/InstrumentWallCard.test.tsx similarity index 100% rename from app/components/InstrumentWallCard.test.tsx rename to __tests__/InstrumentWallCard.test.tsx diff --git a/app/components/InstrumentsDisplay.test.ts b/__tests__/InstrumentsDisplay.test.ts similarity index 100% rename from app/components/InstrumentsDisplay.test.ts rename to __tests__/InstrumentsDisplay.test.ts diff --git a/app/Navbar.test.tsx b/__tests__/Navbar.test.tsx similarity index 100% rename from app/Navbar.test.tsx rename to __tests__/Navbar.test.tsx diff --git a/app/components/PVutils.test.ts b/__tests__/PVutils.test.ts similarity index 100% rename from app/components/PVutils.test.ts rename to __tests__/PVutils.test.ts diff --git a/app/components/ScienceGroup.test.tsx b/__tests__/ScienceGroup.test.tsx similarity index 100% rename from app/components/ScienceGroup.test.tsx rename to __tests__/ScienceGroup.test.tsx diff --git a/app/components/TargetStation.test.tsx b/__tests__/TargetStation.test.tsx similarity index 100% rename from app/components/TargetStation.test.tsx rename to __tests__/TargetStation.test.tsx diff --git a/app/components/TopBar.test.ts b/__tests__/TopBar.test.ts similarity index 100% rename from app/components/TopBar.test.ts rename to __tests__/TopBar.test.ts diff --git a/app/components/__snapshots__/Block.test.tsx.snap b/__tests__/__snapshots__/Block.test.tsx.snap similarity index 100% rename from app/components/__snapshots__/Block.test.tsx.snap rename to __tests__/__snapshots__/Block.test.tsx.snap diff --git a/app/__snapshots__/Footer.test.tsx.snap b/__tests__/__snapshots__/Footer.test.tsx.snap similarity index 100% rename from app/__snapshots__/Footer.test.tsx.snap rename to __tests__/__snapshots__/Footer.test.tsx.snap diff --git a/app/components/__snapshots__/Groups.test.tsx.snap b/__tests__/__snapshots__/Groups.test.tsx.snap similarity index 100% rename from app/components/__snapshots__/Groups.test.tsx.snap rename to __tests__/__snapshots__/Groups.test.tsx.snap diff --git a/app/components/__snapshots__/InstrumentWallCard.test.tsx.snap b/__tests__/__snapshots__/InstrumentWallCard.test.tsx.snap similarity index 100% rename from app/components/__snapshots__/InstrumentWallCard.test.tsx.snap rename to __tests__/__snapshots__/InstrumentWallCard.test.tsx.snap diff --git a/app/__snapshots__/Navbar.test.tsx.snap b/__tests__/__snapshots__/Navbar.test.tsx.snap similarity index 100% rename from app/__snapshots__/Navbar.test.tsx.snap rename to __tests__/__snapshots__/Navbar.test.tsx.snap diff --git a/app/components/__snapshots__/ScienceGroup.test.tsx.snap b/__tests__/__snapshots__/ScienceGroup.test.tsx.snap similarity index 100% rename from app/components/__snapshots__/ScienceGroup.test.tsx.snap rename to __tests__/__snapshots__/ScienceGroup.test.tsx.snap diff --git a/app/components/__snapshots__/TargetStation.test.tsx.snap b/__tests__/__snapshots__/TargetStation.test.tsx.snap similarity index 100% rename from app/components/__snapshots__/TargetStation.test.tsx.snap rename to __tests__/__snapshots__/TargetStation.test.tsx.snap diff --git a/app/components/__snapshots__/TopBar.test.ts.snap b/__tests__/__snapshots__/TopBar.test.ts.snap similarity index 100% rename from app/components/__snapshots__/TopBar.test.ts.snap rename to __tests__/__snapshots__/TopBar.test.ts.snap diff --git a/app/__snapshots__/page.test.tsx.snap b/__tests__/__snapshots__/page.test.tsx.snap similarity index 100% rename from app/__snapshots__/page.test.tsx.snap rename to __tests__/__snapshots__/page.test.tsx.snap diff --git a/app/components/dehex_and_decompress.test.ts b/__tests__/dehex_and_decompress.test.ts similarity index 99% rename from app/components/dehex_and_decompress.test.ts rename to __tests__/dehex_and_decompress.test.ts index 8c7c275..db9ff49 100644 --- a/app/components/dehex_and_decompress.test.ts +++ b/__tests__/dehex_and_decompress.test.ts @@ -1,7 +1,7 @@ import { dehex_and_decompress, instListFromBytes, -} from "./dehex_and_decompress"; +} from "@/app/components/dehex_and_decompress"; const instListHexed = "Nzg5Y2I1OTg2ZjRmZGIzMDEwYzZiZjRhOTVkNzIwMGRiNjY5YTNlZjRjZTJhNGQ2ZTIzOGQ4MGUyYjQzYTg0MjUwMDYxMjFiODhjMjM0NjlkYTc3YzdjZWZmNWUyZmFkMjNjY2NiM2ViZjJhZjdjNDM5ZGY5ZDdkZmUyZmY4N2RmOTZiMTk0YzI3MDE5MTQ5YTE4MmJkNDk3MGZiYjA3YWNlNmEzMThiZTZhZGZlZjgyNzdmNWFkZWRjZmRiNTNhY2JhNmE1M2ViNWUwNmVhNWFlNmU5N2Q3MmZmN2NiNmJjMzllOWY1ZTk2NDZmY2Y5ZjRmMGYyYjgzMmJmY2YyZmNjYWZkNWYyZWFhZTY2ZmZmNzI2NWRkMDcwMjY0NTg2ODZlZDExMTBiODI2MmVhMTAzNWU4ODRjMDUzZDA3Mzc5N2Y3YWI3NTBiMzMxNjMzMjQ3ZTIzODNlMDU2N2VmYjRiYjM5YzQ5ZjQ5ZDFiYjBmMWNhMTZiYzM5YWUzYzEzMjkzOTVlYzhhZjFmYjBlMGViMTQzYTI4ZTkxNzhhNzgyODk3NzQ3ZGQ5NTU5MWU3NDJlYWVkMGIxZjg1MjYxYzYyYTRkNTgxODU1MmY3MTgzZjI1OTIwYmVjMzM3NDAwMzhhODgwNTNlMjI5YjIyYmVmNDgxYTYzYmJhZDUyZTE1ZTRiNjNhN2E4NzQxZTMyNGQzNGRiOTlmNDExZTUwMjViZmE1YTg2MmI2ZjY0YTc4NWRmMWE5MzcxYTI5MTk4OGQwYzYyNWFkOWVkOWRiMzg0NjU5NDRhOTYyNWRiZGZkOWQ2ODI5ODIyMGUzYTAwM2M1NGMwMmRlNTFjMmFjZDBmMjEzODEyYmU5MTQxNzAyYjdiNGEzNTI2MTk1NjYyMWIxOWFlYmM5MWRkOGFhYjQ4NTU0ZWMzZGRiMTE3OGFlYTIyMWY3MGQwNDFjNGM3NDIxZDFlMzlhZWJmOGI5OTMyNTdlNjgzNzYyMDA2ODYyYWZjYzlkMTkwNzM1ZWNlNjQxZTBkNWE1YTg3YjAxOTk1ZjA2M2U0NjZjODk0NzBhNTQ5OWE4YTQ0OTI3Yzc2YjZkYmQ0ODA5ZDAxMjM0ZTI5MzNjYTQzNmUzYTBlOWViOTNkMDI5Y2Q0YzRiZjk5NTNhYThhNTM4NjE1Y2QxZTAxNjY2YWUyNmYzMzU1MTkzODk4Yjk4MzM5M2JiYTkwZWU0ZGM2YWQwZWE3MzI2NTE5NTY1YjViMDA2YjZiMDlmYzc2MzVjOWJlNTFiY2M0ZjcwOGYwNTExMzZmNDU1ZTUxN2NhYTY5NzUxMGJmZDQzZDRlMzU5NDczYjI0ZmIwMTQ2OTAxNGM5MTEyNzhiNDYwMWE1MjQ0NTI2Y2RmZjYwODVjODY4YTM4ZTU0M2M0OTQ5MDExOTUzNGRhZWUyM2ExNThiYmFkNTUxMGRmYTg2MzYzOGZkZTIzMjRjN2Q2YTQ5MWUxZmUzMGIyZGZkZDIxZDRjMDFjZDAwMWUwYTEwMjFlNjc4MThjYTI3MzQ4MmRjM2ZlNmY2NGZmNzU1Y2NkYjFiZTU2YWIzMDI5ZTdlZmQwZDViNDUwMjFiNjNmNWIxZDk4Mjg3NTdmZGYyMDE1MjdkODkxYTc1MmUxNzk0NzljNzg5YTQwNTM4YThkZmViNTBhYTM1MmM3YzFkZjM1ZjFiOTk5MDhkMDhkMjdiMTEzYmU5NWZkYzYwZmNkMjZjMjY2YmI1NmRmMzg2YjFiZGRhZDFlNGIxYWE3MzRkNDgyNTMyZDc3MjViZTg4MzU3ZTAyZWIxMWI4MDEyYWUyYjMzNzE0MTIzYmY2MzYzMjhjNmY2NGE3NmYzMTYyMWQzMmM2YTVjMDZhNDAwNzgwOGIwYTc4NmQ0ZDExZDU1YzIwZjMxMmU5NDBkZjg0YTZkMzhhYzUwNzVlNDc4NTAyOWQxMzBhNzQ0ODI4N2M1ZGI4YjE0YzUzZWNkYWE1ZDUzN2ZhODBkMTdkNjc4MTM5Mjc5ODdmZTM0NzhiMWE2YzllMmMwY2YwZWRjMzk2Y2U0M2I0MjNiNTYwNzM1MjMyYzA1MzVkZTY4NWMyM2U0NTIzNmZkYzg3MjhiNzBmZTE5MDA1ZGY5OTlhMjE5MTFiMTk0NGI2YjJmZjU2NmM5ZjNhNzhmMjVlODc4ODlmODUzYTBhZGZlMWU0OWQ1MzIyNTMyYzMxMWIxZGU2YTVkNWRmZTFmMDZkMWYzYmI4Mzg4MDYyOTYxNjlmMWQ4ZjM1ZTNlZTI1NThjY2Y2ZWQ2NTM0MjcwOTc2M2YwMTMwNzI3YmJmMWYxZTM4MTY1MTg3MmMxNjcxNWM4ZTVjYzg1MGRkMTEzODU1NTdjNDc3MjVlMWMyOGUyMmQ4NjY2ZTAxZGNjZTI1ZjBkOWRjNDMzNjcwYjFkYzIzYjA5YzU1YzRhMzBiNzY0Y2U3NDljMTM0NTVlODc1ZjMzYTg1YmRhNmE0YzRmMTQ2NmRkMGNlYzUyYmNhNGYxMTE5AA=="; diff --git a/app/components/getRunstateColours.test.ts b/__tests__/getRunstateColours.test.ts similarity index 100% rename from app/components/getRunstateColours.test.ts rename to __tests__/getRunstateColours.test.ts diff --git a/app/page.test.tsx b/__tests__/page.test.tsx similarity index 100% rename from app/page.test.tsx rename to __tests__/page.test.tsx diff --git a/next-env.d.ts b/next-env.d.ts index 9edff1c..ce4e94a 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,7 @@ /// /// import "./.next/types/routes.d.ts"; +import "./.next/types/root-params.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/tsconfig.json b/tsconfig.json index 1519d6f..25ac232 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,5 +29,5 @@ ".next/types/**/*.ts", ".next/dev/types/**/*.ts" ], - "exclude": ["node_modules", "jest.*.ts"] + "exclude": ["node_modules"] } From 46055394fd1915c70241b29987d8f002005a8089 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Fri, 11 Sep 2026 09:21:05 +0100 Subject: [PATCH 3/4] fix biome config and run lint:fix --- __tests__/Block.test.tsx | 2 +- __tests__/GroupUtils.test.ts | 8 ++++---- __tests__/Groups.test.tsx | 8 ++++---- __tests__/Instrument.test.ts | 14 +++++++------- __tests__/InstrumentWallCard.test.tsx | 2 +- __tests__/InstrumentsDisplay.test.ts | 2 +- __tests__/PVutils.test.ts | 2 +- __tests__/TopBar.test.ts | 12 ++++++------ app/_app.tsx | 2 +- app/commonVars.ts | 2 +- app/components/Block.tsx | 4 +++- app/components/CheckToggle.tsx | 2 +- app/components/GithubActionsScheduledJobs.tsx | 1 + app/components/Group.tsx | 2 +- app/components/GroupUtils.ts | 2 +- app/components/Groups.tsx | 2 +- app/components/Instrument.ts | 8 ++++---- app/components/InstrumentData.tsx | 14 +++++++++----- app/components/InstrumentWallCard.tsx | 2 +- app/components/InstrumentsDisplay.tsx | 8 ++++---- app/components/PVutils.ts | 2 +- app/components/ScienceGroup.tsx | 5 ++++- app/components/TargetStation.tsx | 2 +- app/components/TopBar.tsx | 2 +- app/components/dehex_and_decompress.ts | 2 +- app/page.tsx | 3 +++ app/wall/page.tsx | 1 + biome.json | 4 ++-- next.config.ts | 2 +- 29 files changed, 68 insertions(+), 54 deletions(-) diff --git a/__tests__/Block.test.tsx b/__tests__/Block.test.tsx index 5052d8e..f786bd6 100644 --- a/__tests__/Block.test.tsx +++ b/__tests__/Block.test.tsx @@ -1,6 +1,6 @@ import { fireEvent, render } from "@testing-library/react"; import Block from "@/app/components/Block"; -import { IfcBlock } from "@/app/types"; +import type { IfcBlock } from "@/app/types"; let tableBody: HTMLTableSectionElement; beforeEach(() => { diff --git a/__tests__/GroupUtils.test.ts b/__tests__/GroupUtils.test.ts index 1f410e5..3c51982 100644 --- a/__tests__/GroupUtils.test.ts +++ b/__tests__/GroupUtils.test.ts @@ -1,22 +1,22 @@ -import { tBlockMapping } from "@/app/types"; import { checkIfAllBlocksInGroupAreHidden } from "@/app/components/GroupUtils"; +import type { tBlockMapping } from "@/app/types"; test("group with all hidden blocks returns true", () => { - let blocks: tBlockMapping = new Map(); + const blocks: tBlockMapping = new Map(); blocks.set("testing", { pvaddress: "", visible: false }); const result = checkIfAllBlocksInGroupAreHidden(blocks); expect(result).toBe(true); }); test("group with all visible blocks returns false", () => { - let blocks: tBlockMapping = new Map(); + const blocks: tBlockMapping = new Map(); blocks.set("testing", { pvaddress: "testing", visible: true }); const result = checkIfAllBlocksInGroupAreHidden(blocks); expect(result).toBe(false); }); test("group with mixed visible blocks returns false", () => { - let blocks: tBlockMapping = new Map(); + const blocks: tBlockMapping = new Map(); blocks.set("block1", { pvaddress: "block1", visible: false }); blocks.set("block2", { pvaddress: "block2", visible: true }); const result = checkIfAllBlocksInGroupAreHidden(blocks); diff --git a/__tests__/Groups.test.tsx b/__tests__/Groups.test.tsx index e3652d0..a5d4570 100644 --- a/__tests__/Groups.test.tsx +++ b/__tests__/Groups.test.tsx @@ -1,10 +1,10 @@ import { render } from "@testing-library/react"; import Groups from "@/app/components/Groups"; -import { tBlockMapping, tGroups } from "@/app/types"; +import type { tBlockMapping, tGroups } from "@/app/types"; it("renders groups correctly with hidden and non hidden groups", () => { - let groups: tGroups = new Map(); - let blocksForGroup1: tBlockMapping = new Map(); + const groups: tGroups = new Map(); + const blocksForGroup1: tBlockMapping = new Map(); blocksForGroup1.set("A:SHOWN:BLOCK", { pvaddress: "A:SHOWN:BLOCK", human_readable_name: "aShownBlock", @@ -19,7 +19,7 @@ it("renders groups correctly with hidden and non hidden groups", () => { }); groups.set("group1", blocksForGroup1); - let blocksForGroup2: tBlockMapping = new Map(); + const blocksForGroup2: tBlockMapping = new Map(); blocksForGroup2.set("A:HIDDEN:BLOCK", { pvaddress: "A:HIDDEN:BLOCK", human_readable_name: "aHiddenBlock", diff --git a/__tests__/Instrument.test.ts b/__tests__/Instrument.test.ts index a51256d..1627bdc 100644 --- a/__tests__/Instrument.test.ts +++ b/__tests__/Instrument.test.ts @@ -11,7 +11,7 @@ import { toPrecision, yesToBoolean, } from "@/app/components/Instrument"; -import { +import type { ConfigOutput, IfcBlock, IfcPVWSMessage, @@ -22,8 +22,8 @@ import { test("findPVInGroups returns a block when it finds one", () => { const blockName = "blockName"; const prefix = "IN:INSTRUMENT"; - let groups: tGroups = new Map(); - let group1Blocks: tBlockMapping = new Map(); + const groups: tGroups = new Map(); + const group1Blocks: tBlockMapping = new Map(); group1Blocks.set(blockName, { human_readable_name: blockName, pvaddress: "some:underlying:pv:name", @@ -132,7 +132,7 @@ test("storePrecision adds precision to a block if it is the first update", () => pv: "", precision: precision, }; - let blockWithoutPrecision: IfcBlock = { pvaddress: "" }; + const blockWithoutPrecision: IfcBlock = { pvaddress: "" }; storePrecision(message, blockWithoutPrecision); expect(blockWithoutPrecision.precision).toEqual(precision); }); @@ -142,16 +142,16 @@ test("getAllBlockPVs returns flat list of blocks, their RC and SPRBV pvs", () => const block1Name = prefix + CSSB + "blockName"; const block2Name = prefix + CSSB + "block2Name"; - let inst = new Instrument(prefix); + const inst = new Instrument(prefix); - let group1Blocks: tBlockMapping = new Map(); + const group1Blocks: tBlockMapping = new Map(); group1Blocks.set(block1Name, { human_readable_name: block1Name, pvaddress: "some:underlying:pv:name", }); inst.groups.set("aGroup", group1Blocks); - let group2Blocks: tBlockMapping = new Map(); + const group2Blocks: tBlockMapping = new Map(); group2Blocks.set(block2Name, { human_readable_name: block2Name, pvaddress: "someother:underlying:pv:name", diff --git a/__tests__/InstrumentWallCard.test.tsx b/__tests__/InstrumentWallCard.test.tsx index 5b20900..a7f56d6 100644 --- a/__tests__/InstrumentWallCard.test.tsx +++ b/__tests__/InstrumentWallCard.test.tsx @@ -1,6 +1,6 @@ import { render } from "@testing-library/react"; import InstrumentWallCard from "@/app/components/InstrumentWallCard"; -import { instListEntryWithRunstatePVandValue } from "@/app/types"; +import type { instListEntryWithRunstatePVandValue } from "@/app/types"; it("renders instrumentwallcard unchanged", () => { const instrument: instListEntryWithRunstatePVandValue = { diff --git a/__tests__/InstrumentsDisplay.test.ts b/__tests__/InstrumentsDisplay.test.ts index b86c5aa..6671676 100644 --- a/__tests__/InstrumentsDisplay.test.ts +++ b/__tests__/InstrumentsDisplay.test.ts @@ -1,5 +1,5 @@ import { createInstrumentGroups } from "@/app/components/InstrumentsDisplay"; -import { instList } from "@/app/types"; +import type { instList } from "@/app/types"; test("createInstrumentGroups adds two instruments from different target stations to the same science group", () => { const instrument1Name = "INST1"; diff --git a/__tests__/PVutils.test.ts b/__tests__/PVutils.test.ts index a8ccd79..1989703 100644 --- a/__tests__/PVutils.test.ts +++ b/__tests__/PVutils.test.ts @@ -3,7 +3,7 @@ import { getPrefix, getPvValue, } from "@/app/components/PVutils"; -import { IfcPVWSMessage, instListEntry } from "@/app/types"; +import type { IfcPVWSMessage, instListEntry } from "@/app/types"; // Test of ExponentialOnThresholdFormat ported from ibex_gui Java code test("GIVEN value 0.1 which is above lower threshold WHEN formatting with precision 3 THEN no exponential notation used", () => { diff --git a/__tests__/TopBar.test.ts b/__tests__/TopBar.test.ts index a64df2a..0f586cc 100644 --- a/__tests__/TopBar.test.ts +++ b/__tests__/TopBar.test.ts @@ -1,13 +1,13 @@ import { render } from "@testing-library/react"; import { Instrument } from "@/app/components/Instrument"; import { exportedForTesting, getRunstate } from "@/app/components/TopBar"; -import { tBlockMapping } from "@/app/types"; +import type { tBlockMapping } from "@/app/types"; test("GetRunstate returns the runstate when it exists and is of string type", () => { const prefix = "TESTING:"; const expected = "SETUP"; - let blocks: tBlockMapping = new Map(); + const blocks: tBlockMapping = new Map(); blocks.set(prefix + "DAE:RUNSTATE_STR", { pvaddress: prefix + "DAE:RUNSTATE_STR", value: expected, @@ -23,7 +23,7 @@ test("GetRunstate returns unknown when no runstate PV in array", () => { it("renders topbar unchanged", () => { const prefix = "TESTING:"; - let instrument = new Instrument(prefix); + const instrument = new Instrument(prefix); const instName = "Instrument"; const { container } = render( exportedForTesting({ @@ -39,7 +39,7 @@ it("renders topbar unchanged", () => { it("draws instName expectedly", () => { const prefix = "TESTING:"; - let instrument = new Instrument(prefix); + const instrument = new Instrument(prefix); const instName = "Instrument"; const { container } = render( exportedForTesting({ @@ -56,8 +56,8 @@ it("draws instName expectedly", () => { it("draws configName expectedly", () => { const prefix = "TESTING:"; - let instrument = new Instrument(prefix); - let configNamePV = instrument.runInfoPVs.get( + const instrument = new Instrument(prefix); + const configNamePV = instrument.runInfoPVs.get( prefix + "CS:BLOCKSERVER:CURR_CONFIG_NAME", ); const expectedConfigName = "Aconfig"; diff --git a/app/_app.tsx b/app/_app.tsx index 4979847..bdac731 100644 --- a/app/_app.tsx +++ b/app/_app.tsx @@ -1,6 +1,6 @@ // import "@/styles/globals.css"; import "./globals.css"; -import { AppProps } from "next/app"; +import type { AppProps } from "next/app"; export default function App({ Component, pageProps }: AppProps) { return ; diff --git a/app/commonVars.ts b/app/commonVars.ts index 053c5fa..60022f0 100644 --- a/app/commonVars.ts +++ b/app/commonVars.ts @@ -1,4 +1,4 @@ -import { IfcPVWSRequest, PVWSRequestType } from "@/app/types"; +import { type IfcPVWSRequest, PVWSRequestType } from "@/app/types"; export const instListPV = "CS:INSTLIST"; export const socketURL = diff --git a/app/components/Block.tsx b/app/components/Block.tsx index f82d9f7..16f6a0c 100644 --- a/app/components/Block.tsx +++ b/app/components/Block.tsx @@ -1,6 +1,6 @@ "use client"; import { useState } from "react"; -import { IfcBlock } from "@/app/types"; +import type { IfcBlock } from "@/app/types"; const grafana_stub = "https://shadow.nd.rl.ac.uk/grafana/d/wMlwwaHMk/block-history?viewPanel=2&orgId=1&var-block="; @@ -55,6 +55,7 @@ export default function Block({ instName.toUpperCase().replace("-", "_") } target="_blank" + rel="noopener" > {pv.human_readable_name} @@ -92,6 +93,7 @@ export default function Block({ href="https://github.com/ISISComputingGroup/ibex_user_manual/wiki/Blocks#alarms" className="text-red-400" target="_blank" + rel="noopener" > Alarm: {pv.severity} diff --git a/app/components/CheckToggle.tsx b/app/components/CheckToggle.tsx index cac0046..f38f863 100644 --- a/app/components/CheckToggle.tsx +++ b/app/components/CheckToggle.tsx @@ -1,4 +1,4 @@ -import { Dispatch, memo, SetStateAction, useCallback } from "react"; +import { type Dispatch, memo, type SetStateAction, useCallback } from "react"; const CheckToggle = memo(function CheckToggle({ checked, diff --git a/app/components/GithubActionsScheduledJobs.tsx b/app/components/GithubActionsScheduledJobs.tsx index 6675b06..36a05ce 100644 --- a/app/components/GithubActionsScheduledJobs.tsx +++ b/app/components/GithubActionsScheduledJobs.tsx @@ -28,6 +28,7 @@ function GithubActionsJob({ "flex flex-row h-10 w-full rounded-lg bg-gray-800 border-2 border-black hover:border-white" } target={"_blank"} + rel="noopener" >

{repo}

diff --git a/app/components/Group.tsx b/app/components/Group.tsx index 7e16859..56e57a0 100644 --- a/app/components/Group.tsx +++ b/app/components/Group.tsx @@ -1,5 +1,5 @@ import { memo } from "react"; -import { tBlockMapping } from "@/app/types"; +import type { tBlockMapping } from "@/app/types"; import Block from "./Block"; import { checkIfAllBlocksInGroupAreHidden } from "./GroupUtils"; diff --git a/app/components/GroupUtils.ts b/app/components/GroupUtils.ts index d2fdfa7..e3edd6a 100644 --- a/app/components/GroupUtils.ts +++ b/app/components/GroupUtils.ts @@ -1,4 +1,4 @@ -import { tBlockMapping } from "@/app/types"; +import type { tBlockMapping } from "@/app/types"; export function checkIfAllBlocksInGroupAreHidden( blocks: tBlockMapping, diff --git a/app/components/Groups.tsx b/app/components/Groups.tsx index 0dacee4..971edae 100644 --- a/app/components/Groups.tsx +++ b/app/components/Groups.tsx @@ -1,4 +1,4 @@ -import { tGroups } from "@/app/types"; +import type { tGroups } from "@/app/types"; import Group from "./Group"; export default function Groups({ diff --git a/app/components/Instrument.ts b/app/components/Instrument.ts index f0055f9..ad74d53 100644 --- a/app/components/Instrument.ts +++ b/app/components/Instrument.ts @@ -1,5 +1,5 @@ import { ExponentialOnThresholdFormat } from "@/app/components/PVutils"; -import { +import type { ConfigOutput, ConfigOutputBlock, IfcBlock, @@ -176,7 +176,7 @@ export class Instrument { } clone(): Instrument { - let cloned = new Instrument(this.prefix); + const cloned = new Instrument(this.prefix); cloned.groups = structuredClone(this.groups); cloned.runInfoPVs = structuredClone(this.runInfoPVs); cloned.dashboard = structuredClone(this.dashboard); @@ -241,10 +241,10 @@ export function getGroupsWithBlocksFromConfigOutput( configOutput: ConfigOutput, ): tGroups { const configOutputGroups = configOutput.groups; - let newGroups: tGroups = new Map(); + const newGroups: tGroups = new Map(); for (const configOutputGroup of configOutputGroups) { const groupName = configOutputGroup.name; - let blocks: tBlockMapping = new Map(); + const blocks: tBlockMapping = new Map(); for (const configOutputBlock of configOutputGroup.blocks) { const newBlock = configOutput.blocks.find( (b: ConfigOutputBlock) => b.name === configOutputBlock, diff --git a/app/components/InstrumentData.tsx b/app/components/InstrumentData.tsx index 12a285e..48defe0 100644 --- a/app/components/InstrumentData.tsx +++ b/app/components/InstrumentData.tsx @@ -1,5 +1,5 @@ "use client"; -import { RefObject, useEffect, useRef, useState } from "react"; +import { type RefObject, useEffect, useRef, useState } from "react"; import useWebSocket from "react-use-websocket"; import { instListPV, @@ -27,7 +27,11 @@ import { } from "@/app/components/Instrument"; import { getPrefix, getPvValue } from "@/app/components/PVutils"; import TopBar from "@/app/components/TopBar"; -import { IfcPVWSMessage, IfcPVWSRequest, PVWSRequestType } from "@/app/types"; +import { + type IfcPVWSMessage, + type IfcPVWSRequest, + PVWSRequestType, +} from "@/app/types"; export function InstrumentData({ instrumentName }: { instrumentName: string }) { const [showHiddenBlocks, setShowHiddenBlocks] = useState(false); @@ -46,7 +50,7 @@ export function InstrumentData({ instrumentName }: { instrumentName: string }) { } }, [instName]); - let messageQueue: RefObject> = useRef([]); + const messageQueue: RefObject> = useRef([]); const { sendJsonMessage, @@ -88,7 +92,7 @@ export function InstrumentData({ instrumentName }: { instrumentName: string }) { // config hasnt actually changed so do nothing return; } - let newInstrument = currentInstrument.clone(); + const newInstrument = currentInstrument.clone(); newInstrument.groups = getGroupsWithBlocksFromConfigOutput( newInstrument.prefix, JSON.parse(dehex_and_decompress(atob(updatedPVbytes))), @@ -130,7 +134,7 @@ export function InstrumentData({ instrumentName }: { instrumentName: string }) { ); // Clone the instrument object here to avoid mutating the state without calling setState() - let newInstrument = currentInstrument.clone(); + const newInstrument = currentInstrument.clone(); while (true) { const updatedPV = messageQueue.current.shift(); diff --git a/app/components/InstrumentWallCard.tsx b/app/components/InstrumentWallCard.tsx index 283aa36..376c418 100644 --- a/app/components/InstrumentWallCard.tsx +++ b/app/components/InstrumentWallCard.tsx @@ -1,5 +1,5 @@ import Link from "next/link"; -import { instListEntryWithRunstatePVandValue } from "@/app/types"; +import type { instListEntryWithRunstatePVandValue } from "@/app/types"; import { getForegroundColour, getStatusColour, diff --git a/app/components/InstrumentsDisplay.tsx b/app/components/InstrumentsDisplay.tsx index 9a3a069..4d07e80 100644 --- a/app/components/InstrumentsDisplay.tsx +++ b/app/components/InstrumentsDisplay.tsx @@ -12,9 +12,9 @@ import { instListFromBytes } from "@/app/components/dehex_and_decompress"; import ScienceGroup from "@/app/components/ScienceGroup"; import TargetStation from "@/app/components/TargetStation"; import { - IfcPVWSMessage, - IfcPVWSRequest, - instList, + type IfcPVWSMessage, + type IfcPVWSRequest, + type instList, PVWSRequestType, } from "@/app/types"; @@ -24,7 +24,7 @@ const instrumentsExcludeList = ["SUPPORT"]; export function createInstrumentGroups( instruments: instList, ): Map { - let newInstrumentGroups: Map = new Map(); + const newInstrumentGroups: Map = new Map(); instruments.forEach((inst) => { inst.groups .filter((group) => !instrumentsExcludeList.includes(group)) diff --git a/app/components/PVutils.ts b/app/components/PVutils.ts index 2d6d530..fa798fb 100644 --- a/app/components/PVutils.ts +++ b/app/components/PVutils.ts @@ -1,4 +1,4 @@ -import { IfcPVWSMessage, instListEntry } from "@/app/types"; +import type { IfcPVWSMessage, instListEntry } from "@/app/types"; /** * Formats a given PV value input such that above or below a threshold value, diff --git a/app/components/ScienceGroup.tsx b/app/components/ScienceGroup.tsx index 64e2d9d..5c7c62d 100644 --- a/app/components/ScienceGroup.tsx +++ b/app/components/ScienceGroup.tsx @@ -1,5 +1,8 @@ import InstrumentWallCard from "@/app/components/InstrumentWallCard"; -import { instList, instListEntryWithRunstatePVandValue } from "@/app/types"; +import type { + instList, + instListEntryWithRunstatePVandValue, +} from "@/app/types"; export default function ScienceGroup({ name, diff --git a/app/components/TargetStation.tsx b/app/components/TargetStation.tsx index 6ee0544..9a50401 100644 --- a/app/components/TargetStation.tsx +++ b/app/components/TargetStation.tsx @@ -1,4 +1,4 @@ -import { instListEntryWithRunstatePVandValue } from "@/app/types"; +import type { instListEntryWithRunstatePVandValue } from "@/app/types"; import InstrumentWallCard from "./InstrumentWallCard"; export default function TargetStation({ diff --git a/app/components/TopBar.tsx b/app/components/TopBar.tsx index 4575236..6d0eb81 100644 --- a/app/components/TopBar.tsx +++ b/app/components/TopBar.tsx @@ -1,6 +1,6 @@ import { memo } from "react"; import { DASHBOARD } from "@/app/components/Instrument"; -import { tBlockMapping } from "@/app/types"; +import type { tBlockMapping } from "@/app/types"; import { getForegroundColour, getStatusColour, diff --git a/app/components/dehex_and_decompress.ts b/app/components/dehex_and_decompress.ts index ad051bf..28fc180 100644 --- a/app/components/dehex_and_decompress.ts +++ b/app/components/dehex_and_decompress.ts @@ -1,5 +1,5 @@ import { unzipSync } from "zlib"; -import { instList } from "@/app/types"; +import type { instList } from "@/app/types"; /** * dehex_and_decompress * - synonymous to dehex_and_decompress in inst_servers diff --git a/app/page.tsx b/app/page.tsx index 0a1d2f0..12287cc 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -84,6 +84,7 @@ export default function Home() { href="https://stfc365.sharepoint.com/sites/isis-hub/SitePages/Instrument-Quick-Links.aspx" className="inline-flex p-2 text-blue-500 capitalize transition-colors duration-200 transform bg-blue-100 rounded-full dark:bg-blue-500 dark:text-white hover:underline hover:bg-blue-400 dark:hover:bg-blue-400" target="_blank" + rel="noopener" >

Jenkins jobs (external) diff --git a/biome.json b/biome.json index 961a4db..978edae 100644 --- a/biome.json +++ b/biome.json @@ -1,11 +1,11 @@ { - "$schema": "https://biomejs.dev/schemas/2.3.10/schema.json", + "$schema": "https://biomejs.dev/schemas/2.5.11/schema.json", "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, "files": { "ignoreUnknown": false }, "formatter": { "enabled": true, "indentStyle": "space", "indentWidth": 2 }, "linter": { "enabled": true, - "rules": { "recommended": false }, + "rules": { "preset": "none" }, "includes": ["**", "!./node_modules", "!./out", "!./coverage"] }, "javascript": { "formatter": { "quoteStyle": "double" } }, diff --git a/next.config.ts b/next.config.ts index 4293485..5602c8c 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,4 +1,4 @@ -import { NextConfig } from "next"; +import type { NextConfig } from "next"; const nextConfig: NextConfig = { reactStrictMode: true, From 5a88560c818b8e757d187ea2cc6d1288e4ced190 Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Fri, 11 Sep 2026 09:22:59 +0100 Subject: [PATCH 4/4] update snapshots --- __tests__/__snapshots__/Block.test.tsx.snap | 1 + __tests__/__snapshots__/Groups.test.tsx.snap | 2 ++ __tests__/__snapshots__/page.test.tsx.snap | 3 +++ 3 files changed, 6 insertions(+) diff --git a/__tests__/__snapshots__/Block.test.tsx.snap b/__tests__/__snapshots__/Block.test.tsx.snap index bf4e4c3..8120b7a 100644 --- a/__tests__/__snapshots__/Block.test.tsx.snap +++ b/__tests__/__snapshots__/Block.test.tsx.snap @@ -11,6 +11,7 @@ exports[`renders topbar unchanged 1`] = ` diff --git a/__tests__/__snapshots__/Groups.test.tsx.snap b/__tests__/__snapshots__/Groups.test.tsx.snap index cc5d8b9..201339f 100644 --- a/__tests__/__snapshots__/Groups.test.tsx.snap +++ b/__tests__/__snapshots__/Groups.test.tsx.snap @@ -49,6 +49,7 @@ exports[`renders groups correctly with hidden and non hidden groups 1`] = ` aShownBlock @@ -110,6 +111,7 @@ exports[`renders groups correctly with hidden and non hidden groups 1`] = ` aDifferentShownBlock diff --git a/__tests__/__snapshots__/page.test.tsx.snap b/__tests__/__snapshots__/page.test.tsx.snap index d94f86b..7e00b82 100644 --- a/__tests__/__snapshots__/page.test.tsx.snap +++ b/__tests__/__snapshots__/page.test.tsx.snap @@ -108,6 +108,7 @@ exports[`renders main page unchanged 1`] = `