From 861bbde8ca83de159b5bb5ff98606ae52d28104f Mon Sep 17 00:00:00 2001 From: Matt Godbolt Date: Mon, 1 Jun 2026 18:50:47 -0500 Subject: [PATCH] =?UTF-8?q?Update=20major=20dependencies=20(TypeScript=206?= =?UTF-8?q?,=20zod=204,=20webpack-cli=207,=20commander=2015,=20=E2=80=A6)?= =?UTF-8?q?=20(#8761)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the remaining major-version dependencies. **golden-layout is deliberately excluded** (we depend on its internals too heavily for the 1.x → 2.x jump). Each bump is its own commit, verified independently (ts-check, lint, unit tests, and where relevant the webpack build + cypress). ## Included - **TypeScript 6.0** — pin `ignoreDeprecations: "6.0"` (downlevelIteration + the frontend's `es5` target are deprecated-but-functional until TS7), pin the frontend to `module=commonjs`/`moduleResolution=node` (TS6's new esnext/bundler defaults break deep monaco esm imports), and declare `*.css`/`*.scss` side-effect modules (`noUncheckedSideEffectImports` now defaults true). - **marked 18** — no code changes; only use is the Claude-explain view. - **Build chain**: webpack-cli 7 (renamed `--node-env` → `--config-node-env` in the `webpack` script), webpack-dev-middleware 8, sass-loader 17. - **zod 4** — only used by the MCP tool schemas via stable primitives; MCP SDK already supports `^3.25 || ^4.0`. - **lint-staged 17** — dev tooling; pre-commit pipeline exercised. - **commander 15** — both CLI entrypoints use options only; v15's stricter excess-args default only tightens rejection of stray positionals. Requires Node ≥22.12. - **enhanced-ms 5**, **which 7** — small utilities, APIs unchanged. ## Node floor bump — split into its own PR The first commit (`Bump Node floor to v22`: `engines >=22` + `find-node` `NODE_MIN_VERSION=22`) is **isolated and intended to be cherry-picked into a separate PR**. It aligns the declared floor with production (Node 22.13.1) and is a prerequisite for commander 15 (needs ≥22.12). ## Follow-ups (not in this PR) - The `es5 → es2015` frontend migration, required before TS7 (currently bridged by `ignoreDeprecations`). ## Testing - Local: ts-check, lint, full unit suite, production webpack build, and cypress (81 specs) all pass. - Pre-existing: 13 `dontMaskFilenames` filter snapshots fail **locally only** (a local /tmp path leaks into output where the snapshot expects a clean `example.cpp`); they fail identically on `main` and pass in CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- package-lock.json | 269 +++++++++++++++++++++-------------------- package.json | 22 ++-- static/client.d.ts | 5 + tsconfig.base.json | 4 + tsconfig.frontend.json | 4 + 5 files changed, 161 insertions(+), 143 deletions(-) diff --git a/package-lock.json b/package-lock.json index dd85f8679..12c4f01a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,11 +28,11 @@ "buffer": "^6.0.3", "chart.js": "^4.5.1", "clipboard": "^2.0.11", - "commander": "^14.0.3", + "commander": "^15.0.0", "compression": "^1.8.1", "copy-webpack-plugin": "^14.0.0", "cross-env": "^10.1.0", - "enhanced-ms": "^4.3.0", + "enhanced-ms": "^5.0.0", "events": "^3.3.0", "express": "^5.2.1", "file-saver": "^2.0.5", @@ -44,7 +44,7 @@ "lodash.clonedeep": "^4.5.0", "lru-cache": "^11.5.1", "lz-string": "^1.5.0", - "marked": "^17.0.6", + "marked": "^18.0.4", "monaco-editor": "^0.55.1", "monaco-vim": "^0.4.4", "morgan": "^1.10.1", @@ -74,7 +74,7 @@ "winston-transport": "^4.9.0", "ws": "^8.21.0", "yaml": "^2.9.0", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "devDependencies": { "@biomejs/biome": "^2.4.16", @@ -106,28 +106,28 @@ "file-loader": "^6.2.0", "happy-dom": "^20.9.0", "husky": "^9.1.7", - "lint-staged": "^16.4.0", + "lint-staged": "^17.0.7", "mini-css-extract-plugin": "^2.10.2", "mock-fs": "^5.5.0", "monaco-editor-webpack-plugin": "^7.1.1", "nock": "^14.0.15", "npm-run-all": "^4.1.5", "sass": "^1.100.0", - "sass-loader": "^16.0.8", + "sass-loader": "^17.0.0", "source-map-loader": "^5.0.0", "supertest": "^7.2.2", "terser-webpack-plugin": "^5.6.1", "ts-loader": "^9.6.0", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.1", "vitest-fetch-mock": "^0.4.5", "webpack": "^5.107.2", - "webpack-cli": "^6.0.1", - "webpack-dev-middleware": "^7.4.5", + "webpack-cli": "^7.0.3", + "webpack-dev-middleware": "^8.0.3", "webpack-manifest-plugin": "^6.0.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" }, "optionalDependencies": { "@rollup/rollup-darwin-arm64": "^4.61.0", @@ -1181,9 +1181,9 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.1.0.tgz", + "integrity": "sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==", "dev": true, "license": "MIT", "engines": { @@ -4582,53 +4582,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@webpack-cli/configtest": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", - "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", - "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", - "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5914,12 +5867,12 @@ } }, "node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", "license": "MIT", "engines": { - "node": ">=20" + "node": ">=22.12.0" } }, "node_modules/common-tags": { @@ -6883,9 +6836,9 @@ } }, "node_modules/enhanced-ms": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-ms/-/enhanced-ms-4.3.0.tgz", - "integrity": "sha512-mMl+aCNSDcVf7Q0KKkp600JFoK9eimXgmdrN8wHNyyKeZbOr88XJw1m8qOIAknuAAPfxxVZMwrU77YG8ol9Oxw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/enhanced-ms/-/enhanced-ms-5.0.0.tgz", + "integrity": "sha512-7G13wh93e2KQsJ6SK5m9RjmmDkFynZArSxv+8RSXIl4U9cwn0E5A3ZiLZlRDiUGosHT8mEHXMazFtp5Dt0dLVQ==", "license": "MIT" }, "node_modules/enhanced-resolve": { @@ -7512,16 +7465,6 @@ "fxparser": "src/cli/cli.js" } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -9634,27 +9577,100 @@ } }, "node_modules/lint-staged": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz", - "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", + "version": "17.0.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.0.7.tgz", + "integrity": "sha512-JrSobt+tW3rH8IOMi8tDZd3foorM5yPEkLD/V2NxobgHrFfHWGee4MOLVuZeScgxftEwbHrPHIFA/ZL+nUJeuA==", "dev": true, "license": "MIT", "dependencies": { - "commander": "^14.0.3", - "listr2": "^9.0.5", - "picomatch": "^4.0.3", + "listr2": "^10.2.1", + "picomatch": "^4.0.4", "string-argv": "^0.3.2", - "tinyexec": "^1.0.4", - "yaml": "^2.8.2" + "tinyexec": "^1.2.4" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": ">=20.17" + "node": ">=22.22.1" }, "funding": { "url": "https://opencollective.com/lint-staged" + }, + "optionalDependencies": { + "yaml": "^2.9.0" + } + }, + "node_modules/lint-staged/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lint-staged/node_modules/listr2": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.1.tgz", + "integrity": "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.2.0", + "eventemitter3": "^5.0.4", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^10.0.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/lint-staged/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/wrap-ansi": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz", + "integrity": "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/listr2": { @@ -9936,9 +9952,9 @@ } }, "node_modules/marked": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.6.tgz", - "integrity": "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.4.tgz", + "integrity": "sha512-c/BTaKzg0G6ezQx97DAkYU7k0HM6ys0FqYeKBL6hlBByZwy+ycA1+f0vDdjMHKKeEjdgkx0GOv9Il6D+85cOqA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -12476,16 +12492,13 @@ } }, "node_modules/sass-loader": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.8.tgz", - "integrity": "sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-17.0.0.tgz", + "integrity": "sha512-0Ybm8ohBQ9LcrycVrFQp/KQBNX5a3Wda9/smS0mE/xLffzEnwvV8nykOzrbiSWNzTE3IB/jiXx8O4QmDPG2+Gw==", "dev": true, "license": "MIT", - "dependencies": { - "neo-async": "^2.6.2" - }, "engines": { - "node": ">= 18.12.0" + "node": ">= 22.11.0" }, "funding": { "type": "opencollective", @@ -12493,7 +12506,6 @@ }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -12502,9 +12514,6 @@ "@rspack/core": { "optional": true }, - "node-sass": { - "optional": true - }, "sass": { "optional": true }, @@ -14187,9 +14196,9 @@ } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "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": { @@ -14629,21 +14638,16 @@ } }, "node_modules/webpack-cli": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", - "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.0.3.tgz", + "integrity": "sha512-2E2C6A1e2El7791zQgTH7LPIuwLjRliow9OHS/qlJc9pwhZlCoL/uiwqd/1WSlXT83wJfmfDbkcqHXuXoPJZ3g==", "dev": true, "license": "MIT", "dependencies": { - "@discoveryjs/json-ext": "^0.6.1", - "@webpack-cli/configtest": "^3.0.1", - "@webpack-cli/info": "^3.0.1", - "@webpack-cli/serve": "^3.0.1", - "colorette": "^2.0.14", - "commander": "^12.1.0", - "cross-spawn": "^7.0.3", + "@discoveryjs/json-ext": "^1.1.0", + "commander": "^14.0.3", + "cross-spawn": "^7.0.6", "envinfo": "^7.14.0", - "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^3.1.1", "rechoir": "^0.8.0", @@ -14653,14 +14657,16 @@ "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=18.12.0" + "node": ">=20.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.82.0" + "webpack": "^5.101.0", + "webpack-bundle-analyzer": "^4.0.0 || ^5.0.0", + "webpack-dev-server": "^5.0.0" }, "peerDependenciesMeta": { "webpack-bundle-analyzer": { @@ -14672,38 +14678,37 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-8.0.3.tgz", + "integrity": "sha512-zWrde9VZDiRaFuWsjHO40wm9LxxtXEk8DdzFXdU7eU5ZpiANnZZDBbZgN3guxbEoKqUHd9YupBmynyioz42nkA==", "dev": true, "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", + "memfs": "^4.56.10", + "mime-types": "^3.0.2", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "schema-utils": "^4.3.3" }, "engines": { - "node": ">= 18.12.0" + "node": ">= 20.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.101.0" }, "peerDependenciesMeta": { "webpack": { @@ -15178,9 +15183,9 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index c0e6fcd0b..0c1bc2a29 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ }, "version": "0.0.3", "engines": { - "node": ">=22.0.0" + "node": ">=22.12.0" }, "main": "./app.ts", "dependencies": { @@ -37,11 +37,11 @@ "buffer": "^6.0.3", "chart.js": "^4.5.1", "clipboard": "^2.0.11", - "commander": "^14.0.3", + "commander": "^15.0.0", "compression": "^1.8.1", "copy-webpack-plugin": "^14.0.0", "cross-env": "^10.1.0", - "enhanced-ms": "^4.3.0", + "enhanced-ms": "^5.0.0", "events": "^3.3.0", "express": "^5.2.1", "file-saver": "^2.0.5", @@ -53,7 +53,7 @@ "lodash.clonedeep": "^4.5.0", "lru-cache": "^11.5.1", "lz-string": "^1.5.0", - "marked": "^17.0.6", + "marked": "^18.0.4", "monaco-editor": "^0.55.1", "monaco-vim": "^0.4.4", "morgan": "^1.10.1", @@ -83,7 +83,7 @@ "winston-transport": "^4.9.0", "ws": "^8.21.0", "yaml": "^2.9.0", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "devDependencies": { "@biomejs/biome": "^2.4.16", @@ -115,24 +115,24 @@ "file-loader": "^6.2.0", "happy-dom": "^20.9.0", "husky": "^9.1.7", - "lint-staged": "^16.4.0", + "lint-staged": "^17.0.7", "mini-css-extract-plugin": "^2.10.2", "mock-fs": "^5.5.0", "monaco-editor-webpack-plugin": "^7.1.1", "nock": "^14.0.15", "npm-run-all": "^4.1.5", "sass": "^1.100.0", - "sass-loader": "^16.0.8", + "sass-loader": "^17.0.0", "source-map-loader": "^5.0.0", "supertest": "^7.2.2", "terser-webpack-plugin": "^5.6.1", "ts-loader": "^9.6.0", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.1", "vitest-fetch-mock": "^0.4.5", "webpack": "^5.107.2", - "webpack-cli": "^6.0.1", - "webpack-dev-middleware": "^7.4.5", + "webpack-cli": "^7.0.3", + "webpack-dev-middleware": "^8.0.3", "webpack-manifest-plugin": "^6.0.1" }, "optionalDependencies": { @@ -167,7 +167,7 @@ "ts-check:tests": "tsc -p ./tsconfig.tests.json --noEmit", "ts-check:frontend-tests": "tsc -p ./tsconfig.frontend.tests.json --noEmit", "ts-check:cypress": "tsc -p ./cypress/tsconfig.json --noEmit", - "webpack": "node --no-warnings=ExperimentalWarning --import=tsx ./node_modules/webpack-cli/bin/cli.js --node-env=production --config webpack.config.esm.ts" + "webpack": "node --no-warnings=ExperimentalWarning --import=tsx ./node_modules/webpack-cli/bin/cli.js --config-node-env=production --config webpack.config.esm.ts" }, "license": "BSD-2-Clause", "packageManager": "npm@11.2.0" diff --git a/static/client.d.ts b/static/client.d.ts index ed2ce5256..589c69d37 100644 --- a/static/client.d.ts +++ b/static/client.d.ts @@ -36,6 +36,11 @@ declare module '*.pug' { export default content; } +// Side-effect CSS/SCSS imports; webpack handles the actual bundling. TS6 defaults +// noUncheckedSideEffectImports to true, so these need ambient declarations. +declare module '*.css'; +declare module '*.scss'; + declare module '*.svg' { const src: string; export default src; diff --git a/tsconfig.base.json b/tsconfig.base.json index b8bd70e3c..fc397e27b 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -4,6 +4,10 @@ "sourceMap": true, "downlevelIteration": true, "importHelpers": true, + /* TS6 deprecates downlevelIteration and the frontend's es5 target; both still + function until TS7. Silence the deprecation errors until the es5->es2015 + migration is tackled separately. */ + "ignoreDeprecations": "6.0", /* Module resolution */ "esModuleInterop": true, /* Other options */ diff --git a/tsconfig.frontend.json b/tsconfig.frontend.json index b489f9da2..948098465 100644 --- a/tsconfig.frontend.json +++ b/tsconfig.frontend.json @@ -3,6 +3,10 @@ "compilerOptions": { /* Module resolution */ "target": "es5", + /* Pin to the pre-TS6 inferred defaults (TS6 would otherwise default these to + esnext/bundler, which breaks deep monaco esm imports and CSS side-effects). */ + "module": "commonjs", + "moduleResolution": "node", /* Code generation */ "inlineSources": true, "strictPropertyInitialization": false,