diff --git a/Makefile b/Makefile index 1dca80453c..49474b0c5c 100644 --- a/Makefile +++ b/Makefile @@ -317,11 +317,13 @@ lint-backend-fix: lint-go-fix lint-go-gitea-vet lint-editorconfig ## lint backen lint-js: node_modules ## lint js 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 $(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 new file mode 100644 index 0000000000..3f63cbc775 --- /dev/null +++ b/knip.config.ts @@ -0,0 +1,18 @@ +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 d121eeeda9..b9ede1ea09 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "globals": "17.1.0", "happy-dom": "20.3.7", "jiti": "2.6.1", + "knip": "5.82.1", "markdownlint-cli": "0.47.0", "material-icon-theme": "5.31.0", "nolyfill": "1.0.44", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1479aac1f7..29a6dcbd70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -297,6 +297,9 @@ importers: 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 @@ -810,6 +813,9 @@ 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'} @@ -885,6 +891,106 @@ 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] + + '@oxc-resolver/binding-linux-arm64-musl@11.16.4': + resolution: {integrity: sha512-wEXSaEaYxGGoVSbw0i2etjDDWcqErKr8xSkTdwATP798efsZmodUAcLYJhN0Nd4W35Oq6qAvFGHpKwFrrhpTrA==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.16.4': + resolution: {integrity: sha512-CUFOlpb07DVOFLoYiaTfbSBRPIhNgwc/MtlYeg3p6GJJw+kEm/vzc9lohPSjzF2MLPB5hzsJdk+L/GjrTT3UPw==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.16.4': + resolution: {integrity: sha512-d8It4AH8cN9ReK1hW6ZO4x3rMT0hB2LYH0RNidGogV9xtnjLRU+Y3MrCeClLyOSGCibmweJJAjnwB7AQ31GEhg==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.16.4': + resolution: {integrity: sha512-d09dOww9iKyEHSxuOQ/Iu2aYswl0j7ExBcyy14D6lJ5ijQSP9FXcJYJsJ3yvzboO/PDEFjvRuF41f8O1skiPVg==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.16.4': + resolution: {integrity: sha512-lhjyGmUzTWHduZF3MkdUSEPMRIdExnhsqv8u1upX3A15epVn6YVwv4msFQPJl1x1wszkACPeDHGOtzHsITXGdw==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.16.4': + resolution: {integrity: sha512-ZtqqiI5rzlrYBm/IMMDIg3zvvVj4WO/90Dg/zX+iA8lWaLN7K5nroXb17MQ4WhI5RqlEAgrnYDXW+hok1D9Kaw==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.16.4': + resolution: {integrity: sha512-LM424h7aaKcMlqHnQWgTzO+GRNLyjcNnMpqm8SygEtFRVW693XS+XGXYvjORlmJtsyjo84ej1FMb3U2HE5eyjg==} + cpu: [x64] + os: [linux] + + '@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} @@ -2581,6 +2687,9 @@ 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'} @@ -2633,6 +2742,11 @@ 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==} @@ -2979,6 +3093,14 @@ 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==} @@ -3324,6 +3446,9 @@ 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'} @@ -3726,6 +3851,10 @@ 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==} @@ -3828,6 +3957,10 @@ 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==} @@ -4226,6 +4359,10 @@ 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'} @@ -4342,6 +4479,9 @@ 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': {} @@ -4733,6 +4873,13 @@ 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 @@ -4797,6 +4944,68 @@ 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': @@ -6608,6 +6817,10 @@ 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 @@ -6659,6 +6872,10 @@ 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: @@ -6943,6 +7160,23 @@ 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: @@ -7392,6 +7626,29 @@ 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 @@ -7772,6 +8029,8 @@ snapshots: smol-toml@1.5.2: {} + smol-toml@1.6.0: {} + solid-js@1.9.11: dependencies: csstype: 3.2.3 @@ -7872,6 +8131,8 @@ 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)): @@ -8318,6 +8579,8 @@ snapshots: optionalDependencies: typescript: 5.9.3 + walk-up-path@4.0.0: {} + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 @@ -8448,3 +8711,5 @@ snapshots: yaml@2.8.2: {} yocto-queue@0.1.0: {} + + zod@4.3.6: {} diff --git a/templates/base/head_script.tmpl b/templates/base/head_script.tmpl index 9d7173f289..9eb6b77f0f 100644 --- a/templates/base/head_script.tmpl +++ b/templates/base/head_script.tmpl @@ -28,6 +28,8 @@ If you introduce mistakes in it, Gitea JavaScript code wouldn't run correctly. ['{{$.MentionableTeamsOrg}}/{{.Name}}', {key: '{{$.MentionableTeamsOrg}}/{{.Name}}', value: '{{$.MentionableTeamsOrg}}/{{.Name}}', name: '{{$.MentionableTeamsOrg}}/{{.Name}}', avatar: '{{$.MentionableTeamsOrgAvatar}}'}], {{- end -}} ]).values()), + {{else}} + mentionValues: [], {{end}} mermaidMaxSourceCharacters: {{MermaidMaxSourceCharacters}}, {{/* this global i18n object should only contain general texts. for specialized texts, it should be provided inside the related modules by: (1) API response (2) HTML data-attribute (3) PageData */}} diff --git a/web_src/js/features/tribute.ts b/web_src/js/features/tribute.ts index 43c21ebe6d..b302046474 100644 --- a/web_src/js/features/tribute.ts +++ b/web_src/js/features/tribute.ts @@ -29,7 +29,7 @@ export async function attachTribute(element: HTMLElement) { return html`
${htmlRaw(emojiHTML(item.original))}${item.original}
`; }, }, { // mentions - values: window.config.mentionValues ?? [], + values: window.config.mentionValues, requireLeadingSpace: true, menuItemTemplate: (item: TributeItem) => { const fullNameHtml = item.original.fullname && item.original.fullname !== '' ? html`${item.original.fullname}` : ''; diff --git a/web_src/js/globals.d.ts b/web_src/js/globals.d.ts index c0ee81af0b..9770f639a7 100644 --- a/web_src/js/globals.d.ts +++ b/web_src/js/globals.d.ts @@ -49,7 +49,26 @@ interface Element { } interface Window { - config: import('./web_src/js/types.ts').Config; + config: { + appUrl: string, + appSubUrl: string, + assetVersionEncoded: string, + assetUrlPrefix: string, + runModeIsProd: boolean, + customEmojis: Record, + pageData: Record, + notificationSettings: Record, + enableTimeTracking: boolean, + mentionValues: Array<{ + key: string, + value: string, + name: string, + fullname: string, + avatar: string, + }>, + mermaidMaxSourceCharacters: number, + i18n: Record, + }, $: typeof import('@types/jquery'), jQuery: typeof import('@types/jquery'), htmx: typeof import('htmx.org').default, diff --git a/web_src/js/markup/refissue.ts b/web_src/js/markup/refissue.ts index 30d8924a1d..ff6fdd624f 100644 --- a/web_src/js/markup/refissue.ts +++ b/web_src/js/markup/refissue.ts @@ -11,7 +11,7 @@ export function initMarkupRefIssue(el: HTMLElement) { }); } -export function showMarkupRefIssuePopup(e: MouseEvent | FocusEvent) { +function showMarkupRefIssuePopup(e: MouseEvent | FocusEvent) { const refIssue = e.currentTarget as HTMLElement; if (getAttachedTippyInstance(refIssue)) return; if (refIssue.classList.contains('ref-external-issue')) return; diff --git a/web_src/js/markup/render-iframe.ts b/web_src/js/markup/render-iframe.ts index 35649ee2ee..1bd6b3233f 100644 --- a/web_src/js/markup/render-iframe.ts +++ b/web_src/js/markup/render-iframe.ts @@ -1,7 +1,7 @@ import {generateElemId, queryElemChildren} from '../utils/dom.ts'; import {isDarkTheme} from '../utils.ts'; -export async function loadRenderIframeContent(iframe: HTMLIFrameElement) { +async function loadRenderIframeContent(iframe: HTMLIFrameElement) { const iframeSrcUrl = iframe.getAttribute('data-src')!; if (!iframe.id) iframe.id = generateElemId('gitea-iframe-'); diff --git a/web_src/js/modules/fomantic/dropdown.ts b/web_src/js/modules/fomantic/dropdown.ts index e13596d784..79ca60d347 100644 --- a/web_src/js/modules/fomantic/dropdown.ts +++ b/web_src/js/modules/fomantic/dropdown.ts @@ -65,7 +65,7 @@ function updateSelectionLabel(label: HTMLElement) { const deleteIcon = label.querySelector('.delete.icon'); if (deleteIcon) { deleteIcon.setAttribute('aria-hidden', 'false'); - deleteIcon.setAttribute('aria-label', window.config.i18n.remove_label_str.replace('%s', label.getAttribute('data-value'))); + deleteIcon.setAttribute('aria-label', window.config.i18n.remove_label_str.replace('%s', label.getAttribute('data-value')!)); deleteIcon.setAttribute('role', 'button'); } } diff --git a/web_src/js/types.ts b/web_src/js/types.ts index 6900b18e62..56527729a1 100644 --- a/web_src/js/types.ts +++ b/web_src/js/types.ts @@ -1,26 +1,3 @@ -export type MentionValue = { - key: string, - value: string, - name: string, - fullname: string, - avatar: string, -}; - -export type Config = { - appUrl: string, - appSubUrl: string, - assetVersionEncoded: string, - assetUrlPrefix: string, - runModeIsProd: boolean, - customEmojis: Record, - pageData: Record, - notificationSettings: Record, - enableTimeTracking: boolean, - mentionValues?: MentionValue[], - mermaidMaxSourceCharacters: number, - i18n: Record, -}; - export type IntervalId = ReturnType; export type Intent = 'error' | 'warning' | 'info'; diff --git a/web_src/js/utils/match.ts b/web_src/js/utils/match.ts index af669116a2..9d2a1b72fc 100644 --- a/web_src/js/utils/match.ts +++ b/web_src/js/utils/match.ts @@ -35,7 +35,7 @@ export function matchMention(queryText: string): MentionSuggestion[] { // results is a map of weights, lower is better const results = new Map(); - for (const obj of window.config.mentionValues ?? []) { + for (const obj of window.config.mentionValues) { const index = obj.key.toLowerCase().indexOf(query); if (index === -1) continue; const existing = results.get(obj); diff --git a/webpack.config.ts b/webpack.config.ts index 568c85d8d2..6902d182d7 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -4,7 +4,7 @@ import LicenseCheckerWebpackPlugin from '@techknowlogick/license-checker-webpack import MiniCssExtractPlugin from 'mini-css-extract-plugin'; import MonacoWebpackPlugin from 'monaco-editor-webpack-plugin'; import {VueLoaderPlugin} from 'vue-loader'; -import EsBuildLoader from 'esbuild-loader'; +import {EsbuildPlugin} from 'esbuild-loader'; import {parse} from 'node:path'; import webpack, {type Configuration, type EntryObject} from 'webpack'; import {fileURLToPath} from 'node:url'; @@ -13,7 +13,6 @@ import {env} from 'node:process'; import tailwindcss from 'tailwindcss'; import tailwindConfig from './tailwind.config.ts'; -const {EsbuildPlugin} = EsBuildLoader; const {SourceMapDevToolPlugin, DefinePlugin, EnvironmentPlugin} = webpack; const formatLicenseText = (licenseText: string) => wrapAnsi(licenseText || '', 80).trim();