From 7292ae1ed592c1f8f20f243082b3b80bf1c1da50 Mon Sep 17 00:00:00 2001 From: silverwind Date: Sat, 31 Jan 2026 13:58:23 +0100 Subject: [PATCH 1/8] Update JS deps, remove `knip`, misc tweaks (#36499) - Update all JS deps - Enable a few more stylelint stylistic rules and fix issues - Remove knip, it raised another false-positive, this tool is not worth it when you have to babysit it like that - Exclude @eslint/json from updating as it requires unreleased eslint 10 ([ref](https://github.com/eslint/json/issues/207)) - Update labeler config for new eslint filenames - Adjust `make help` output - Add type checking in `stylelint.config.ts` --- .github/labeler.yml | 2 +- Makefile | 6 +- knip.config.ts | 18 - package.json | 31 +- pnpm-lock.yaml | 970 ++++++++++++++------------------------ stylelint.config.js | 8 +- updates.config.ts | 1 + web_src/css/repo/wiki.css | 2 +- 8 files changed, 371 insertions(+), 667 deletions(-) delete mode 100644 knip.config.ts diff --git a/.github/labeler.yml b/.github/labeler.yml index 64127e50e9..68a0f30fd6 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -84,9 +84,9 @@ docs-update-needed: topic/code-linting: - changed-files: - any-glob-to-any-file: - - ".eslintrc.cjs" - ".golangci.yml" - ".markdownlint.yaml" - ".spectral.yaml" - ".yamllint.yaml" + - "eslint*.config.*" - "stylelint.config.*" diff --git a/Makefile b/Makefile index 0a5f174d6d..6054611580 100644 --- a/Makefile +++ b/Makefile @@ -314,16 +314,14 @@ lint-backend: lint-go lint-go-gitea-vet lint-editorconfig ## lint backend files lint-backend-fix: lint-go-fix lint-go-gitea-vet lint-editorconfig ## lint backend files and fix issues .PHONY: lint-js -lint-js: node_modules ## lint js files +lint-js: node_modules ## lint js and ts files $(NODE_VARS) pnpm exec eslint --color --max-warnings=0 $(ESLINT_FILES) $(NODE_VARS) pnpm exec vue-tsc - $(NODE_VARS) pnpm exec knip --no-progress --cache .PHONY: lint-js-fix -lint-js-fix: node_modules ## lint js files and fix issues +lint-js-fix: node_modules ## lint js and ts files and fix issues $(NODE_VARS) pnpm exec eslint --color --max-warnings=0 $(ESLINT_FILES) --fix $(NODE_VARS) pnpm exec vue-tsc - $(NODE_VARS) pnpm exec knip --no-progress --cache --fix .PHONY: lint-css lint-css: node_modules ## lint css files diff --git a/knip.config.ts b/knip.config.ts deleted file mode 100644 index 3f63cbc775..0000000000 --- a/knip.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type {KnipConfig} from 'knip'; - -export default { - entry: [ - '*.ts', - 'tools/**/*.ts', - 'tests/e2e/**/*.ts', - ], - ignoreDependencies: [ - // dependencies used in Makefile or tools - '@primer/octicons', - 'markdownlint-cli', - 'nolyfill', - 'spectral-cli-bundle', - 'vue-tsc', - 'webpack-cli', - ], -} satisfies KnipConfig; diff --git a/package.json b/package.json index acac860a39..f50bdb0ffb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "type": "module", - "packageManager": "pnpm@10.28.1", + "packageManager": "pnpm@10.28.2", "engines": { "node": ">= 22.6.0", "pnpm": ">= 10.0.0" @@ -28,7 +28,7 @@ "clippie": "4.1.9", "compare-versions": "6.1.1", "cropperjs": "1.6.2", - "css-loader": "7.1.2", + "css-loader": "7.1.3", "dayjs": "1.11.19", "dropzone": "6.0.0-beta.2", "easymde": "2.20.0", @@ -37,7 +37,7 @@ "idiomorph": "0.7.4", "jquery": "4.0.0", "js-yaml": "4.1.1", - "katex": "0.16.27", + "katex": "0.16.28", "mermaid": "11.12.2", "mini-css-extract-plugin": "2.10.0", "monaco-editor": "0.55.1", @@ -68,7 +68,7 @@ "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", "@eslint/json": "0.14.0", - "@playwright/test": "1.58.0", + "@playwright/test": "1.58.1", "@stylistic/eslint-plugin": "5.7.1", "@stylistic/stylelint-plugin": "5.0.1", "@types/codemirror": "5.60.17", @@ -82,7 +82,7 @@ "@types/throttle-debounce": "5.0.2", "@types/tinycolor2": "1.4.6", "@types/toastify-js": "1.12.4", - "@typescript-eslint/parser": "8.53.1", + "@typescript-eslint/parser": "8.54.0", "@vitejs/plugin-vue": "6.0.3", "@vitest/eslint-plugin": "1.6.6", "eslint": "9.39.2", @@ -90,34 +90,33 @@ "eslint-plugin-array-func": "5.1.0", "eslint-plugin-github": "6.0.0", "eslint-plugin-import-x": "4.16.1", - "eslint-plugin-playwright": "2.5.0", + "eslint-plugin-playwright": "2.5.1", "eslint-plugin-regexp": "3.0.0", - "eslint-plugin-sonarjs": "3.0.5", + "eslint-plugin-sonarjs": "3.0.6", "eslint-plugin-unicorn": "62.0.0", "eslint-plugin-vue": "10.7.0", "eslint-plugin-vue-scoped-css": "2.12.0", "eslint-plugin-wc": "3.0.2", - "globals": "17.1.0", - "happy-dom": "20.3.7", + "globals": "17.2.0", + "happy-dom": "20.4.0", "jiti": "2.6.1", - "knip": "5.82.1", "markdownlint-cli": "0.47.0", "material-icon-theme": "5.31.0", "nolyfill": "1.0.44", "postcss-html": "1.8.1", "spectral-cli-bundle": "1.0.3", - "stylelint": "17.0.0", + "stylelint": "17.1.0", "stylelint-config-recommended": "18.0.0", - "stylelint-declaration-block-no-ignored-properties": "2.8.0", + "stylelint-declaration-block-no-ignored-properties": "3.0.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.1.1", "svgo": "4.0.0", "typescript": "5.9.3", - "typescript-eslint": "8.53.1", - "updates": "17.0.8", - "vite-string-plugin": "1.5.0", + "typescript-eslint": "8.54.0", + "updates": "17.0.9", + "vite-string-plugin": "2.0.0", "vitest": "4.0.18", - "vue-tsc": "3.2.3" + "vue-tsc": "3.2.4" }, "browserslist": [ "defaults" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e39cff537..7764e51399 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,8 +93,8 @@ importers: specifier: 1.6.2 version: 1.6.2 css-loader: - specifier: 7.1.2 - version: 7.1.2(webpack@5.104.1) + specifier: 7.1.3 + version: 7.1.3(webpack@5.104.1) dayjs: specifier: 1.11.19 version: 1.11.19 @@ -120,8 +120,8 @@ importers: specifier: 4.1.1 version: 4.1.1 katex: - specifier: 0.16.27 - version: 0.16.27 + specifier: 0.16.28 + version: 0.16.28 mermaid: specifier: 11.12.2 version: 11.12.2 @@ -208,14 +208,14 @@ importers: specifier: 0.14.0 version: 0.14.0 '@playwright/test': - specifier: 1.58.0 - version: 1.58.0 + specifier: 1.58.1 + version: 1.58.1 '@stylistic/eslint-plugin': specifier: 5.7.1 version: 5.7.1(eslint@9.39.2(jiti@2.6.1)) '@stylistic/stylelint-plugin': specifier: 5.0.1 - version: 5.0.1(stylelint@17.0.0(typescript@5.9.3)) + version: 5.0.1(stylelint@17.1.0(typescript@5.9.3)) '@types/codemirror': specifier: 5.60.17 version: 5.60.17 @@ -250,20 +250,20 @@ importers: specifier: 1.12.4 version: 1.12.4 '@typescript-eslint/parser': - specifier: 8.53.1 - version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.54.0 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitejs/plugin-vue': specifier: 6.0.3 - version: 6.0.3(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) + version: 6.0.3(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3)) '@vitest/eslint-plugin': specifier: 1.6.6 - version: 1.6.6(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@25.0.10)(happy-dom@20.3.7)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2)) + version: 1.6.6(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@25.1.0)(happy-dom@20.4.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2)) eslint: specifier: 9.39.2 version: 9.39.2(jiti@2.6.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-array-func: specifier: 5.1.0 version: 5.1.0(eslint@9.39.2(jiti@2.6.1)) @@ -272,22 +272,22 @@ importers: version: 6.0.0(@types/eslint@9.6.1)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.1 - version: 4.16.1(@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) + version: 4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-playwright: - specifier: 2.5.0 - version: 2.5.0(eslint@9.39.2(jiti@2.6.1)) + specifier: 2.5.1 + version: 2.5.1(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-regexp: specifier: 3.0.0 version: 3.0.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-sonarjs: - specifier: 3.0.5 - version: 3.0.5(eslint@9.39.2(jiti@2.6.1)) + specifier: 3.0.6 + version: 3.0.6(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-unicorn: specifier: 62.0.0 version: 62.0.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-vue: specifier: 10.7.0 - version: 10.7.0(@stylistic/eslint-plugin@5.7.1(eslint@9.39.2(jiti@2.6.1)))(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) + version: 10.7.0(@stylistic/eslint-plugin@5.7.1(eslint@9.39.2(jiti@2.6.1)))(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) eslint-plugin-vue-scoped-css: specifier: 2.12.0 version: 2.12.0(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) @@ -295,17 +295,14 @@ importers: specifier: 3.0.2 version: 3.0.2(eslint@9.39.2(jiti@2.6.1)) globals: - specifier: 17.1.0 - version: 17.1.0 + specifier: 17.2.0 + version: 17.2.0 happy-dom: - specifier: 20.3.7 - version: 20.3.7 + specifier: 20.4.0 + version: 20.4.0 jiti: specifier: 2.6.1 version: 2.6.1 - knip: - specifier: 5.82.1 - version: 5.82.1(@types/node@25.0.10)(typescript@5.9.3) markdownlint-cli: specifier: 0.47.0 version: 0.47.0 @@ -322,20 +319,20 @@ importers: specifier: 1.0.3 version: 1.0.3 stylelint: - specifier: 17.0.0 - version: 17.0.0(typescript@5.9.3) + specifier: 17.1.0 + version: 17.1.0(typescript@5.9.3) stylelint-config-recommended: specifier: 18.0.0 - version: 18.0.0(stylelint@17.0.0(typescript@5.9.3)) + version: 18.0.0(stylelint@17.1.0(typescript@5.9.3)) stylelint-declaration-block-no-ignored-properties: - specifier: 2.8.0 - version: 2.8.0(stylelint@17.0.0(typescript@5.9.3)) + specifier: 3.0.0 + version: 3.0.0(stylelint@17.1.0(typescript@5.9.3)) stylelint-declaration-strict-value: specifier: 1.10.11 - version: 1.10.11(stylelint@17.0.0(typescript@5.9.3)) + version: 1.10.11(stylelint@17.1.0(typescript@5.9.3)) stylelint-value-no-unknown-custom-properties: specifier: 6.1.1 - version: 6.1.1(stylelint@17.0.0(typescript@5.9.3)) + version: 6.1.1(stylelint@17.1.0(typescript@5.9.3)) svgo: specifier: 4.0.0 version: 4.0.0 @@ -343,20 +340,20 @@ importers: specifier: 5.9.3 version: 5.9.3 typescript-eslint: - specifier: 8.53.1 - version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.54.0 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) updates: - specifier: 17.0.8 - version: 17.0.8 + specifier: 17.0.9 + version: 17.0.9 vite-string-plugin: - specifier: 1.5.0 - version: 1.5.0(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2)) + specifier: 2.0.0 + version: 2.0.0(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2)) vitest: specifier: 4.0.18 - version: 4.0.18(@types/node@25.0.10)(happy-dom@20.3.7)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) + version: 4.0.18(@types/node@25.1.0)(happy-dom@20.4.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) vue-tsc: - specifier: 3.2.3 - version: 3.2.3(typescript@5.9.3) + specifier: 3.2.4 + version: 3.2.4(typescript@5.9.3) packages: @@ -392,8 +389,8 @@ packages: resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} - '@braintree/sanitize-url@7.1.1': - resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} '@cacheable/memory@2.0.7': resolution: {integrity: sha512-RbxnxAMf89Tp1dLhXMS7ceft/PGsDl1Ip7T20z5nZ+pwIAsQ1p2izPjVG69oCLv/jfQ7HDPHTWK0c9rcAWXN3A==} @@ -470,9 +467,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.25': - resolution: {integrity: sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==} - engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.0.26': + resolution: {integrity: sha512-6boXK0KkzT5u5xOgF6TKB+CLq9SOpEGmkZw0g5n9/7yg85wab3UzSxB8TxhLJ31L4SGJ6BCFRw/iftTha1CJXA==} '@csstools/css-tokenizer@4.0.0': resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} @@ -678,10 +674,6 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -819,9 +811,6 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -897,120 +886,12 @@ packages: resolution: {integrity: sha512-3dsKlf4Ma7o+uxLIg5OI1Tgwfet2pE8WTbPjEGWvOe6CSjMtK0skJnnSVHaEVX4N4mYU81To0qDeZOPqjaUotg==} engines: {node: '>=12.4.0'} - '@oxc-resolver/binding-android-arm-eabi@11.16.4': - resolution: {integrity: sha512-6XUHilmj8D6Ggus+sTBp64x/DUQ7LgC/dvTDdUOt4iMQnDdSep6N1mnvVLIiG+qM5tRnNHravNzBJnUlYwRQoA==} - cpu: [arm] - os: [android] - - '@oxc-resolver/binding-android-arm64@11.16.4': - resolution: {integrity: sha512-5ODwd1F5mdkm6JIg1CNny9yxIrCzrkKpxmqas7Alw23vE0Ot8D4ykqNBW5Z/nIZkXVEo5VDmnm0sMBBIANcpeQ==} - cpu: [arm64] - os: [android] - - '@oxc-resolver/binding-darwin-arm64@11.16.4': - resolution: {integrity: sha512-egwvDK9DMU4Q8F4BG74/n4E22pQ0lT5ukOVB6VXkTj0iG2fnyoStHoFaBnmDseLNRA4r61Mxxz8k940CIaJMDg==} - cpu: [arm64] - os: [darwin] - - '@oxc-resolver/binding-darwin-x64@11.16.4': - resolution: {integrity: sha512-HMkODYrAG4HaFNCpaYzSQFkxeiz2wzl+smXwxeORIQVEo1WAgUrWbvYT/0RNJg/A8z2aGMGK5KWTUr2nX5GiMw==} - cpu: [x64] - os: [darwin] - - '@oxc-resolver/binding-freebsd-x64@11.16.4': - resolution: {integrity: sha512-mkcKhIdSlUqnndD928WAVVFMEr1D5EwHOBGHadypW0PkM0h4pn89ZacQvU7Qs/Z2qquzvbyw8m4Mq3jOYI+4Dw==} - cpu: [x64] - os: [freebsd] - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.4': - resolution: {integrity: sha512-ZJvzbmXI/cILQVcJL9S2Fp7GLAIY4Yr6mpGb+k6LKLUSEq85yhG+rJ9eWCqgULVIf2BFps/NlmPTa7B7oj8jhQ==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm-musleabihf@11.16.4': - resolution: {integrity: sha512-iZUB0W52uB10gBUDAi79eTnzqp1ralikCAjfq7CdokItwZUVJXclNYANnzXmtc0Xr0ox+YsDsG2jGcj875SatA==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-gnu@11.16.4': - resolution: {integrity: sha512-qNQk0H6q1CnwS9cnvyjk9a+JN8BTbxK7K15Bb5hYfJcKTG1hfloQf6egndKauYOO0wu9ldCMPBrEP1FNIQEhaA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-arm64-musl@11.16.4': - resolution: {integrity: sha512-wEXSaEaYxGGoVSbw0i2etjDDWcqErKr8xSkTdwATP798efsZmodUAcLYJhN0Nd4W35Oq6qAvFGHpKwFrrhpTrA==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@oxc-resolver/binding-linux-ppc64-gnu@11.16.4': - resolution: {integrity: sha512-CUFOlpb07DVOFLoYiaTfbSBRPIhNgwc/MtlYeg3p6GJJw+kEm/vzc9lohPSjzF2MLPB5hzsJdk+L/GjrTT3UPw==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-riscv64-gnu@11.16.4': - resolution: {integrity: sha512-d8It4AH8cN9ReK1hW6ZO4x3rMT0hB2LYH0RNidGogV9xtnjLRU+Y3MrCeClLyOSGCibmweJJAjnwB7AQ31GEhg==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-riscv64-musl@11.16.4': - resolution: {integrity: sha512-d09dOww9iKyEHSxuOQ/Iu2aYswl0j7ExBcyy14D6lJ5ijQSP9FXcJYJsJ3yvzboO/PDEFjvRuF41f8O1skiPVg==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@oxc-resolver/binding-linux-s390x-gnu@11.16.4': - resolution: {integrity: sha512-lhjyGmUzTWHduZF3MkdUSEPMRIdExnhsqv8u1upX3A15epVn6YVwv4msFQPJl1x1wszkACPeDHGOtzHsITXGdw==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-x64-gnu@11.16.4': - resolution: {integrity: sha512-ZtqqiI5rzlrYBm/IMMDIg3zvvVj4WO/90Dg/zX+iA8lWaLN7K5nroXb17MQ4WhI5RqlEAgrnYDXW+hok1D9Kaw==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-x64-musl@11.16.4': - resolution: {integrity: sha512-LM424h7aaKcMlqHnQWgTzO+GRNLyjcNnMpqm8SygEtFRVW693XS+XGXYvjORlmJtsyjo84ej1FMb3U2HE5eyjg==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@oxc-resolver/binding-openharmony-arm64@11.16.4': - resolution: {integrity: sha512-8w8U6A5DDWTBv3OUxSD9fNk37liZuEC5jnAc9wQRv9DeYKAXvuUtBfT09aIZ58swaci0q1WS48/CoMVEO6jdCA==} - cpu: [arm64] - os: [openharmony] - - '@oxc-resolver/binding-wasm32-wasi@11.16.4': - resolution: {integrity: sha512-hnjb0mDVQOon6NdfNJ1EmNquonJUjoYkp7UyasjxVa4iiMcApziHP4czzzme6WZbp+vzakhVv2Yi5ACTon3Zlw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-resolver/binding-win32-arm64-msvc@11.16.4': - resolution: {integrity: sha512-+i0XtNfSP7cfnh1T8FMrMm4HxTeh0jxKP/VQCLWbjdUxaAQ4damho4gN9lF5dl0tZahtdszXLUboBFNloSJNOQ==} - cpu: [arm64] - os: [win32] - - '@oxc-resolver/binding-win32-ia32-msvc@11.16.4': - resolution: {integrity: sha512-ePW1islJrv3lPnef/iWwrjrSpRH8kLlftdKf2auQNWvYLx6F0xvcnv9d+r/upnVuttoQY9amLnWJf+JnCRksTw==} - cpu: [ia32] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.16.4': - resolution: {integrity: sha512-qnjQhjHI4TDL3hkidZyEmQRK43w2NHl6TP5Rnt/0XxYuLdEgx/1yzShhYidyqWzdnhGhSPTM/WVP2mK66XLegA==} - cpu: [x64] - os: [win32] - '@pkgr/core@0.2.9': resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.58.0': - resolution: {integrity: sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg==} + '@playwright/test@1.58.1': + resolution: {integrity: sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==} engines: {node: '>=18'} hasBin: true @@ -1027,141 +908,141 @@ packages: '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - '@rollup/rollup-android-arm-eabi@4.56.0': - resolution: {integrity: sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==} + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.56.0': - resolution: {integrity: sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==} + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.56.0': - resolution: {integrity: sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==} + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.56.0': - resolution: {integrity: sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==} + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.56.0': - resolution: {integrity: sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==} + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.56.0': - resolution: {integrity: sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==} + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.56.0': - resolution: {integrity: sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==} + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.56.0': - resolution: {integrity: sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==} + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.56.0': - resolution: {integrity: sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==} + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.56.0': - resolution: {integrity: sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==} + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.56.0': - resolution: {integrity: sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==} + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.56.0': - resolution: {integrity: sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==} + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.56.0': - resolution: {integrity: sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==} + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.56.0': - resolution: {integrity: sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==} + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.56.0': - resolution: {integrity: sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==} + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.56.0': - resolution: {integrity: sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==} + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.56.0': - resolution: {integrity: sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==} + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.56.0': - resolution: {integrity: sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==} + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.56.0': - resolution: {integrity: sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==} + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.56.0': - resolution: {integrity: sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==} + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.56.0': - resolution: {integrity: sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==} + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.56.0': - resolution: {integrity: sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==} + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.56.0': - resolution: {integrity: sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==} + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.56.0': - resolution: {integrity: sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==} + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.56.0': - resolution: {integrity: sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==} + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] @@ -1370,8 +1251,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@25.0.10': - resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==} + '@types/node@25.1.0': + resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} '@types/pdfobject@2.2.5': resolution: {integrity: sha512-7gD5tqc/RUDq0PyoLemL0vEHxBYi+zY0WVaFAx/Y0jBsXFgot1vB9No1GhDZGwRGJMCIZbgAb74QG9MTyTNU/g==} @@ -1409,63 +1290,63 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.53.1': - resolution: {integrity: sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==} + '@typescript-eslint/eslint-plugin@8.54.0': + resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.53.1 + '@typescript-eslint/parser': ^8.54.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.53.1': - resolution: {integrity: sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==} + '@typescript-eslint/parser@8.54.0': + resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.53.1': - resolution: {integrity: sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==} + '@typescript-eslint/project-service@8.54.0': + resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.53.1': - resolution: {integrity: sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==} + '@typescript-eslint/scope-manager@8.54.0': + resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.53.1': - resolution: {integrity: sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==} + '@typescript-eslint/tsconfig-utils@8.54.0': + resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.53.1': - resolution: {integrity: sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==} + '@typescript-eslint/type-utils@8.54.0': + resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.53.1': - resolution: {integrity: sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==} + '@typescript-eslint/types@8.54.0': + resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.53.1': - resolution: {integrity: sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==} + '@typescript-eslint/typescript-estree@8.54.0': + resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.53.1': - resolution: {integrity: sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==} + '@typescript-eslint/utils@8.54.0': + resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.53.1': - resolution: {integrity: sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==} + '@typescript-eslint/visitor-keys@8.54.0': + resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -1641,8 +1522,8 @@ packages: '@vue/compiler-ssr@3.5.27': resolution: {integrity: sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==} - '@vue/language-core@3.2.3': - resolution: {integrity: sha512-VpN/GnYDzGLh44AI6i1OB/WsLXo6vwnl0EWHBelGc4TyC0yEq6azwNaed/+Tgr8anFlSdWYnMEkyHJDPe7ii7A==} + '@vue/language-core@3.2.4': + resolution: {integrity: sha512-bqBGuSG4KZM45KKTXzGtoCl9cWju5jsaBKaJJe3h5hRAAWpZUuj5G+L+eI01sPIkm4H6setKRlw7E85wLdDNew==} '@vue/reactivity@3.5.27': resolution: {integrity: sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==} @@ -1861,8 +1742,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.17: - resolution: {integrity: sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==} + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true big.js@5.2.2: @@ -1977,8 +1858,8 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} citeproc@2.4.63: @@ -2086,8 +1967,8 @@ packages: resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} engines: {node: '>=12 || >=16'} - css-loader@7.1.2: - resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + css-loader@7.1.3: + resolution: {integrity: sha512-frbERmjT0UC5lMheWpJmMilnt9GEhbZJN/heUb7/zaJYeIzj5St9HvDcfshzzOqbsS+rYpMk++2SD3vGETDSyA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -2373,8 +2254,8 @@ packages: easymde@2.20.0: resolution: {integrity: sha512-V1Z5f92TfR42Na852OWnIZMbM7zotWQYTddNaLYZFVKj7APBbyZ3FYJ27gBw2grMW3R6Qdv9J8n5Ij7XRSIgXQ==} - electron-to-chromium@1.5.278: - resolution: {integrity: sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==} + electron-to-chromium@1.5.283: + resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2565,8 +2446,8 @@ packages: resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} engines: {node: '>=5.0.0'} - eslint-plugin-playwright@2.5.0: - resolution: {integrity: sha512-1ckFw7Abdz+l23wtw5Tg4GTK3Y+MgEQQNjEr7FTJP3wwmIOj8DkbJ6G655aPc09c0Kfn/NoGA4xpMZzeSO4NWw==} + eslint-plugin-playwright@2.5.1: + resolution: {integrity: sha512-q7oqVQTTfa3VXJQ8E+ln0QttPGrs/XmSO1FjOMzQYBMYF3btih4FIrhEYh34JF184GYDmq3lJ/n7CMa49OHBvA==} engines: {node: '>=16.9.0'} peerDependencies: eslint: '>=8.40.0' @@ -2591,8 +2472,8 @@ packages: peerDependencies: eslint: '>=9.38.0' - eslint-plugin-sonarjs@3.0.5: - resolution: {integrity: sha512-dI62Ff3zMezUToi161hs2i1HX1ie8Ia2hO0jtNBfdgRBicAG4ydy2WPt0rMTrAe3ZrlqhpAO3w1jcQEdneYoFA==} + eslint-plugin-sonarjs@3.0.6: + resolution: {integrity: sha512-3mVUqsAUSylGfkJMj2v0aC2Cu/eUunDLm+XMjLf0uLjAZao205NWF3g6EXxcCAFO+rCZiQ6Or1WQkUcU9/sKFQ==} peerDependencies: eslint: ^8.0.0 || ^9.0.0 @@ -2725,9 +2606,6 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fd-package-json@2.0.0: - resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2780,11 +2658,6 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - formatly@0.3.0: - resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} - engines: {node: '>=18.3.0'} - hasBin: true - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2805,8 +2678,8 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + get-tsconfig@4.13.1: + resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -2839,8 +2712,8 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} - globals@17.1.0: - resolution: {integrity: sha512-8HoIcWI5fCvG5NADj4bDav+er9B9JMj2vyL2pI8D0eismKyUvPLTSs+Ln3wqhwcp306i73iyVnEKx3F6T47TGw==} + globals@17.2.0: + resolution: {integrity: sha512-tovnCz/fEq+Ripoq+p/gN1u7l6A7wwkoBT9pRCzTHzsD/LvADIzXZdjmRymh5Ztf0DYC3Rwg5cZRYjxzBmzbWg==} engines: {node: '>=18'} globby@16.1.0: @@ -2860,8 +2733,8 @@ packages: resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} engines: {node: '>=0.8.0'} - happy-dom@20.3.7: - resolution: {integrity: sha512-sb5IzoRl1WJKsUSRe+IloJf3z1iDq5PQ7Yk/ULMsZ5IAQEs9ZL7RsFfiKBXU7nK9QmO+iz0e59EH8r8jexTZ/g==} + happy-dom@20.4.0: + resolution: {integrity: sha512-RDeQm3dT9n0A5f/TszjUmNCLEuPnMGv3Tv4BmNINebz/h17PA6LMBcxJ5FrcqltNBMh9jA/8ufgDdBYUdBt+eg==} engines: {node: '>=20.0.0'} has-flag@4.0.0: @@ -3110,8 +2983,8 @@ packages: just-extend@5.1.1: resolution: {integrity: sha512-b+z6yF1d4EOyDgylzQo5IminlUmzSeqR1hs/bzjBNjuGras4FXq/6TrzjxfN0j+TmI0ltJzTNlqXUMCniciwKQ==} - katex@0.16.27: - resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} + katex@0.16.28: + resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} hasBin: true keyv@4.5.4: @@ -3131,14 +3004,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - knip@5.82.1: - resolution: {integrity: sha512-1nQk+5AcnkqL40kGQXfouzAEXkTR+eSrgo/8m1d0BMei4eAzFwghoXC4gOKbACgBiCof7hE8wkBVDsEvznf85w==} - engines: {node: '>=18.18.0'} - hasBin: true - peerDependencies: - '@types/node': '>=18' - typescript: '>=5.0.4 <7' - known-css-properties@0.37.0: resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} @@ -3484,9 +3349,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - oxc-resolver@11.16.4: - resolution: {integrity: sha512-nvJr3orFz1wNaBA4neRw7CAn0SsjgVaEw1UHpgO/lzVW12w+nsFnvU/S6vVX3kYyFaZdxZheTExi/fa8R8PrZA==} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3577,13 +3439,13 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.58.0: - resolution: {integrity: sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==} + playwright-core@1.58.1: + resolution: {integrity: sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==} engines: {node: '>=18'} hasBin: true - playwright@1.58.0: - resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==} + playwright@1.58.1: + resolution: {integrity: sha512-+2uTZHxSCcxjvGc5C891LrS1/NlxglGxzrC4seZiVjcYVQfUa87wBL6rTDqzGjuoWNjnBzRqKmF6zRYGMvQUaQ==} engines: {node: '>=18'} hasBin: true @@ -3798,8 +3660,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.56.0: - resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3835,11 +3697,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -3889,10 +3746,6 @@ packages: resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} engines: {node: '>= 18'} - smol-toml@1.6.0: - resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} - engines: {node: '>= 18'} - solid-js@1.9.11: resolution: {integrity: sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==} @@ -3975,6 +3828,10 @@ packages: resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} engines: {node: '>=20'} + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} + engines: {node: '>=20'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3995,10 +3852,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-json-comments@5.0.3: - resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} - engines: {node: '>=14.16'} - style-search@0.1.0: resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} @@ -4008,11 +3861,11 @@ packages: peerDependencies: stylelint: ^17.0.0 - stylelint-declaration-block-no-ignored-properties@2.8.0: - resolution: {integrity: sha512-Ws8Cav7Y+SPN0JsV407LrnNXWOrqGjxShf+37GBtnU/C58Syve9c0+I/xpLcFOosST3ternykn3Lp77f3ITnFw==} - engines: {node: '>=6'} + stylelint-declaration-block-no-ignored-properties@3.0.0: + resolution: {integrity: sha512-3ml4NgSW6nkHQrk+/ounU7Qljfb7e7FayHzU7Mry6rF9X28RXyPLD2bNn4QVOO7t98d5EGCCVkNbHCZSx+bNUQ==} + engines: {node: '>=20.19.0'} peerDependencies: - stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + stylelint: ^17.0.0 stylelint-declaration-strict-value@1.10.11: resolution: {integrity: sha512-oVQvhZlFZAiDz9r2BPFZLtTGm1A2JVhdKObKAJoTjFfR4F/NpApC4bMBTxf4sZS76Na3njYKVOaAaKSZ4+FU+g==} @@ -4026,8 +3879,8 @@ packages: peerDependencies: stylelint: '>=16' - stylelint@17.0.0: - resolution: {integrity: sha512-saMZ2mqdQre4AfouxcbTdpVglDRcROb4MIucKHvgsDb/0IX7ODhcaz+EOIyfxAsm8Zjl/7j4hJj6MgIYYM8Xwg==} + stylelint@17.1.0: + resolution: {integrity: sha512-+cUX1FxkkbLX5qJRAPapUv/+v+YU3pGbWu+pHVqTXpiY0mYh3Dxfxa0bLBtVtYgOC8hIWIyX2H/3Y3LWlAevDg==} engines: {node: '>=20.19.0'} hasBin: true @@ -4196,8 +4049,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.53.1: - resolution: {integrity: sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==} + typescript-eslint@8.54.0: + resolution: {integrity: sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4236,8 +4089,8 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - updates@17.0.8: - resolution: {integrity: sha512-K5z2Dgni1V2JUllUC0AvIxL1E31rn1ZTU1bvZyTwvxLeAcLmhC0RZyWOrUcJJvlFBxFgxLz5cqTnbFXTEYdIjA==} + updates@17.0.9: + resolution: {integrity: sha512-fl+hGvIH+oOBwqFWpkbX2XtZODooOqgr1jcjF/M3/RAVc0P7thuwaNoFpXUSpeJNuKQoyfqm2JFZ2i3ScgG7Lw==} engines: {node: '>=22'} hasBin: true @@ -4254,8 +4107,8 @@ packages: vanilla-colorful@0.7.2: resolution: {integrity: sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==} - vite-string-plugin@1.5.0: - resolution: {integrity: sha512-Ne+67igo8iNoM7N1/59EhQxS1QYvFE3xMK2BEzVKj6QdBRxpOIfG8Y7Uvyv7aDWK+HneU9iwqS1nlaKwtC9OTQ==} + vite-string-plugin@2.0.0: + resolution: {integrity: sha512-7p4aOvow1kphhZppt62A6Aj03NhUzOTiBgjHaTWDIdmtiUbjoJeVLarV52UjQNvLFC6BxJgV8r1AAwJfcxwZSQ==} peerDependencies: vite: '*' @@ -4383,8 +4236,8 @@ packages: vue: optional: true - vue-tsc@3.2.3: - resolution: {integrity: sha512-1RdRB7rQXGFMdpo0aXf9spVzWEPGAk7PEb/ejHQwVrcuQA/HsGiixIc3uBQeqY2YjeEEgvr2ShQewBgcN4c1Cw==} + vue-tsc@3.2.4: + resolution: {integrity: sha512-xj3YCvSLNDKt1iF9OcImWHhmYcihVu9p4b9s4PGR/qp6yhW+tZJaypGxHScRyOrdnHvaOeF+YkZOdKwbgGvp5g==} hasBin: true peerDependencies: typescript: '>=5.0.0' @@ -4397,10 +4250,6 @@ packages: typescript: optional: true - walk-up-path@4.0.0: - resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} - engines: {node: 20 || >=22} - watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} @@ -4517,9 +4366,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - snapshots: '@alloc/quick-lru@5.2.0': {} @@ -4550,7 +4396,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@braintree/sanitize-url@7.1.1': {} + '@braintree/sanitize-url@7.1.2': {} '@cacheable/memory@2.0.7': dependencies: @@ -4643,7 +4489,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.25': {} + '@csstools/css-syntax-patches-for-csstree@1.0.26': {} '@csstools/css-tokenizer@4.0.0': {} @@ -4767,8 +4613,6 @@ snapshots: eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} - '@eslint-community/regexpp@4.12.2': {} '@eslint/compat@1.4.1(eslint@9.39.2(jiti@2.6.1))': @@ -4911,13 +4755,6 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.1': - dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 - '@tybys/wasm-util': 0.10.1 - optional: true - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4982,73 +4819,11 @@ snapshots: dependencies: '@nolyfill/shared': 1.0.44 - '@oxc-resolver/binding-android-arm-eabi@11.16.4': - optional: true - - '@oxc-resolver/binding-android-arm64@11.16.4': - optional: true - - '@oxc-resolver/binding-darwin-arm64@11.16.4': - optional: true - - '@oxc-resolver/binding-darwin-x64@11.16.4': - optional: true - - '@oxc-resolver/binding-freebsd-x64@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-arm-musleabihf@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-arm64-gnu@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-arm64-musl@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-ppc64-gnu@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-riscv64-gnu@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-riscv64-musl@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-s390x-gnu@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-x64-gnu@11.16.4': - optional: true - - '@oxc-resolver/binding-linux-x64-musl@11.16.4': - optional: true - - '@oxc-resolver/binding-openharmony-arm64@11.16.4': - optional: true - - '@oxc-resolver/binding-wasm32-wasi@11.16.4': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - - '@oxc-resolver/binding-win32-arm64-msvc@11.16.4': - optional: true - - '@oxc-resolver/binding-win32-ia32-msvc@11.16.4': - optional: true - - '@oxc-resolver/binding-win32-x64-msvc@11.16.4': - optional: true - '@pkgr/core@0.2.9': {} - '@playwright/test@1.58.0': + '@playwright/test@1.58.1': dependencies: - playwright: 1.58.0 + playwright: 1.58.1 '@popperjs/core@2.11.8': {} @@ -5060,79 +4835,79 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.53': {} - '@rollup/rollup-android-arm-eabi@4.56.0': + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.56.0': + '@rollup/rollup-android-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.56.0': + '@rollup/rollup-darwin-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.56.0': + '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.56.0': + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.56.0': + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.56.0': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.56.0': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.56.0': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.56.0': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.56.0': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.56.0': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.56.0': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.56.0': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.56.0': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.56.0': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.56.0': + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.56.0': + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.56.0': + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@rollup/rollup-openbsd-x64@4.56.0': + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@rollup/rollup-openharmony-arm64@4.56.0': + '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.56.0': + '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.56.0': + '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.56.0': + '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.56.0': + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true '@rtsao/scc@1.1.0': {} @@ -5169,14 +4944,14 @@ snapshots: '@stylistic/eslint-plugin@5.7.1(eslint@9.39.2(jiti@2.6.1))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/types': 8.54.0 eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 picomatch: 4.0.3 - '@stylistic/stylelint-plugin@5.0.1(stylelint@17.0.0(typescript@5.9.3))': + '@stylistic/stylelint-plugin@5.0.1(stylelint@17.1.0(typescript@5.9.3))': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -5185,7 +4960,7 @@ snapshots: postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 style-search: 0.1.0 - stylelint: 17.0.0(typescript@5.9.3) + stylelint: 17.1.0(typescript@5.9.3) '@swc/helpers@0.2.14': {} @@ -5375,7 +5150,7 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@25.0.10': + '@types/node@25.1.0': dependencies: undici-types: 7.16.0 @@ -5406,16 +5181,16 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.1.0 - '@typescript-eslint/eslint-plugin@8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/type-utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 eslint: 9.39.2(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -5424,41 +5199,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.53.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) - '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.53.1': + '@typescript-eslint/scope-manager@8.54.0': dependencies: - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 - '@typescript-eslint/tsconfig-utils@8.53.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) @@ -5466,14 +5241,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.53.1': {} + '@typescript-eslint/types@8.54.0': {} - '@typescript-eslint/typescript-estree@8.53.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.53.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 @@ -5483,20 +5258,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.53.1': + '@typescript-eslint/visitor-keys@8.54.0': dependencies: - '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -5558,20 +5333,20 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-vue@6.0.3(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.3(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.27(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) vue: 3.5.27(typescript@5.9.3) - '@vitest/eslint-plugin@1.6.6(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@25.0.10)(happy-dom@20.3.7)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/eslint-plugin@1.6.6(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.18(@types/node@25.1.0)(happy-dom@20.4.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) optionalDependencies: typescript: 5.9.3 - vitest: 4.0.18(@types/node@25.0.10)(happy-dom@20.3.7)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) + vitest: 4.0.18(@types/node@25.1.0)(happy-dom@20.4.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -5584,13 +5359,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.18': dependencies: @@ -5656,7 +5431,7 @@ snapshots: '@vue/compiler-dom': 3.5.27 '@vue/shared': 3.5.27 - '@vue/language-core@3.2.3': + '@vue/language-core@3.2.4': dependencies: '@volar/language-core': 2.4.27 '@vue/compiler-dom': 3.5.27 @@ -5875,7 +5650,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.17: {} + baseline-browser-mapping@2.9.19: {} big.js@5.2.2: {} @@ -5898,9 +5673,9 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.9.17 + baseline-browser-mapping: 2.9.19 caniuse-lite: 1.0.30001766 - electron-to-chromium: 1.5.278 + electron-to-chromium: 1.5.283 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -5991,7 +5766,7 @@ snapshots: chrome-trace-event@1.0.4: {} - ci-info@4.3.1: {} + ci-info@4.4.0: {} citeproc@2.4.63: {} @@ -6078,7 +5853,7 @@ snapshots: css-functions-list@3.2.3: {} - css-loader@7.1.2(webpack@5.104.1): + css-loader@7.1.3(webpack@5.104.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -6395,7 +6170,7 @@ snapshots: codemirror-spell-checker: 1.1.2 marked: 4.3.0 - electron-to-chromium@1.5.278: {} + electron-to-chromium@1.5.283: {} emoji-regex@10.6.0: {} @@ -6429,7 +6204,7 @@ snapshots: esbuild-loader@4.4.2(webpack@5.104.1): dependencies: esbuild: 0.27.2 - get-tsconfig: 4.13.0 + get-tsconfig: 4.13.1 loader-utils: 2.0.4 webpack: 5.104.1(webpack-cli@6.0.1) webpack-sources: 1.4.3 @@ -6480,7 +6255,7 @@ snapshots: eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: - get-tsconfig: 4.13.0 + get-tsconfig: 4.13.1 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.11.1 @@ -6493,30 +6268,30 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) - get-tsconfig: 4.13.0 + get-tsconfig: 4.13.1 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -6549,8 +6324,8 @@ snapshots: '@eslint/eslintrc': 3.3.3 '@eslint/js': 9.39.2 '@github/browserslist-config': 1.0.0 - '@typescript-eslint/eslint-plugin': 8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) aria-query: 5.3.2 eslint: 9.39.2(jiti@2.6.1) eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) @@ -6558,7 +6333,7 @@ snapshots: eslint-plugin-eslint-comments: 3.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-filenames: 1.3.2(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-i18n-text: 1.0.1(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-no-only-tests: 3.3.0 eslint-plugin-prettier: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.8.1) @@ -6568,7 +6343,7 @@ snapshots: prettier: 3.8.1 svg-element-attributes: 1.3.1 typescript: 5.9.3 - typescript-eslint: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + typescript-eslint: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - '@types/eslint' - eslint-import-resolver-typescript @@ -6579,9 +6354,9 @@ snapshots: dependencies: eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/types': 8.54.0 comment-parser: 1.4.5 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) @@ -6592,12 +6367,12 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: '@nolyfill/array-includes@1.0.44' @@ -6608,7 +6383,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) hasown: '@nolyfill/hasown@1.0.44' is-core-module: '@nolyfill/is-core-module@1.0.39' is-glob: 4.0.3 @@ -6620,7 +6395,7 @@ snapshots: string.prototype.trimend: '@nolyfill/string.prototype.trimend@1.0.44' tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -6647,7 +6422,7 @@ snapshots: eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-playwright@2.5.0(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-playwright@2.5.1(eslint@9.39.2(jiti@2.6.1)): dependencies: eslint: 9.39.2(jiti@2.6.1) globals: 16.5.0 @@ -6673,18 +6448,18 @@ snapshots: regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-sonarjs@3.0.5(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-sonarjs@3.0.6(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 builtin-modules: 3.3.0 bytes: 3.1.2 eslint: 9.39.2(jiti@2.6.1) functional-red-black-tree: 1.0.1 jsx-ast-utils-x: 0.1.0 lodash.merge: 4.6.2 - minimatch: 9.0.5 + minimatch: 10.1.1 scslre: 0.3.0 - semver: 7.7.2 + semver: 7.7.3 typescript: 5.9.3 eslint-plugin-unicorn@62.0.0(eslint@9.39.2(jiti@2.6.1)): @@ -6693,7 +6468,7 @@ snapshots: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint/plugin-kit': 0.4.1 change-case: 5.4.4 - ci-info: 4.3.1 + ci-info: 4.4.0 clean-regexp: 1.0.0 core-js-compat: 3.48.0 eslint: 9.39.2(jiti@2.6.1) @@ -6724,7 +6499,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-vue@10.7.0(@stylistic/eslint-plugin@5.7.1(eslint@9.39.2(jiti@2.6.1)))(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))): + eslint-plugin-vue@10.7.0(@stylistic/eslint-plugin@5.7.1(eslint@9.39.2(jiti@2.6.1)))(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) eslint: 9.39.2(jiti@2.6.1) @@ -6736,7 +6511,7 @@ snapshots: xml-name-validator: 4.0.0 optionalDependencies: '@stylistic/eslint-plugin': 5.7.1(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-wc@3.0.2(eslint@9.39.2(jiti@2.6.1)): dependencies: @@ -6857,10 +6632,6 @@ snapshots: dependencies: reusify: 1.1.0 - fd-package-json@2.0.0: - dependencies: - walk-up-path: 4.0.0 - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -6912,10 +6683,6 @@ snapshots: flatted@3.3.3: {} - formatly@0.3.0: - dependencies: - fd-package-json: 2.0.0 - fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -6928,7 +6695,7 @@ snapshots: get-east-asian-width@1.4.0: {} - get-tsconfig@4.13.0: + get-tsconfig@4.13.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -6965,7 +6732,7 @@ snapshots: globals@16.5.0: {} - globals@17.1.0: {} + globals@17.2.0: {} globby@16.1.0: dependencies: @@ -6984,9 +6751,9 @@ snapshots: hammerjs@2.0.8: {} - happy-dom@20.3.7: + happy-dom@20.4.0: dependencies: - '@types/node': 25.0.10 + '@types/node': 25.1.0 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 4.5.0 @@ -7125,7 +6892,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.0.10 + '@types/node': 25.1.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -7180,7 +6947,7 @@ snapshots: just-extend@5.1.1: {} - katex@0.16.27: + katex@0.16.28: dependencies: commander: 8.3.0 @@ -7200,23 +6967,6 @@ snapshots: kind-of@6.0.3: {} - knip@5.82.1(@types/node@25.0.10)(typescript@5.9.3): - dependencies: - '@nodelib/fs.walk': 1.2.8 - '@types/node': 25.0.10 - fast-glob: 3.3.3 - formatly: 0.3.0 - jiti: 2.6.1 - js-yaml: 4.1.1 - minimist: 1.2.8 - oxc-resolver: 11.16.4 - picocolors: 1.1.1 - picomatch: 4.0.3 - smol-toml: 1.6.0 - strip-json-comments: 5.0.3 - typescript: 5.9.3 - zod: 4.3.6 - known-css-properties@0.37.0: {} langium@3.3.1: @@ -7359,7 +7109,7 @@ snapshots: mermaid@11.12.2: dependencies: - '@braintree/sanitize-url': 7.1.1 + '@braintree/sanitize-url': 7.1.2 '@iconify/utils': 3.1.0 '@mermaid-js/parser': 0.6.3 '@types/d3': 7.4.3 @@ -7371,7 +7121,7 @@ snapshots: dagre-d3-es: 7.0.13 dayjs: 1.11.19 dompurify: 3.3.1 - katex: 0.16.27 + katex: 0.16.28 khroma: 2.1.0 lodash-es: 4.17.23 marked: 16.4.2 @@ -7439,7 +7189,7 @@ snapshots: dependencies: '@types/katex': 0.16.8 devlop: 1.1.0 - katex: 0.16.27 + katex: 0.16.28 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 @@ -7666,29 +7416,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - oxc-resolver@11.16.4: - optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.16.4 - '@oxc-resolver/binding-android-arm64': 11.16.4 - '@oxc-resolver/binding-darwin-arm64': 11.16.4 - '@oxc-resolver/binding-darwin-x64': 11.16.4 - '@oxc-resolver/binding-freebsd-x64': 11.16.4 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.16.4 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.16.4 - '@oxc-resolver/binding-linux-arm64-gnu': 11.16.4 - '@oxc-resolver/binding-linux-arm64-musl': 11.16.4 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.16.4 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.16.4 - '@oxc-resolver/binding-linux-riscv64-musl': 11.16.4 - '@oxc-resolver/binding-linux-s390x-gnu': 11.16.4 - '@oxc-resolver/binding-linux-x64-gnu': 11.16.4 - '@oxc-resolver/binding-linux-x64-musl': 11.16.4 - '@oxc-resolver/binding-openharmony-arm64': 11.16.4 - '@oxc-resolver/binding-wasm32-wasi': 11.16.4 - '@oxc-resolver/binding-win32-arm64-msvc': 11.16.4 - '@oxc-resolver/binding-win32-ia32-msvc': 11.16.4 - '@oxc-resolver/binding-win32-x64-msvc': 11.16.4 - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -7768,11 +7495,11 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 - playwright-core@1.58.0: {} + playwright-core@1.58.1: {} - playwright@1.58.0: + playwright@1.58.1: dependencies: - playwright-core: 1.58.0 + playwright-core: 1.58.1 optionalDependencies: fsevents: 2.3.2 @@ -7961,35 +7688,35 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.56.0: + rollup@4.57.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.56.0 - '@rollup/rollup-android-arm64': 4.56.0 - '@rollup/rollup-darwin-arm64': 4.56.0 - '@rollup/rollup-darwin-x64': 4.56.0 - '@rollup/rollup-freebsd-arm64': 4.56.0 - '@rollup/rollup-freebsd-x64': 4.56.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.56.0 - '@rollup/rollup-linux-arm-musleabihf': 4.56.0 - '@rollup/rollup-linux-arm64-gnu': 4.56.0 - '@rollup/rollup-linux-arm64-musl': 4.56.0 - '@rollup/rollup-linux-loong64-gnu': 4.56.0 - '@rollup/rollup-linux-loong64-musl': 4.56.0 - '@rollup/rollup-linux-ppc64-gnu': 4.56.0 - '@rollup/rollup-linux-ppc64-musl': 4.56.0 - '@rollup/rollup-linux-riscv64-gnu': 4.56.0 - '@rollup/rollup-linux-riscv64-musl': 4.56.0 - '@rollup/rollup-linux-s390x-gnu': 4.56.0 - '@rollup/rollup-linux-x64-gnu': 4.56.0 - '@rollup/rollup-linux-x64-musl': 4.56.0 - '@rollup/rollup-openbsd-x64': 4.56.0 - '@rollup/rollup-openharmony-arm64': 4.56.0 - '@rollup/rollup-win32-arm64-msvc': 4.56.0 - '@rollup/rollup-win32-ia32-msvc': 4.56.0 - '@rollup/rollup-win32-x64-gnu': 4.56.0 - '@rollup/rollup-win32-x64-msvc': 4.56.0 + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 roughjs@4.6.6: @@ -8025,14 +7752,12 @@ snapshots: scslre@0.3.0: dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 refa: 0.12.1 regexp-ast-analysis: 0.7.1 semver@6.3.1: {} - semver@7.7.2: {} - semver@7.7.3: {} serialize-javascript@6.0.2: @@ -8069,8 +7794,6 @@ snapshots: smol-toml@1.5.2: {} - smol-toml@1.6.0: {} - solid-js@1.9.11: dependencies: csstype: 3.2.3 @@ -8157,6 +7880,11 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 + string-width@8.1.1: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -8171,32 +7899,30 @@ snapshots: strip-json-comments@3.1.1: {} - strip-json-comments@5.0.3: {} - style-search@0.1.0: {} - stylelint-config-recommended@18.0.0(stylelint@17.0.0(typescript@5.9.3)): + stylelint-config-recommended@18.0.0(stylelint@17.1.0(typescript@5.9.3)): dependencies: - stylelint: 17.0.0(typescript@5.9.3) + stylelint: 17.1.0(typescript@5.9.3) - stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@17.0.0(typescript@5.9.3)): + stylelint-declaration-block-no-ignored-properties@3.0.0(stylelint@17.1.0(typescript@5.9.3)): dependencies: - stylelint: 17.0.0(typescript@5.9.3) + stylelint: 17.1.0(typescript@5.9.3) - stylelint-declaration-strict-value@1.10.11(stylelint@17.0.0(typescript@5.9.3)): + stylelint-declaration-strict-value@1.10.11(stylelint@17.1.0(typescript@5.9.3)): dependencies: - stylelint: 17.0.0(typescript@5.9.3) + stylelint: 17.1.0(typescript@5.9.3) - stylelint-value-no-unknown-custom-properties@6.1.1(stylelint@17.0.0(typescript@5.9.3)): + stylelint-value-no-unknown-custom-properties@6.1.1(stylelint@17.1.0(typescript@5.9.3)): dependencies: postcss-value-parser: 4.2.0 resolve: 1.22.11 - stylelint: 17.0.0(typescript@5.9.3) + stylelint: 17.1.0(typescript@5.9.3) - stylelint@17.0.0(typescript@5.9.3): + stylelint@17.1.0(typescript@5.9.3): dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-syntax-patches-for-csstree': 1.0.25 + '@csstools/css-syntax-patches-for-csstree': 1.0.26 '@csstools/css-tokenizer': 4.0.0 '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.1) @@ -8228,7 +7954,7 @@ snapshots: postcss-safe-parser: 7.0.1(postcss@8.5.6) postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - string-width: 8.1.0 + string-width: 8.1.1 supports-hyperlinks: 4.4.0 svg-tags: 1.0.0 table: 6.9.0 @@ -8427,12 +8153,12 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -8482,7 +8208,7 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - updates@17.0.8: {} + updates@17.0.9: {} uri-js@4.4.1: dependencies: @@ -8494,30 +8220,30 @@ snapshots: vanilla-colorful@0.7.2: {} - vite-string-plugin@1.5.0(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2)): + vite-string-plugin@2.0.0(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2)): dependencies: - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) - vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.56.0 + rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.0.10 + '@types/node': 25.1.0 fsevents: 2.3.3 jiti: 2.6.1 stylus: 0.57.0 terser: 5.46.0 yaml: 2.8.2 - vitest@4.0.18(@types/node@25.0.10)(happy-dom@20.3.7)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2): + vitest@4.0.18(@types/node@25.1.0)(happy-dom@20.4.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -8534,11 +8260,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.1.0)(jiti@2.6.1)(stylus@0.57.0)(terser@5.46.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.0.10 - happy-dom: 20.3.7 + '@types/node': 25.1.0 + happy-dom: 20.4.0 transitivePeerDependencies: - jiti - less @@ -8603,10 +8329,10 @@ snapshots: optionalDependencies: vue: 3.5.27(typescript@5.9.3) - vue-tsc@3.2.3(typescript@5.9.3): + vue-tsc@3.2.4(typescript@5.9.3): dependencies: '@volar/typescript': 2.4.27 - '@vue/language-core': 3.2.3 + '@vue/language-core': 3.2.4 typescript: 5.9.3 vue@3.5.27(typescript@5.9.3): @@ -8619,8 +8345,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - walk-up-path@4.0.0: {} - watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 @@ -8751,5 +8475,3 @@ snapshots: yaml@2.8.2: {} yocto-queue@0.1.0: {} - - zod@4.3.6: {} diff --git a/stylelint.config.js b/stylelint.config.js index cb3fb5b9c9..42edf76f43 100644 --- a/stylelint.config.js +++ b/stylelint.config.js @@ -1,3 +1,4 @@ +// @ts-check // TODO: Move to .ts after https://github.com/stylelint/stylelint/issues/8893 is fixed import {fileURLToPath} from 'node:url'; @@ -7,6 +8,7 @@ const cssVarFiles = [ fileURLToPath(new URL('web_src/css/themes/theme-gitea-dark.css', import.meta.url)), ]; +/** @type {import('stylelint').Config} */ export default { extends: 'stylelint-config-recommended', reportUnscopedDisables: true, @@ -57,14 +59,14 @@ export default { '@stylistic/block-opening-brace-space-before': 'always', '@stylistic/color-hex-case': 'lower', '@stylistic/declaration-bang-space-after': 'never', - '@stylistic/declaration-bang-space-before': null, + '@stylistic/declaration-bang-space-before': 'always', '@stylistic/declaration-block-semicolon-newline-after': null, '@stylistic/declaration-block-semicolon-newline-before': null, '@stylistic/declaration-block-semicolon-space-after': null, '@stylistic/declaration-block-semicolon-space-before': 'never', '@stylistic/declaration-block-trailing-semicolon': null, '@stylistic/declaration-colon-newline-after': null, - '@stylistic/declaration-colon-space-after': null, + '@stylistic/declaration-colon-space-after': 'always', '@stylistic/declaration-colon-space-before': 'never', '@stylistic/function-comma-newline-after': null, '@stylistic/function-comma-newline-before': null, @@ -101,7 +103,7 @@ export default { '@stylistic/selector-attribute-operator-space-before': null, '@stylistic/selector-combinator-space-after': null, '@stylistic/selector-combinator-space-before': null, - '@stylistic/selector-descendant-combinator-no-non-space': null, + '@stylistic/selector-descendant-combinator-no-non-space': true, '@stylistic/selector-list-comma-newline-after': null, '@stylistic/selector-list-comma-newline-before': null, '@stylistic/selector-list-comma-space-after': 'always-single-line', diff --git a/updates.config.ts b/updates.config.ts index a7eb364b44..7bf680bbde 100644 --- a/updates.config.ts +++ b/updates.config.ts @@ -5,5 +5,6 @@ export default { '@mcaptcha/vanilla-glue', // breaking changes in rc versions need to be handled 'cropperjs', // need to migrate to v2 but v2 is not compatible with v1 'tailwindcss', // need to migrate + '@eslint/json', // needs eslint 10 ], } satisfies Config; diff --git a/web_src/css/repo/wiki.css b/web_src/css/repo/wiki.css index 831a7752c3..9e60b3a8ed 100644 --- a/web_src/css/repo/wiki.css +++ b/web_src/css/repo/wiki.css @@ -46,7 +46,7 @@ } .repository.wiki .wiki-content-toc ul ul { - border-left: 1px var(--color-secondary); + border-left: 1px var(--color-secondary); border-left-style: dashed; } From 7ad9bf45230dfc19f8c84045edf1dcbc2424bcf8 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sun, 1 Feb 2026 14:01:08 +0800 Subject: [PATCH 2/8] Refactor ActionsTaskID (#36503) --- models/user/user_system.go | 34 ++++++++++++++------ models/user/user_system_test.go | 10 ++++-- routers/api/v1/api.go | 9 ++---- routers/web/repo/githttp.go | 6 ++-- services/auth/basic.go | 6 +--- services/auth/oauth2.go | 55 ++++++++++----------------------- services/auth/oauth2_test.go | 13 +++++--- services/lfs/server.go | 3 +- services/webhook/general.go | 2 +- 9 files changed, 65 insertions(+), 73 deletions(-) diff --git a/models/user/user_system.go b/models/user/user_system.go index 11008c77d4..cf4306df25 100644 --- a/models/user/user_system.go +++ b/models/user/user_system.go @@ -4,6 +4,7 @@ package user import ( + "strconv" "strings" "code.gitea.io/gitea/modules/structs" @@ -23,10 +24,6 @@ func NewGhostUser() *User { } } -func IsGhostUserName(name string) bool { - return strings.EqualFold(name, GhostUserName) -} - // IsGhost check if user is fake user for a deleted account func (u *User) IsGhost() bool { if u == nil { @@ -41,10 +38,6 @@ const ( ActionsUserEmail = "teabot@gitea.io" ) -func IsGiteaActionsUserName(name string) bool { - return strings.EqualFold(name, ActionsUserName) -} - // NewActionsUser creates and returns a fake user for running the actions. func NewActionsUser() *User { return &User{ @@ -61,15 +54,36 @@ func NewActionsUser() *User { } } +func NewActionsUserWithTaskID(id int64) *User { + u := NewActionsUser() + // LoginName is for only internal usage in this case, so it can be moved to other fields in the future + u.LoginSource = -1 + u.LoginName = "@" + ActionsUserName + "/" + strconv.FormatInt(id, 10) + return u +} + +func GetActionsUserTaskID(u *User) (int64, bool) { + if u == nil || u.ID != ActionsUserID { + return 0, false + } + prefix, payload, _ := strings.Cut(u.LoginName, "/") + if prefix != "@"+ActionsUserName { + return 0, false + } else if taskID, err := strconv.ParseInt(payload, 10, 64); err == nil { + return taskID, true + } + return 0, false +} + func (u *User) IsGiteaActions() bool { return u != nil && u.ID == ActionsUserID } func GetSystemUserByName(name string) *User { - if IsGhostUserName(name) { + if strings.EqualFold(name, GhostUserName) { return NewGhostUser() } - if IsGiteaActionsUserName(name) { + if strings.EqualFold(name, ActionsUserName) { return NewActionsUser() } return nil diff --git a/models/user/user_system_test.go b/models/user/user_system_test.go index 5aa3fa463c..70a900378f 100644 --- a/models/user/user_system_test.go +++ b/models/user/user_system_test.go @@ -16,14 +16,20 @@ func TestSystemUser(t *testing.T) { assert.Equal(t, "Ghost", u.Name) assert.Equal(t, "ghost", u.LowerName) assert.True(t, u.IsGhost()) - assert.True(t, IsGhostUserName("gHost")) + + u = GetSystemUserByName("gHost") + require.NotNil(t, u) + assert.Equal(t, "Ghost", u.Name) u, err = GetPossibleUserByID(t.Context(), -2) require.NoError(t, err) assert.Equal(t, "gitea-actions", u.Name) assert.Equal(t, "gitea-actions", u.LowerName) assert.True(t, u.IsGiteaActions()) - assert.True(t, IsGiteaActionsUserName("Gitea-actionS")) + + u = GetSystemUserByName("Gitea-actionS") + require.NotNil(t, u) + assert.Equal(t, "Gitea Actions", u.FullName) _, err = GetPossibleUserByID(t.Context(), -3) require.Error(t, err) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 6d37c67cc4..cba96aa08a 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -188,8 +188,7 @@ func repoAssignment() func(ctx *context.APIContext) { repo.Owner = owner ctx.Repo.Repository = repo - if ctx.Doer != nil && ctx.Doer.ID == user_model.ActionsUserID { - taskID := ctx.Data["ActionsTaskID"].(int64) + if taskID, ok := user_model.GetActionsUserTaskID(ctx.Doer); ok { ctx.Repo.Permission, err = access_model.GetActionsUserRepoPermission(ctx, repo, ctx.Doer, taskID) if err != nil { ctx.APIErrorInternal(err) @@ -349,11 +348,7 @@ func tokenRequiresScopes(requiredScopeCategories ...auth_model.AccessTokenScopeC // Contexter middleware already checks token for user sign in process. func reqToken() func(ctx *context.APIContext) { return func(ctx *context.APIContext) { - // If actions token is present - if true == ctx.Data["IsActionsToken"] { - return - } - + // if a real user is signed in, or the user is from a Actions task, we are good if ctx.IsSigned { return } diff --git a/routers/web/repo/githttp.go b/routers/web/repo/githttp.go index 8b3deb5a03..e922ed99fc 100644 --- a/routers/web/repo/githttp.go +++ b/routers/web/repo/githttp.go @@ -22,6 +22,7 @@ import ( access_model "code.gitea.io/gitea/models/perm/access" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git/gitcmd" "code.gitea.io/gitea/modules/gitrepo" @@ -166,7 +167,7 @@ func httpBase(ctx *context.Context, optGitService ...string) *serviceHandler { return nil } - if ctx.IsBasicAuth && ctx.Data["IsApiToken"] != true && ctx.Data["IsActionsToken"] != true { + if ctx.IsBasicAuth && ctx.Data["IsApiToken"] != true && !ctx.Doer.IsGiteaActions() { _, err = auth_model.GetTwoFactorByUID(ctx, ctx.Doer.ID) if err == nil { // TODO: This response should be changed to "invalid credentials" for security reasons once the expectation behind it (creating an app token to authenticate) is properly documented @@ -197,8 +198,7 @@ func httpBase(ctx *context.Context, optGitService ...string) *serviceHandler { accessMode = perm.AccessModeRead } - if ctx.Data["IsActionsToken"] == true { - taskID := ctx.Data["ActionsTaskID"].(int64) + if taskID, ok := user_model.GetActionsUserTaskID(ctx.Doer); ok { p, err := access_model.GetActionsUserRepoPermission(ctx, repo, ctx.Doer, taskID) if err != nil { ctx.ServerError("GetActionsUserRepoPermission", err) diff --git a/services/auth/basic.go b/services/auth/basic.go index 501924b4df..51613870c9 100644 --- a/services/auth/basic.go +++ b/services/auth/basic.go @@ -117,12 +117,8 @@ func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore task, err := actions_model.GetRunningTaskByToken(req.Context(), authToken) if err == nil && task != nil { log.Trace("Basic Authorization: Valid AccessToken for task[%d]", task.ID) - store.GetData()["LoginMethod"] = ActionTokenMethodName - store.GetData()["IsActionsToken"] = true - store.GetData()["ActionsTaskID"] = task.ID - - return user_model.NewActionsUser(), nil + return user_model.NewActionsUserWithTaskID(task.ID), nil } if !setting.Service.EnableBasicAuth { diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go index 7df6f4638e..13cbc77f7a 100644 --- a/services/auth/oauth2.go +++ b/services/auth/oauth2.go @@ -6,6 +6,7 @@ package auth import ( "context" + "errors" "net/http" "strings" "time" @@ -17,14 +18,12 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/services/actions" "code.gitea.io/gitea/services/oauth2_provider" ) -// Ensure the struct implements the interface. -var ( - _ Method = &OAuth2{} -) +var _ Method = &OAuth2{} // GetOAuthAccessTokenScopeAndUserID returns access token scope and user id func GetOAuthAccessTokenScopeAndUserID(ctx context.Context, accessToken string) (auth_model.AccessTokenScope, int64) { @@ -106,18 +105,16 @@ func parseToken(req *http.Request) (string, bool) { return "", false } -// userIDFromToken returns the user id corresponding to the OAuth token. +// userFromToken returns the user corresponding to the OAuth token. // It will set 'IsApiToken' to true if the token is an API token and -// set 'ApiTokenScope' to the scope of the access token -func (o *OAuth2) userIDFromToken(ctx context.Context, tokenSHA string, store DataStore) int64 { +// set 'ApiTokenScope' to the scope of the access token (TODO: this behavior should be fixed, don't set ctx.Data) +func (o *OAuth2) userFromToken(ctx context.Context, tokenSHA string, store DataStore) (*user_model.User, error) { // Let's see if token is valid. if strings.Contains(tokenSHA, ".") { // First attempt to decode an actions JWT, returning the actions user if taskID, err := actions.TokenToTaskID(tokenSHA); err == nil { if CheckTaskIsRunning(ctx, taskID) { - store.GetData()["IsActionsToken"] = true - store.GetData()["ActionsTaskID"] = taskID - return user_model.ActionsUserID + return user_model.NewActionsUserWithTaskID(taskID), nil } } @@ -127,33 +124,27 @@ func (o *OAuth2) userIDFromToken(ctx context.Context, tokenSHA string, store Dat store.GetData()["IsApiToken"] = true store.GetData()["ApiTokenScope"] = accessTokenScope } - return uid + return user_model.GetUserByID(ctx, uid) } t, err := auth_model.GetAccessTokenBySHA(ctx, tokenSHA) if err != nil { if auth_model.IsErrAccessTokenNotExist(err) { // check task token - task, err := actions_model.GetRunningTaskByToken(ctx, tokenSHA) - if err == nil && task != nil { + if task, err := actions_model.GetRunningTaskByToken(ctx, tokenSHA); err == nil { log.Trace("Basic Authorization: Valid AccessToken for task[%d]", task.ID) - - store.GetData()["IsActionsToken"] = true - store.GetData()["ActionsTaskID"] = task.ID - - return user_model.ActionsUserID + return user_model.NewActionsUserWithTaskID(task.ID), nil } - } else if !auth_model.IsErrAccessTokenNotExist(err) && !auth_model.IsErrAccessTokenEmpty(err) { - log.Error("GetAccessTokenBySHA: %v", err) } - return 0 + return nil, err } + t.UpdatedUnix = timeutil.TimeStampNow() if err = auth_model.UpdateAccessToken(ctx, t); err != nil { log.Error("UpdateAccessToken: %v", err) } store.GetData()["IsApiToken"] = true store.GetData()["ApiTokenScope"] = t.Scope - return t.UID + return user_model.GetUserByID(ctx, t.UID) } // Verify extracts the user ID from the OAuth token in the query parameters @@ -173,21 +164,9 @@ func (o *OAuth2) Verify(req *http.Request, w http.ResponseWriter, store DataStor return nil, nil } - id := o.userIDFromToken(req.Context(), token, store) - - if id <= 0 && id != -2 { // -2 means actions, so we need to allow it. - return nil, user_model.ErrUserNotExist{} + user, err := o.userFromToken(req.Context(), token, store) + if err != nil && !errors.Is(err, util.ErrNotExist) { + log.Error("userFromToken: %v", err) // the callers might ignore the error, so log it here } - log.Trace("OAuth2 Authorization: Found token for user[%d]", id) - - user, err := user_model.GetPossibleUserByID(req.Context(), id) - if err != nil { - if !user_model.IsErrUserNotExist(err) { - log.Error("GetUserByName: %v", err) - } - return nil, err - } - - log.Trace("OAuth2 Authorization: Logged in user %-v", user) - return user, nil + return user, err } diff --git a/services/auth/oauth2_test.go b/services/auth/oauth2_test.go index f003742a94..308da846b8 100644 --- a/services/auth/oauth2_test.go +++ b/services/auth/oauth2_test.go @@ -12,23 +12,26 @@ import ( "code.gitea.io/gitea/services/actions" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestUserIDFromToken(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) t.Run("Actions JWT", func(t *testing.T) { - const RunningTaskID = 47 + const RunningTaskID int64 = 47 token, err := actions.CreateAuthorizationToken(RunningTaskID, 1, 2) assert.NoError(t, err) ds := make(reqctx.ContextData) o := OAuth2{} - uid := o.userIDFromToken(t.Context(), token, ds) - assert.Equal(t, user_model.ActionsUserID, uid) - assert.Equal(t, true, ds["IsActionsToken"]) - assert.Equal(t, ds["ActionsTaskID"], int64(RunningTaskID)) + u, err := o.userFromToken(t.Context(), token, ds) + require.NoError(t, err) + assert.Equal(t, user_model.ActionsUserID, u.ID) + taskID, ok := user_model.GetActionsUserTaskID(u) + assert.True(t, ok) + assert.Equal(t, RunningTaskID, taskID) }) } diff --git a/services/lfs/server.go b/services/lfs/server.go index 4819437bf1..10b4dba222 100644 --- a/services/lfs/server.go +++ b/services/lfs/server.go @@ -541,8 +541,7 @@ func authenticate(ctx *context.Context, repository *repo_model.Repository, autho accessMode = perm_model.AccessModeWrite } - if ctx.Data["IsActionsToken"] == true { - taskID := ctx.Data["ActionsTaskID"].(int64) + if taskID, ok := user_model.GetActionsUserTaskID(ctx.Doer); ok { perm, err := access_model.GetActionsUserRepoPermission(ctx, repository, ctx.Doer, taskID) if err != nil { log.Error("Unable to GetActionsUserRepoPermission for task[%d] Error: %v", taskID, err) diff --git a/services/webhook/general.go b/services/webhook/general.go index be457e46f5..3186f53d74 100644 --- a/services/webhook/general.go +++ b/services/webhook/general.go @@ -317,7 +317,7 @@ func getStatusPayloadInfo(p *api.CommitStatusPayload, linkFormatter linkFormatte text = fmt.Sprintf("Commit Status changed: %s - %s", refLink, p.Description) color = greenColor if withSender { - if user_model.IsGiteaActionsUserName(p.Sender.UserName) { + if user_model.GetSystemUserByName(p.Sender.UserName) != nil { text += " by " + p.Sender.FullName } else { text += " by " + linkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName) From e377da989f4ddb719b14f89703283134309a4e97 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 31 Jan 2026 22:03:38 -0800 Subject: [PATCH 3/8] Allow scroll propagation outside code editor (#36502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #28479 When scrolling inside the editor and the editor has already reached the end of its scroll area, the browser does not continue scrolling. This is inconvenient because users must move the cursor out of the editor to scroll the page further. This PR enables automatic switching between the editor’s scroll and the browser’s scroll, allowing seamless continuous scrolling. --- web_src/js/features/codeeditor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_src/js/features/codeeditor.ts b/web_src/js/features/codeeditor.ts index 97f45ef708..e47a678bda 100644 --- a/web_src/js/features/codeeditor.ts +++ b/web_src/js/features/codeeditor.ts @@ -35,7 +35,7 @@ const baseOptions: MonacoOpts = { renderLineHighlight: 'all', renderLineHighlightOnlyWhenFocus: true, rulers: [], - scrollbar: {horizontalScrollbarSize: 6, verticalScrollbarSize: 6}, + scrollbar: {horizontalScrollbarSize: 6, verticalScrollbarSize: 6, alwaysConsumeMouseWheel: false}, scrollBeyondLastLine: false, automaticLayout: true, wrappingIndent: 'none', From 072de7d8cdd323f4a6592a113b9d5478e38dbe2c Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Feb 2026 17:06:57 +0800 Subject: [PATCH 4/8] Unify repo names in system notices (#36491) Fixes: https://github.com/go-gitea/gitea/issues/36211 This PR fixes ensures that all system notices consistently include repository names in the format `"Action description (owner/repo): error message"`. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: silverwind <115237+silverwind@users.noreply.github.com> Co-authored-by: silverwind --- routers/api/v1/repo/migrate.go | 1 + services/migrations/migrate.go | 4 ++-- services/mirror/mirror_pull.go | 8 ++++---- services/repository/adopt.go | 2 +- services/repository/check.go | 8 ++++---- services/repository/create.go | 12 ++++++------ services/repository/delete.go | 4 ++-- services/repository/fork.go | 4 ++-- services/repository/template.go | 4 ++-- services/wiki/wiki.go | 2 +- 10 files changed, 25 insertions(+), 24 deletions(-) diff --git a/routers/api/v1/repo/migrate.go b/routers/api/v1/repo/migrate.go index 17259dc724..9355177fce 100644 --- a/routers/api/v1/repo/migrate.go +++ b/routers/api/v1/repo/migrate.go @@ -140,6 +140,7 @@ func Migrate(ctx *context.APIContext) { } opts := migrations.MigrateOptions{ + OriginalURL: form.CloneAddr, CloneAddr: remoteAddr, RepoName: form.RepoName, Description: form.Description, diff --git a/services/migrations/migrate.go b/services/migrations/migrate.go index bf65e10454..99f8dba92f 100644 --- a/services/migrations/migrate.go +++ b/services/migrations/migrate.go @@ -131,8 +131,8 @@ func MigrateRepository(ctx context.Context, doer *user_model.User, ownerName str if err1 := uploader.Rollback(); err1 != nil { log.Error("rollback failed: %v", err1) } - if err2 := system_model.CreateRepositoryNotice(fmt.Sprintf("Migrate repository from %s failed: %v", opts.OriginalURL, err)); err2 != nil { - log.Error("create respotiry notice failed: ", err2) + if err2 := system_model.CreateRepositoryNotice(fmt.Sprintf("Migrate repository (%s/%s) from %s failed: %v", ownerName, opts.RepoName, opts.OriginalURL, err)); err2 != nil { + log.Error("create repository notice failed: ", err2) } return nil, err } diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go index 14a226f453..3a1ed2b7d9 100644 --- a/services/mirror/mirror_pull.go +++ b/services/mirror/mirror_pull.go @@ -202,7 +202,7 @@ func pruneBrokenReferences(ctx context.Context, m *repo_model.Mirror, gitRepo gi stdoutMessage := util.SanitizeCredentialURLs(stdout) log.Error("Failed to prune mirror repository %s references:\nStdout: %s\nStderr: %s\nErr: %v", gitRepo.RelativePath(), stdoutMessage, stderrMessage, pruneErr) - desc := fmt.Sprintf("Failed to prune mirror repository %s references: %s", gitRepo.RelativePath(), stderrMessage) + desc := fmt.Sprintf("Failed to prune mirror repository (%s) references: %s", m.Repo.FullName(), stderrMessage) if err := system_model.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } @@ -277,7 +277,7 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*mirrorSyncResult, bo // If there is still an error (or there always was an error) if err != nil { log.Error("SyncMirrors [repo: %-v]: failed to update mirror repository:\nStdout: %s\nStderr: %s\nErr: %v", m.Repo, stdoutMessage, stderrMessage, err) - desc := fmt.Sprintf("Failed to update mirror repository '%s': %s", m.Repo.RelativePath(), stderrMessage) + desc := fmt.Sprintf("Failed to update mirror repository (%s): %s", m.Repo.FullName(), stderrMessage) if err := system_model.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } @@ -355,7 +355,7 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*mirrorSyncResult, bo // If there is still an error (or there always was an error) if err != nil { log.Error("SyncMirrors [repo: %-v Wiki]: failed to update mirror repository wiki:\nStdout: %s\nStderr: %s\nErr: %v", m.Repo, stdoutMessage, stderrMessage, err) - desc := fmt.Sprintf("Failed to update mirror repository wiki '%s': %s", m.Repo.WikiStorageRepo().RelativePath(), stderrMessage) + desc := fmt.Sprintf("Failed to update mirror repository wiki (%s): %s", m.Repo.FullName(), stderrMessage) if err := system_model.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } @@ -595,7 +595,7 @@ func checkAndUpdateEmptyRepository(ctx context.Context, m *repo_model.Mirror, re // Update the is empty and default_branch columns if err := repo_model.UpdateRepositoryColsWithAutoTime(ctx, m.Repo, "default_branch", "is_empty"); err != nil { log.Error("Failed to update default branch of repository %-v. Error: %v", m.Repo, err) - desc := fmt.Sprintf("Failed to update default branch of repository '%s': %v", m.Repo.RelativePath(), err) + desc := fmt.Sprintf("Failed to update default branch of repository (%s): %v", m.Repo.FullName(), err) if err = system_model.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } diff --git a/services/repository/adopt.go b/services/repository/adopt.go index 18d70d1bee..13218193d5 100644 --- a/services/repository/adopt.go +++ b/services/repository/adopt.go @@ -74,7 +74,7 @@ func AdoptRepository(ctx context.Context, doer, owner *user_model.User, opts Cre // WARNING: Don't override all later err with local variables defer func() { if err != nil { - // we can not use the ctx because it maybe canceled or timeout + // we can not use `ctx` because it may be canceled or timed out if errDel := deleteFailedAdoptRepository(repo.ID); errDel != nil { log.Error("Failed to delete repository %s that could not be adopted: %v", repo.FullName(), errDel) } diff --git a/services/repository/check.go b/services/repository/check.go index e521af94e1..4ae49d81f6 100644 --- a/services/repository/check.go +++ b/services/repository/check.go @@ -91,7 +91,7 @@ func GitGcRepo(ctx context.Context, repo *repo_model.Repository, timeout time.Du stdout, _, err = gitrepo.RunCmdString(ctx, repo, command) if err != nil { log.Error("Repository garbage collection failed for %-v. Stdout: %s\nError: %v", repo, stdout, err) - desc := fmt.Sprintf("Repository garbage collection failed for %s. Stdout: %s\nError: %v", repo.RelativePath(), stdout, err) + desc := fmt.Sprintf("Repository garbage collection failed (%s). Stdout: %s\nError: %v", repo.FullName(), stdout, err) if err := system_model.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } @@ -101,7 +101,7 @@ func GitGcRepo(ctx context.Context, repo *repo_model.Repository, timeout time.Du // Now update the size of the repository if err := repo_module.UpdateRepoSize(ctx, repo); err != nil { log.Error("Updating size as part of garbage collection failed for %-v. Stdout: %s\nError: %v", repo, stdout, err) - desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RelativePath(), stdout, err) + desc := fmt.Sprintf("Updating size as part of garbage collection failed (%s). Stdout: %s\nError: %v", repo.FullName(), stdout, err) if err := system_model.CreateRepositoryNotice(desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } @@ -163,7 +163,7 @@ func DeleteMissingRepositories(ctx context.Context, doer *user_model.User) error log.Trace("Deleting %d/%d...", repo.OwnerID, repo.ID) if err := DeleteRepositoryDirectly(ctx, repo.ID); err != nil { log.Error("Failed to DeleteRepository %-v: Error: %v", repo, err) - if err2 := system_model.CreateRepositoryNotice("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err); err2 != nil { + if err2 := system_model.CreateRepositoryNotice("Failed to DeleteRepository (%s) [%d]: Error: %v", repo.FullName(), repo.ID, err); err2 != nil { log.Error("CreateRepositoryNotice: %v", err) } } @@ -191,7 +191,7 @@ func ReinitMissingRepositories(ctx context.Context) error { log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID) if err := gitrepo.InitRepository(ctx, repo, repo.ObjectFormatName); err != nil { log.Error("Unable (re)initialize repository %d at %s. Error: %v", repo.ID, repo.RelativePath(), err) - if err2 := system_model.CreateRepositoryNotice("InitRepository [%d]: %v", repo.ID, err); err2 != nil { + if err2 := system_model.CreateRepositoryNotice("InitRepository (%s) [%d]: %v", repo.FullName(), repo.ID, err); err2 != nil { log.Error("CreateRepositoryNotice: %v", err2) } } diff --git a/services/repository/create.go b/services/repository/create.go index bfac83419d..cbdc9cca76 100644 --- a/services/repository/create.go +++ b/services/repository/create.go @@ -265,8 +265,8 @@ func CreateRepositoryDirectly(ctx context.Context, doer, owner *user_model.User, // WARNING: Don't override all later err with local variables defer func() { if err != nil { - // we can not use the ctx because it maybe canceled or timeout - cleanupRepository(repo.ID) + // we can not use `ctx` because it may be canceled or timed out + cleanupRepository(repo) } }() @@ -461,11 +461,11 @@ func createRepositoryInDB(ctx context.Context, doer, u *user_model.User, repo *r return nil } -func cleanupRepository(repoID int64) { - if errDelete := DeleteRepositoryDirectly(graceful.GetManager().ShutdownContext(), repoID); errDelete != nil { +func cleanupRepository(repo *repo_model.Repository) { + ctx := graceful.GetManager().ShutdownContext() + if errDelete := DeleteRepositoryDirectly(ctx, repo.ID); errDelete != nil { log.Error("cleanupRepository failed: %v", errDelete) - // add system notice - if err := system_model.CreateRepositoryNotice("DeleteRepositoryDirectly failed when cleanup repository: %v", errDelete); err != nil { + if err := system_model.CreateRepositoryNotice("DeleteRepositoryDirectly failed when cleanup repository (%s)", repo.FullName(), errDelete); err != nil { log.Error("CreateRepositoryNotice: %v", err) } } diff --git a/services/repository/delete.go b/services/repository/delete.go index 040280c8a8..aa16a968f7 100644 --- a/services/repository/delete.go +++ b/services/repository/delete.go @@ -309,7 +309,7 @@ func DeleteRepositoryDirectly(ctx context.Context, repoID int64, ignoreOrgTeams // Remove repository files. if err := gitrepo.DeleteRepository(ctx, repo); err != nil { - desc := fmt.Sprintf("Delete repository files [%s]: %v", repo.FullName(), err) + desc := fmt.Sprintf("Delete repository files (%s): %v", repo.FullName(), err) if err = system_model.CreateNotice(graceful.GetManager().ShutdownContext(), system_model.NoticeRepository, desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) } @@ -317,7 +317,7 @@ func DeleteRepositoryDirectly(ctx context.Context, repoID int64, ignoreOrgTeams // Remove wiki files if it exists. if err := gitrepo.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil { - desc := fmt.Sprintf("Delete wiki repository files [%s]: %v", repo.FullName(), err) + desc := fmt.Sprintf("Delete wiki repository files (%s): %v", repo.FullName(), err) // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled if err = system_model.CreateNotice(graceful.GetManager().ShutdownContext(), system_model.NoticeRepository, desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) diff --git a/services/repository/fork.go b/services/repository/fork.go index f92af65605..9c360c2f82 100644 --- a/services/repository/fork.go +++ b/services/repository/fork.go @@ -123,8 +123,8 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork // WARNING: Don't override all later err with local variables defer func() { if err != nil { - // we can not use the ctx because it maybe canceled or timeout - cleanupRepository(repo.ID) + // we can not use `ctx` because it may be canceled or timed out + cleanupRepository(repo) } }() diff --git a/services/repository/template.go b/services/repository/template.go index 7444bf7b60..96033cb98d 100644 --- a/services/repository/template.go +++ b/services/repository/template.go @@ -100,8 +100,8 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ // last - clean up the repository if something goes wrong defer func() { if err != nil { - // we can not use the ctx because it maybe canceled or timeout - cleanupRepository(generateRepo.ID) + // we can not use `ctx` because it may be canceled or timed out + cleanupRepository(generateRepo) } }() diff --git a/services/wiki/wiki.go b/services/wiki/wiki.go index 1f1e564006..a025f26051 100644 --- a/services/wiki/wiki.go +++ b/services/wiki/wiki.go @@ -369,7 +369,7 @@ func DeleteWiki(ctx context.Context, repo *repo_model.Repository) error { } if err := gitrepo.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil { - desc := fmt.Sprintf("Delete wiki repository files [%s]: %v", repo.FullName(), err) + desc := fmt.Sprintf("Delete wiki repository files (%s): %v", repo.FullName(), err) // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled if err = system_model.CreateNotice(graceful.GetManager().ShutdownContext(), system_model.NoticeRepository, desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) From 9d960390274f3020c21a540ee9ddfa0e1371e9e9 Mon Sep 17 00:00:00 2001 From: silverwind Date: Sun, 1 Feb 2026 10:36:43 +0100 Subject: [PATCH 5/8] Bump alpine to 3.23, add platforms to `docker-dryrun` (#36379) - Bump alpine to 3.23 following https://github.com/go-gitea/gitea/pull/36185 and https://github.com/go-gitea/gitea/pull/36202. - Enable all architectures in `docker-dryrun`. - Tweak actions conditions to be more precise. --------- Signed-off-by: silverwind Co-authored-by: techknowlogick Co-authored-by: Giteabot --- .github/workflows/files-changed.yml | 1 + .github/workflows/pull-docker-dryrun.yml | 7 ++++--- Dockerfile | 4 ++-- Dockerfile.rootless | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/files-changed.yml b/.github/workflows/files-changed.yml index 7b58186cd0..332e9e0d6f 100644 --- a/.github/workflows/files-changed.yml +++ b/.github/workflows/files-changed.yml @@ -85,6 +85,7 @@ jobs: - "uv.lock" docker: + - ".github/workflows/pull-docker-dryrun.yml" - "Dockerfile" - "Dockerfile.rootless" - "docker/**" diff --git a/.github/workflows/pull-docker-dryrun.yml b/.github/workflows/pull-docker-dryrun.yml index 2a4d675abc..405521c354 100644 --- a/.github/workflows/pull-docker-dryrun.yml +++ b/.github/workflows/pull-docker-dryrun.yml @@ -14,24 +14,25 @@ jobs: contents: read container: - if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.actions == 'true' + if: needs.files-changed.outputs.docker == 'true' needs: files-changed runs-on: ubuntu-latest permissions: contents: read steps: - uses: actions/checkout@v6 + - uses: docker/setup-qemu-action@v3 - uses: docker/setup-buildx-action@v3 - name: Build regular container image uses: docker/build-push-action@v6 with: context: . + platforms: linux/amd64,linux/arm64,linux/riscv64 push: false - tags: gitea/gitea:linux-amd64 - name: Build rootless container image uses: docker/build-push-action@v6 with: context: . push: false + platforms: linux/amd64,linux/arm64,linux/riscv64 file: Dockerfile.rootless - tags: gitea/gitea:linux-amd64 diff --git a/Dockerfile b/Dockerfile index cb536b0bde..7893db73e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 # Build stage -FROM docker.io/library/golang:1.25-alpine3.22 AS build-env +FROM docker.io/library/golang:1.25-alpine3.23 AS build-env ARG GOPROXY=direct @@ -39,7 +39,7 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \ /tmp/local/etc/s6/.s6-svscan/* \ /go/src/code.gitea.io/gitea/gitea -FROM docker.io/library/alpine:3.22 AS gitea +FROM docker.io/library/alpine:3.23 AS gitea EXPOSE 22 3000 diff --git a/Dockerfile.rootless b/Dockerfile.rootless index e4ba3d2fba..6640c2b2de 100644 --- a/Dockerfile.rootless +++ b/Dockerfile.rootless @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 # Build stage -FROM docker.io/library/golang:1.25-alpine3.22 AS build-env +FROM docker.io/library/golang:1.25-alpine3.23 AS build-env ARG GOPROXY=direct @@ -33,7 +33,7 @@ COPY docker/rootless /tmp/local RUN chmod 755 /tmp/local/usr/local/bin/* \ /go/src/code.gitea.io/gitea/gitea -FROM docker.io/library/alpine:3.22 AS gitea-rootless +FROM docker.io/library/alpine:3.23 AS gitea-rootless EXPOSE 2222 3000 From 584d8ef75fc0c794d8ee4f7f39605eca737907bc Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Feb 2026 10:35:51 +0000 Subject: [PATCH 6/8] Fix incorrect vendored detections (#36508) Fixes: https://github.com/go-gitea/gitea/issues/22618 `go-enry`'s `IsVendor` function marks git paths (`.gitignore`, `.gitattributes`, `.gitmodules`), github/gitea paths (`.github/`, `.gitea/`) as "vendored" for GitHub Linguist language statistics. This causes these files to incorrectly display the "Vendored" tag in diff views. Override `go-enry`'s detection for these specific cases while preserving its behavior for actual vendor directories. --------- Signed-off-by: silverwind Signed-off-by: wxiaoguang Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: silverwind <115237+silverwind@users.noreply.github.com> Co-authored-by: silverwind Co-authored-by: wxiaoguang --- AGENTS.md | 7 +++++-- modules/analyze/vendor.go | 24 +++++++++++++++++++++--- modules/analyze/vendor_test.go | 9 +++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index eda1abeeeb..f4414bfc8c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,10 @@ # Instructions for agents - Use `make help` to find available development targets -- Before committing go code changes, run `make fmt` +- Use the latest Golang stable release when working on Go code +- Use the latest Node.js LTS release when working on TypeScript code +- Before committing `.go` changes, run `make fmt` to format, and run `make lint-go` to lint +- Before committing `.ts` changes, run `make lint-js` to lint - Before committing `go.mod` changes, run `make tidy` - Before committing new `.go` files, add the current year into the copyright header -- Before committing files, removed any trailing whitespace +- Before committing any files, remove all trailing whitespace from source code lines diff --git a/modules/analyze/vendor.go b/modules/analyze/vendor.go index adcca923dd..f3e75f535f 100644 --- a/modules/analyze/vendor.go +++ b/modules/analyze/vendor.go @@ -4,10 +4,28 @@ package analyze import ( + "path" + "strings" + "github.com/go-enry/go-enry/v2" ) -// IsVendor returns whether or not path is a vendor path. -func IsVendor(path string) bool { - return enry.IsVendor(path) +// IsVendor returns whether the path is a vendor path. +// It uses go-enry's IsVendor function but overrides its detection for certain +// special cases that shouldn't be marked as vendored in the diff view. +func IsVendor(treePath string) bool { + if !enry.IsVendor(treePath) { + return false + } + + // Override detection for single files + basename := path.Base(treePath) + switch basename { + case ".gitignore", ".gitattributes", ".gitmodules": + return false + } + if strings.HasPrefix(treePath, ".github/") || strings.HasPrefix(treePath, ".gitea/") { + return false + } + return true } diff --git a/modules/analyze/vendor_test.go b/modules/analyze/vendor_test.go index 02a51d4c8f..6efb825de6 100644 --- a/modules/analyze/vendor_test.go +++ b/modules/analyze/vendor_test.go @@ -14,6 +14,7 @@ func TestIsVendor(t *testing.T) { path string want bool }{ + // Original go-enry test cases {"cache/", true}, {"random/cache/", true}, {"cache", false}, @@ -34,6 +35,14 @@ func TestIsVendor(t *testing.T) { {"a/docs/_build/", true}, {"a/dasdocs/_build-vsdoc.js", true}, {"a/dasdocs/_build-vsdoc.j", false}, + + // Override: Git/GitHub/Gitea-related paths should NOT be detected as vendored + {".gitignore", false}, + {".gitattributes", false}, + {".gitmodules", false}, + {"src/.gitignore", false}, + {".github/workflows/ci.yml", false}, + {".gitea/workflows/ci.yml", false}, } for _, tt := range tests { t.Run(tt.path, func(t *testing.T) { From c2dea22926f9e7a40aa47296e7b9bc3d1c5b039e Mon Sep 17 00:00:00 2001 From: Nicolas Date: Sun, 1 Feb 2026 13:28:28 +0100 Subject: [PATCH 7/8] Add resolve/unresolve review comment API endpoints (#36441) Co-authored-by: wxiaoguang --- models/issues/comment.go | 14 +++ models/issues/comment_code.go | 1 + modules/structs/pull_review.go | 8 +- routers/api/v1/api.go | 2 + routers/api/v1/repo/issue_comment.go | 35 +------ routers/api/v1/repo/pull_review.go | 120 ++++++++++++++++++++++ services/convert/pull_review.go | 50 +++++---- templates/swagger/v1_json.tmpl | 108 ++++++++++++++++++- tests/integration/api_pull_review_test.go | 75 ++++++++++++++ 9 files changed, 351 insertions(+), 62 deletions(-) diff --git a/models/issues/comment.go b/models/issues/comment.go index 9c249d2c05..f15618bf50 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -1034,6 +1034,20 @@ func GetCommentByID(ctx context.Context, id int64) (*Comment, error) { return c, nil } +func GetCommentWithRepoID(ctx context.Context, repoID, commentID int64) (*Comment, error) { + c, err := GetCommentByID(ctx, commentID) + if err != nil { + return nil, err + } + if err := c.LoadIssue(ctx); err != nil { + return nil, err + } + if c.Issue.RepoID != repoID { + return nil, ErrCommentNotExist{commentID, 0} + } + return c, nil +} + // FindCommentsOptions describes the conditions to Find comments type FindCommentsOptions struct { db.ListOptions diff --git a/models/issues/comment_code.go b/models/issues/comment_code.go index 55e67a1243..8de52f815a 100644 --- a/models/issues/comment_code.go +++ b/models/issues/comment_code.go @@ -102,6 +102,7 @@ func findCodeComments(ctx context.Context, opts FindCommentsOptions, issue *Issu continue } comment.Review = re + comment.Issue = issue } comments[n] = comment n++ diff --git a/modules/structs/pull_review.go b/modules/structs/pull_review.go index e93e4e9720..f44d2f84f5 100644 --- a/modules/structs/pull_review.go +++ b/modules/structs/pull_review.go @@ -72,7 +72,7 @@ type PullReviewComment struct { HTMLPullURL string `json:"pull_request_url"` } -// CreatePullReviewOptions are options to create a pull review +// CreatePullReviewOptions are options to create a pull request review type CreatePullReviewOptions struct { Event ReviewStateType `json:"event"` Body string `json:"body"` @@ -91,19 +91,19 @@ type CreatePullReviewComment struct { NewLineNum int64 `json:"new_position"` } -// SubmitPullReviewOptions are options to submit a pending pull review +// SubmitPullReviewOptions are options to submit a pending pull request review type SubmitPullReviewOptions struct { Event ReviewStateType `json:"event"` Body string `json:"body"` } -// DismissPullReviewOptions are options to dismiss a pull review +// DismissPullReviewOptions are options to dismiss a pull request review type DismissPullReviewOptions struct { Message string `json:"message"` Priors bool `json:"priors"` } -// PullReviewRequestOptions are options to add or remove pull review requests +// PullReviewRequestOptions are options to add or remove pull request review requests type PullReviewRequestOptions struct { Reviewers []string `json:"reviewers"` TeamReviewers []string `json:"team_reviewers"` diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index cba96aa08a..359d5af4c4 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -1348,6 +1348,8 @@ func Routes() *web.Router { m.Combo("").Get(repo.ListPullRequests). Post(reqToken(), mustNotBeArchived, bind(api.CreatePullRequestOption{}), repo.CreatePullRequest) m.Get("/pinned", repo.ListPinnedPullRequests) + m.Post("/comments/{id}/resolve", reqToken(), mustNotBeArchived, repo.ResolvePullReviewComment) + m.Post("/comments/{id}/unresolve", reqToken(), mustNotBeArchived, repo.UnresolvePullReviewComment) m.Group("/{index}", func() { m.Combo("").Get(repo.GetPullRequest). Patch(reqToken(), bind(api.EditPullRequestOption{}), repo.EditPullRequest) diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index 4db1e878b1..37b5836e1d 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -445,7 +445,7 @@ func GetIssueComment(ctx *context.APIContext) { // "404": // "$ref": "#/responses/notFound" - comment, err := issues_model.GetCommentByID(ctx, ctx.PathParamInt64("id")) + comment, err := issues_model.GetCommentWithRepoID(ctx, ctx.Repo.Repository.ID, ctx.PathParamInt64("id")) if err != nil { if issues_model.IsErrCommentNotExist(err) { ctx.APIErrorNotFound(err) @@ -455,15 +455,6 @@ func GetIssueComment(ctx *context.APIContext) { return } - if err = comment.LoadIssue(ctx); err != nil { - ctx.APIErrorInternal(err) - return - } - if comment.Issue.RepoID != ctx.Repo.Repository.ID { - ctx.Status(http.StatusNotFound) - return - } - if !ctx.Repo.CanReadIssuesOrPulls(comment.Issue.IsPull) { ctx.APIErrorNotFound() return @@ -579,7 +570,7 @@ func EditIssueCommentDeprecated(ctx *context.APIContext) { } func editIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption) { - comment, err := issues_model.GetCommentByID(ctx, ctx.PathParamInt64("id")) + comment, err := issues_model.GetCommentWithRepoID(ctx, ctx.Repo.Repository.ID, ctx.PathParamInt64("id")) if err != nil { if issues_model.IsErrCommentNotExist(err) { ctx.APIErrorNotFound(err) @@ -589,16 +580,6 @@ func editIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption) return } - if err := comment.LoadIssue(ctx); err != nil { - ctx.APIErrorInternal(err) - return - } - - if comment.Issue.RepoID != ctx.Repo.Repository.ID { - ctx.Status(http.StatusNotFound) - return - } - if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.CanWriteIssuesOrPulls(comment.Issue.IsPull)) { ctx.Status(http.StatusForbidden) return @@ -698,7 +679,7 @@ func DeleteIssueCommentDeprecated(ctx *context.APIContext) { } func deleteIssueComment(ctx *context.APIContext) { - comment, err := issues_model.GetCommentByID(ctx, ctx.PathParamInt64("id")) + comment, err := issues_model.GetCommentWithRepoID(ctx, ctx.Repo.Repository.ID, ctx.PathParamInt64("id")) if err != nil { if issues_model.IsErrCommentNotExist(err) { ctx.APIErrorNotFound(err) @@ -708,16 +689,6 @@ func deleteIssueComment(ctx *context.APIContext) { return } - if err := comment.LoadIssue(ctx); err != nil { - ctx.APIErrorInternal(err) - return - } - - if comment.Issue.RepoID != ctx.Repo.Repository.ID { - ctx.Status(http.StatusNotFound) - return - } - if !ctx.IsSigned || (ctx.Doer.ID != comment.PosterID && !ctx.Repo.CanWriteIssuesOrPulls(comment.Issue.IsPull)) { ctx.Status(http.StatusForbidden) return diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go index 3c00193fac..d4b268c009 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -208,6 +208,126 @@ func GetPullReviewComments(ctx *context.APIContext) { ctx.JSON(http.StatusOK, apiComments) } +// ResolvePullReviewComment resolves a review comment in a pull request +func ResolvePullReviewComment(ctx *context.APIContext) { + // swagger:operation POST /repos/{owner}/{repo}/pulls/comments/{id}/resolve repository repoResolvePullReviewComment + // --- + // summary: Resolve a pull request review comment + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true + // - name: id + // in: path + // description: id of the review comment + // type: integer + // format: int64 + // required: true + // responses: + // "204": + // "$ref": "#/responses/empty" + // "400": + // "$ref": "#/responses/validationError" + // "403": + // "$ref": "#/responses/forbidden" + // "404": + // "$ref": "#/responses/notFound" + updatePullReviewCommentResolve(ctx, true) +} + +// UnresolvePullReviewComment unresolves a review comment in a pull request +func UnresolvePullReviewComment(ctx *context.APIContext) { + // swagger:operation POST /repos/{owner}/{repo}/pulls/comments/{id}/unresolve repository repoUnresolvePullReviewComment + // --- + // summary: Unresolve a pull request review comment + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true + // - name: id + // in: path + // description: id of the review comment + // type: integer + // format: int64 + // required: true + // responses: + // "204": + // "$ref": "#/responses/empty" + // "400": + // "$ref": "#/responses/validationError" + // "403": + // "$ref": "#/responses/forbidden" + // "404": + // "$ref": "#/responses/notFound" + updatePullReviewCommentResolve(ctx, false) +} + +func updatePullReviewCommentResolve(ctx *context.APIContext, isResolve bool) { + comment := getPullReviewCommentToResolve(ctx) + if comment == nil { + return + } + + canMarkConv, err := issues_model.CanMarkConversation(ctx, comment.Issue, ctx.Doer) + if err != nil { + ctx.APIErrorInternal(err) + return + } + if !canMarkConv { + ctx.APIError(http.StatusForbidden, "user should have permission to resolve comment") + return + } + + if err = issues_model.MarkConversation(ctx, comment, ctx.Doer, isResolve); err != nil { + ctx.APIErrorInternal(err) + return + } + + ctx.Status(http.StatusNoContent) +} + +func getPullReviewCommentToResolve(ctx *context.APIContext) *issues_model.Comment { + comment, err := issues_model.GetCommentWithRepoID(ctx, ctx.Repo.Repository.ID, ctx.PathParamInt64("id")) + if err != nil { + if issues_model.IsErrCommentNotExist(err) { + ctx.APIErrorNotFound("GetCommentByID", err) + } else { + ctx.APIErrorInternal(err) + } + return nil + } + + if !comment.Issue.IsPull { + ctx.APIError(http.StatusBadRequest, "comment does not belong to a pull request") + return nil + } + + if comment.Type != issues_model.CommentTypeCode { + ctx.APIError(http.StatusBadRequest, "comment is not a review comment") + return nil + } + + return comment +} + // DeletePullReview delete a specific review from a pull request func DeletePullReview(ctx *context.APIContext) { // swagger:operation DELETE /repos/{owner}/{repo}/pulls/{index}/reviews/{id} repository repoDeletePullReview diff --git a/services/convert/pull_review.go b/services/convert/pull_review.go index 574f34fa17..ba0102cf1f 100644 --- a/services/convert/pull_review.go +++ b/services/convert/pull_review.go @@ -92,34 +92,40 @@ func ToPullReviewCommentList(ctx context.Context, review *issues_model.Review, d for _, lines := range review.CodeComments { for _, comments := range lines { for _, comment := range comments { - apiComment := &api.PullReviewComment{ - ID: comment.ID, - Body: comment.Content, - Poster: ToUser(ctx, comment.Poster, doer), - Resolver: ToUser(ctx, comment.ResolveDoer, doer), - ReviewID: review.ID, - Created: comment.CreatedUnix.AsTime(), - Updated: comment.UpdatedUnix.AsTime(), - Path: comment.TreePath, - CommitID: comment.CommitSHA, - OrigCommitID: comment.OldRef, - DiffHunk: patch2diff(comment.Patch), - HTMLURL: comment.HTMLURL(ctx), - HTMLPullURL: review.Issue.HTMLURL(ctx), - } - - if comment.Line < 0 { - apiComment.OldLineNum = comment.UnsignedLine() - } else { - apiComment.LineNum = comment.UnsignedLine() - } - apiComments = append(apiComments, apiComment) + apiComments = append(apiComments, ToPullReviewComment(ctx, comment, doer)) } } } return apiComments, nil } +// ToPullReviewComment convert a single code review comment to api format +func ToPullReviewComment(ctx context.Context, comment *issues_model.Comment, doer *user_model.User) *api.PullReviewComment { + apiComment := &api.PullReviewComment{ + ID: comment.ID, + Body: comment.Content, + Poster: ToUser(ctx, comment.Poster, doer), + Resolver: ToUser(ctx, comment.ResolveDoer, doer), + ReviewID: comment.ReviewID, + Created: comment.CreatedUnix.AsTime(), + Updated: comment.UpdatedUnix.AsTime(), + Path: comment.TreePath, + CommitID: comment.CommitSHA, + OrigCommitID: comment.OldRef, + DiffHunk: patch2diff(comment.Patch), + HTMLURL: comment.HTMLURL(ctx), + HTMLPullURL: comment.Issue.HTMLURL(ctx), + } + + if comment.Line < 0 { + apiComment.OldLineNum = comment.UnsignedLine() + } else { + apiComment.LineNum = comment.UnsignedLine() + } + + return apiComment +} + func patch2diff(patch string) string { split := strings.Split(patch, "\n@@") if len(split) == 2 { diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 6ed21e0451..45f4a84316 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -13707,6 +13707,106 @@ } } }, + "/repos/{owner}/{repo}/pulls/comments/{id}/resolve": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Resolve a pull request review comment", + "operationId": "repoResolvePullReviewComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the review comment", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "400": { + "$ref": "#/responses/validationError" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/comments/{id}/unresolve": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Unresolve a pull request review comment", + "operationId": "repoUnresolvePullReviewComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the review comment", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "400": { + "$ref": "#/responses/validationError" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, "/repos/{owner}/{repo}/pulls/pinned": { "get": { "produces": [ @@ -23536,7 +23636,7 @@ "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreatePullReviewOptions": { - "description": "CreatePullReviewOptions are options to create a pull review", + "description": "CreatePullReviewOptions are options to create a pull request review", "type": "object", "properties": { "body": { @@ -24133,7 +24233,7 @@ "x-go-package": "code.gitea.io/gitea/modules/structs" }, "DismissPullReviewOptions": { - "description": "DismissPullReviewOptions are options to dismiss a pull review", + "description": "DismissPullReviewOptions are options to dismiss a pull request review", "type": "object", "properties": { "message": { @@ -27645,7 +27745,7 @@ "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PullReviewRequestOptions": { - "description": "PullReviewRequestOptions are options to add or remove pull review requests", + "description": "PullReviewRequestOptions are options to add or remove pull request review requests", "type": "object", "properties": { "reviewers": { @@ -28389,7 +28489,7 @@ "x-go-package": "code.gitea.io/gitea/modules/structs" }, "SubmitPullReviewOptions": { - "description": "SubmitPullReviewOptions are options to submit a pending pull review", + "description": "SubmitPullReviewOptions are options to submit a pending pull request review", "type": "object", "properties": { "body": { diff --git a/tests/integration/api_pull_review_test.go b/tests/integration/api_pull_review_test.go index 9ffbd9a267..bdec278426 100644 --- a/tests/integration/api_pull_review_test.go +++ b/tests/integration/api_pull_review_test.go @@ -15,9 +15,11 @@ import ( repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/json" api "code.gitea.io/gitea/modules/structs" issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" @@ -362,6 +364,79 @@ func TestAPIPullReviewRequest(t *testing.T) { MakeRequest(t, req, http.StatusNoContent) } +func TestAPIPullReviewCommentResolveEndpoints(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + ctx := t.Context() + pullIssue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 3}) + require.NoError(t, pullIssue.LoadAttributes(ctx)) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: pullIssue.RepoID}) + + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: pullIssue.PosterID}) + require.NoError(t, pullIssue.LoadPullRequest(ctx)) + gitRepo, err := gitrepo.OpenRepository(ctx, repo) + require.NoError(t, err) + defer gitRepo.Close() + + latestCommitID, err := gitRepo.GetRefCommitID(pullIssue.PullRequest.GetGitHeadRefName()) + require.NoError(t, err) + + codeComment, err := pull_service.CreateCodeComment(ctx, doer, gitRepo, pullIssue, 1, "resolve comment", "README.md", false, 0, latestCommitID, nil) + require.NoError(t, err) + require.NotNil(t, codeComment) + + session := loginUser(t, doer.Name) + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) + + resolveURL := fmt.Sprintf("/api/v1/repos/%s/%s/pulls/comments/%d/resolve", repo.OwnerName, repo.Name, codeComment.ID) + unresolveURL := fmt.Sprintf("/api/v1/repos/%s/%s/pulls/comments/%d/unresolve", repo.OwnerName, repo.Name, codeComment.ID) + + req := NewRequest(t, http.MethodPost, resolveURL).AddTokenAuth(token) + MakeRequest(t, req, http.StatusNoContent) + + // Verify comment is resolved + updatedComment, err := issues_model.GetCommentByID(ctx, codeComment.ID) + require.NoError(t, err) + assert.NotZero(t, updatedComment.ResolveDoerID) + assert.Equal(t, doer.ID, updatedComment.ResolveDoerID) + + // Resolving again should be idempotent + MakeRequest(t, req, http.StatusNoContent) + + req = NewRequest(t, http.MethodPost, unresolveURL).AddTokenAuth(token) + MakeRequest(t, req, http.StatusNoContent) + + // Verify comment is unresolved + updatedComment, err = issues_model.GetCommentByID(ctx, codeComment.ID) + require.NoError(t, err) + assert.Zero(t, updatedComment.ResolveDoerID) + + // Unresolving again should be idempotent + MakeRequest(t, req, http.StatusNoContent) + + // Non-existing comment ID + req = NewRequest(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/comments/999999/resolve", repo.OwnerName, repo.Name)).AddTokenAuth(token) + MakeRequest(t, req, http.StatusNotFound) + + // Non-code-comment + plainComment, err := issue_service.CreateIssueComment(ctx, doer, repo, pullIssue, "not a review comment", nil) + require.NoError(t, err) + req = NewRequest(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/comments/%d/resolve", repo.OwnerName, repo.Name, plainComment.ID)).AddTokenAuth(token) + MakeRequest(t, req, http.StatusBadRequest) + + // Test permission check: use a user without write access for target repo to test 403 response + unauthorizedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}) + require.NotEqual(t, pullIssue.PosterID, unauthorizedUser.ID) + + unauthorizedSession := loginUser(t, unauthorizedUser.Name) + unauthorizedToken := getTokenForLoggedInUser(t, unauthorizedSession, auth_model.AccessTokenScopeWriteIssue, auth_model.AccessTokenScopeWriteRepository) + + req = NewRequest(t, http.MethodGet, fmt.Sprintf("/api/v1/repos/%s/%s/issues/comments/%d", repo.OwnerName, repo.Name, plainComment.ID)).AddTokenAuth(unauthorizedToken) + MakeRequest(t, req, http.StatusOK) + req = NewRequest(t, http.MethodPost, resolveURL).AddTokenAuth(unauthorizedToken) + MakeRequest(t, req, http.StatusForbidden) +} + func TestAPIPullReviewStayDismissed(t *testing.T) { // This test against issue https://github.com/go-gitea/gitea/issues/28542 // where old reviews surface after a review request got dismissed. From 7883f6dde9103c02915cf4ebe49b8373178083ee Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Feb 2026 01:00:34 +0800 Subject: [PATCH 8/8] Remove and forbid `@ts-expect-error` (#36513) Removes `@ts-expect-error` in the code base and forbids it. --------- Signed-off-by: wxiaoguang Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: silverwind <115237+silverwind@users.noreply.github.com> Co-authored-by: silverwind Co-authored-by: wxiaoguang --- eslint.config.ts | 9 +- tsconfig.json | 2 +- types.d.ts | 87 +++++++++++++++++++ web_src/js/bootstrap.ts | 5 +- web_src/js/components/RepoActionView.vue | 11 +-- .../js/components/RepoActivityTopAuthors.vue | 1 - .../js/components/RepoBranchTagSelector.vue | 7 +- web_src/js/components/RepoContributors.vue | 12 ++- web_src/js/components/RepoRecentCommits.vue | 4 +- web_src/js/features/captcha.ts | 1 - web_src/js/features/citation.ts | 4 - .../js/features/eventsource.sharedworker.ts | 5 +- web_src/js/features/repo-diff.ts | 3 +- web_src/js/features/repo-issue-list.ts | 2 +- web_src/js/features/repo-projects.ts | 4 +- .../features/repo-settings-branches.test.ts | 5 +- web_src/js/features/repo-settings-branches.ts | 2 +- web_src/js/features/tribute.ts | 79 ++++++++--------- web_src/js/globals.d.ts | 30 ------- web_src/js/markup/asciicast.ts | 3 +- web_src/js/modules/sortable.ts | 6 +- web_src/js/webcomponents/polyfills.ts | 5 +- 22 files changed, 170 insertions(+), 117 deletions(-) diff --git a/eslint.config.ts b/eslint.config.ts index 2f710bd936..8d5b435397 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -15,6 +15,7 @@ import vue from 'eslint-plugin-vue'; import vueScopedCss from 'eslint-plugin-vue-scoped-css'; import wc from 'eslint-plugin-wc'; import {defineConfig, globalIgnores} from 'eslint/config'; +import type {ESLint} from 'eslint'; const jsExts = ['js', 'mjs', 'cjs'] as const; const tsExts = ['ts', 'mts', 'cts'] as const; @@ -62,8 +63,7 @@ export default defineConfig([ '@stylistic': stylistic, '@typescript-eslint': typescriptPlugin.plugin, 'array-func': arrayFunc, - // @ts-expect-error -- https://github.com/un-ts/eslint-plugin-import-x/issues/203 - 'import-x': importPlugin, + 'import-x': importPlugin as unknown as ESLint.Plugin, // https://github.com/un-ts/eslint-plugin-import-x/issues/203 regexp, sonarjs, unicorn, @@ -156,7 +156,7 @@ export default defineConfig([ '@typescript-eslint/adjacent-overload-signatures': [0], '@typescript-eslint/array-type': [0], '@typescript-eslint/await-thenable': [2], - '@typescript-eslint/ban-ts-comment': [2, {'ts-expect-error': false, 'ts-ignore': true, 'ts-nocheck': false, 'ts-check': false}], + '@typescript-eslint/ban-ts-comment': [2, {'ts-expect-error': true, 'ts-ignore': true, 'ts-nocheck': false, 'ts-check': false}], '@typescript-eslint/ban-tslint-comment': [0], '@typescript-eslint/class-literal-property-style': [0], '@typescript-eslint/class-methods-use-this': [0], @@ -924,8 +924,7 @@ export default defineConfig([ }, extends: [ vue.configs['flat/recommended'], - // @ts-expect-error - vueScopedCss.configs['flat/recommended'], + vueScopedCss.configs['flat/recommended'] as any, ], rules: { 'vue/attributes-order': [0], diff --git a/tsconfig.json b/tsconfig.json index d2149a37bd..7b16df0196 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,7 @@ "target": "es2020", "module": "esnext", "moduleResolution": "bundler", - "lib": ["dom", "dom.iterable", "dom.asynciterable", "esnext"], + "lib": ["dom", "dom.iterable", "dom.asynciterable", "esnext", "webworker"], "allowImportingTsExtensions": true, "allowJs": true, "allowSyntheticDefaultImports": true, diff --git a/types.d.ts b/types.d.ts index ccce6c5554..59d6ecf149 100644 --- a/types.d.ts +++ b/types.d.ts @@ -2,18 +2,105 @@ declare module '@techknowlogick/license-checker-webpack-plugin' { const plugin: any; export = plugin; } + declare module 'eslint-plugin-no-use-extend-native' { import type {Eslint} from 'eslint'; const plugin: Eslint.Plugin; export = plugin; } + declare module 'eslint-plugin-array-func' { import type {Eslint} from 'eslint'; const plugin: Eslint.Plugin; export = plugin; } + declare module 'eslint-plugin-github' { import type {Eslint} from 'eslint'; const plugin: Eslint.Plugin; export = plugin; } + +declare module '*.svg' { + const value: string; + export default value; +} + +declare module '*.css' { + const value: string; + export default value; +} + +declare module '*.vue' { + import type {DefineComponent} from 'vue'; + const component: DefineComponent; + export default component; + // Here we declare all exports from vue files so `tsc` or `tsgo` can work for + // non-vue files. To lint .vue files, `vue-tsc` must be used. + export function initDashboardRepoList(): void; + export function initRepositoryActionView(): void; +} + +declare module 'htmx.org/dist/htmx.esm.js' { + const value = await import('htmx.org'); + export default value; +} + +declare module 'swagger-ui-dist/swagger-ui-es-bundle.js' { + const value = await import('swagger-ui-dist'); + export default value.SwaggerUIBundle; +} + +declare module 'asciinema-player' { + interface AsciinemaPlayer { + create(src: string, element: HTMLElement, options?: Record): void; + } + const exports: AsciinemaPlayer; + export = exports; +} + +declare module '@citation-js/core' { + export class Cite { + constructor(data: string); + format(format: string, options?: Record): string; + } + export const plugins: { + config: { + get(name: string): any; + }; + }; +} + +declare module '@citation-js/plugin-software-formats' {} +declare module '@citation-js/plugin-bibtex' {} +declare module '@citation-js/plugin-csl' {} + +declare module 'vue-bar-graph' { + import type {DefineComponent} from 'vue'; + + interface BarGraphPoint { + value: number; + label: string; + } + + export const VueBarGraph: DefineComponent<{ + points?: Array; + barColor?: string; + textColor?: string; + textAltColor?: string; + height?: number; + labelHeight?: number; + }>; +} + +declare module '@mcaptcha/vanilla-glue' { + export let INPUT_NAME: string; + export default class Widget { + constructor(options: { + siteKey: { + instanceUrl: URL; + key: string; + }; + }); + } +} diff --git a/web_src/js/bootstrap.ts b/web_src/js/bootstrap.ts index 9d30e9ea52..adad927af6 100644 --- a/web_src/js/bootstrap.ts +++ b/web_src/js/bootstrap.ts @@ -80,13 +80,12 @@ function initGlobalErrorHandler() { // we added an event handler for window error at the very beginning of