diff --git a/Tekst-API/openapi.json b/Tekst-API/openapi.json index 852f9087..67344294 100644 --- a/Tekst-API/openapi.json +++ b/Tekst-API/openapi.json @@ -12863,14 +12863,7 @@ "$ref": "#/components/schemas/TranslationLocaleKey" }, "translation": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], + "type": "string", "title": "Translation" } }, diff --git a/Tekst-API/tekst/models/text.py b/Tekst-API/tekst/models/text.py index 903f99dc..27dbc680 100644 --- a/Tekst-API/tekst/models/text.py +++ b/Tekst-API/tekst/models/text.py @@ -49,11 +49,11 @@ class TextLevelTranslation(TranslationBase): class ResourceCategoryTranslation(TranslationBase): translation: Annotated[ - str | None, + str, StringConstraints( strip_whitespace=True, ), - ] = None + ] class ResourceCategory(TypedDict): diff --git a/Tekst-Web/.editorconfig b/Tekst-Web/.editorconfig index dda51c64..2711b730 100644 --- a/Tekst-Web/.editorconfig +++ b/Tekst-Web/.editorconfig @@ -11,6 +11,8 @@ indent_size = 4 [*.md] trim_trailing_whitespace = false -[*.{js,ts,json,yml,vue,css}] -indent_style = space +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,json,yml,css}] indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/Tekst-Web/.eslintrc.cjs b/Tekst-Web/.eslintrc.cjs deleted file mode 100644 index 1686d12a..00000000 --- a/Tekst-Web/.eslintrc.cjs +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-env node */ -require('@rushstack/eslint-patch/modern-module-resolution'); - -module.exports = { - root: true, - extends: [ - 'plugin:vue/vue3-recommended', - 'plugin:@intlify/vue-i18n/recommended', - 'eslint:recommended', - '@vue/eslint-config-typescript', - '@vue/eslint-config-prettier', - ], - overrides: [], - parserOptions: { - ecmaVersion: 'latest', - }, - rules: { - '@intlify/vue-i18n/no-raw-text': 'off', - '@intlify/vue-i18n/no-unused-keys': [ - 'error', - { - extensions: ['.js', '.vue'], - }, - ], - }, - settings: { - 'vue-i18n': { - localeDir: { - pattern: './translations/ui/*.{json,json5,yaml,yml}', // extension is glob formatting! - localeKey: 'file', // or 'path' or 'key' - }, - // Specify the version of `vue-i18n` you are using. - // If not specified, the message will be parsed twice. - messageSyntaxVersion: '^9.3.0', - }, - }, -}; diff --git a/Tekst-Web/Taskfile.yml b/Tekst-Web/Taskfile.yml index 715a1c94..2b250399 100644 --- a/Tekst-Web/Taskfile.yml +++ b/Tekst-Web/Taskfile.yml @@ -1,5 +1,3 @@ -# https://taskfile.dev - version: '3' tasks: diff --git a/Tekst-Web/eslint.config.js b/Tekst-Web/eslint.config.js new file mode 100644 index 00000000..3690ae06 --- /dev/null +++ b/Tekst-Web/eslint.config.js @@ -0,0 +1,52 @@ +import pluginVue from 'eslint-plugin-vue'; +import vueTsEslintConfig from '@vue/eslint-config-typescript'; +import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'; +import vueI18n from '@intlify/eslint-plugin-vue-i18n'; + +export default [ + { + name: 'app/files-to-lint', + files: ['**/*.{ts,mts,tsx,vue,js,jsx,cjs,mjs,cts}'], + }, + + { + name: 'app/files-to-ignore', + ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**', 'translations/**', 'Taskfile.yml'], + }, + + ...vueI18n.configs['flat/recommended'], + { + rules: { + '@intlify/vue-i18n/no-raw-text': 'off', + '@intlify/vue-i18n/no-unused-keys': [ + 'error', + { + extensions: ['.ts', '.js', '.vue'], + }, + ], + }, + settings: { + 'vue-i18n': { + localeDir: { + pattern: './translations/ui/*.yml', // extension is glob formatting! + localeKey: 'file', // or 'path' or 'key' + }, + // Specify the version of `vue-i18n` you are using. + // If not specified, the message will be parsed twice. + messageSyntaxVersion: '^10.0.1', + }, + }, + }, + + ...pluginVue.configs['flat/essential'], + ...vueTsEslintConfig(), + skipFormatting, + + { + files: ['**/*.json'], + rules: { + // Turn off rules + '@typescript-eslint/no-unused-expressions': 'off', + }, + }, +]; diff --git a/Tekst-Web/package-lock.json b/Tekst-Web/package-lock.json index b4fa635e..72b3c805 100644 --- a/Tekst-Web/package-lock.json +++ b/Tekst-Web/package-lock.json @@ -41,11 +41,11 @@ "@types/node": "^20.11.10", "@vicons/material": "^0.12.0", "@vitejs/plugin-vue": "^5.1.4", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^13.0.0", + "@vue/eslint-config-prettier": "^10.0.0", + "@vue/eslint-config-typescript": "^14.0.1", "@vue/tsconfig": "^0.5.1", - "eslint": "^8.56.0", - "eslint-plugin-vue": "^9.28.0", + "eslint": "^9.12.0", + "eslint-plugin-vue": "^9.29.0", "marked": "^14.1.2", "naive-ui": "^2.39.0", "npm-run-all2": "^6.2.3", @@ -53,8 +53,8 @@ "prettier": "^3.3.3", "rollup-plugin-visualizer": "^5.12.0", "start-server-and-test": "^2.0.8", - "typescript": "~5.3.0", - "vite": "^5.4.6", + "typescript": "~5.5.4", + "vite": "^5.4.8", "vue-tsc": "^2.1.6" } }, @@ -185,12 +185,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -213,9 +213,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.7", @@ -670,6 +670,31 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", @@ -708,13 +733,36 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@hapi/hoek": { @@ -734,20 +782,28 @@ "@hapi/hoek": "^9.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -764,13 +820,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "license": "BSD-3-Clause" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@intlify/bundle-utils": { "version": "9.0.0-beta.0", @@ -960,9 +1022,9 @@ } }, "node_modules/@intlify/vue-i18n-extensions/node_modules/@intlify/shared": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.3.tgz", - "integrity": "sha512-PWxrCb6fDlnoGLnXLlWu6d7o/HdWACB9TjRnpLro+9uyfqgWA9hvqg5vekcPRyraTieV5srCbTk/ldYw9V3LHw==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.4.tgz", + "integrity": "sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==", "dev": true, "license": "MIT", "engines": { @@ -990,35 +1052,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -1136,9 +1169,9 @@ "license": "MIT" }, "node_modules/@redocly/openapi-core": { - "version": "1.25.5", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.25.5.tgz", - "integrity": "sha512-BNgXjqesJu4L5f8F73c2hkkH5IdvjYCKYFgIl+m9oNgqGRIPBJjtiEGOx7jkQ6nElN4311z7Z4aTECtklaaHwg==", + "version": "1.25.7", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.25.7.tgz", + "integrity": "sha512-qidGKk4Bq0Ud0O8gRuXnDSLwVopwrf5+roNvpkvdQPVIHFSYJ5dscJkThdsn7OW8bNqahumQPWWczEh9l93FZw==", "dev": true, "license": "MIT", "dependencies": { @@ -1956,6 +1989,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/katex": { "version": "0.16.7", "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", @@ -1970,9 +2010,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-jzqWo/uQP/iqeGGTjhgFp2yaCrCYTauASQcpdzESNCkHjSprBJVcZP9KG9aQ0q+xcsXiKd/iuw/4dLjS3Odc7Q==", "dev": true, "license": "MIT" }, @@ -2023,9 +2063,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.16.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", - "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", + "version": "20.16.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.12.tgz", + "integrity": "sha512-LfPFB0zOeCeCNQV3i+67rcoVvoN5n0NVuR2vLG0O5ySQMgchuZlC4lgz546ZOJyDtj5KIgOxy+lacOimfqZAIA==", "dev": true, "license": "MIT", "dependencies": { @@ -2039,32 +2079,32 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.10.0.tgz", + "integrity": "sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/type-utils": "8.10.0", + "@typescript-eslint/utils": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -2072,28 +2112,78 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz", + "integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", + "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", + "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.10.0.tgz", + "integrity": "sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -2101,6 +2191,111 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz", + "integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", + "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz", + "integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", + "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", @@ -2120,26 +2315,66 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.10.0.tgz", + "integrity": "sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/utils": "8.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", + "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz", + "integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { @@ -2147,6 +2382,50 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", + "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/types": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", @@ -2217,26 +2496,131 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz", + "integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", + "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz", + "integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", + "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/visitor-keys": { @@ -2257,13 +2641,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "license": "ISC" - }, "node_modules/@vicons/material": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@vicons/material/-/material-0.12.0.tgz", @@ -2286,68 +2663,68 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.5.tgz", - "integrity": "sha512-F4tA0DCO5Q1F5mScHmca0umsi2ufKULAnMOVBfMsZdT4myhVl4WdKRwCaKcfOkIEuyrAVvtq1ESBdZ+rSyLVww==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.6.tgz", + "integrity": "sha512-FxUfxaB8sCqvY46YjyAAV6c3mMIq/NWQMVvJ+uS4yxr1KzOvyg61gAuOnNvgCvO4TZ7HcLExBEsWcDu4+K4E8A==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.5" + "@volar/source-map": "2.4.6" } }, "node_modules/@volar/source-map": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.5.tgz", - "integrity": "sha512-varwD7RaKE2J/Z+Zu6j3mNNJbNT394qIxXwdvz/4ao/vxOfyClZpSDtLKkwWmecinkOVos5+PWkWraelfMLfpw==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.6.tgz", + "integrity": "sha512-Nsh7UW2ruK+uURIPzjJgF0YRGP5CX9nQHypA2OMqdM2FKy7rh+uv3XgPnWPw30JADbKvZ5HuBzG4gSbVDYVtiw==", "dev": true, "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.5.tgz", - "integrity": "sha512-mcT1mHvLljAEtHviVcBuOyAwwMKz1ibXTi5uYtP/pf4XxoAzpdkQ+Br2IC0NPCvLCbjPZmbf3I0udndkfB1CDg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.6.tgz", + "integrity": "sha512-NMIrA7y5OOqddL9VtngPWYmdQU03htNKFtAYidbYfWA0TOhyGVd9tfcP4TsLWQ+RBWDZCbBqsr8xzU0ZOxYTCQ==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.5", + "@volar/language-core": "2.4.6", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.11.tgz", - "integrity": "sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", + "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.11", + "@vue/shared": "3.5.12", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz", - "integrity": "sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", + "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-core": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz", - "integrity": "sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", + "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.11", - "@vue/compiler-dom": "3.5.11", - "@vue/compiler-ssr": "3.5.11", - "@vue/shared": "3.5.11", + "@vue/compiler-core": "3.5.12", + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.47", @@ -2355,13 +2732,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz", - "integrity": "sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", + "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-dom": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/compiler-vue2": { @@ -2382,38 +2759,39 @@ "license": "MIT" }, "node_modules/@vue/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.0.0.tgz", + "integrity": "sha512-iDEjsfT+UXQTJfe+4mstb/B5BSZ5RpL6FO3F97XxElIXdD04gkH+F7PR4fBMEVyJi4892G4LQVPQ8oXxVyp8Dw==", "dev": true, "license": "MIT", "dependencies": { - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0" + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1" }, "peerDependencies": { - "eslint": ">= 8.0.0", + "eslint": ">= 8.21.0", "prettier": ">= 3.0.0" } }, "node_modules/@vue/eslint-config-typescript": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", - "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.1.1.tgz", + "integrity": "sha512-zw6q8pXUuFHfdZsdKYr344giBRhnq6WmWSO2abFHajxR8wDX2p2hkj0/Mf6W2phTkerU4b8WF2jgq2Z/c+PdMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "^7.1.1", - "@typescript-eslint/parser": "^7.1.1", - "vue-eslint-parser": "^9.3.1" + "@typescript-eslint/eslint-plugin": "^8.8.1", + "fast-glob": "^3.3.2", + "typescript-eslint": "^8.8.1", + "vue-eslint-parser": "^9.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^8.56.0", - "eslint-plugin-vue": "^9.0.0", - "typescript": ">=4.7.4" + "eslint": "^9.10.0", + "eslint-plugin-vue": "^9.28.0", + "typescript": ">=4.8.4" }, "peerDependenciesMeta": { "typescript": { @@ -2473,53 +2851,53 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.11.tgz", - "integrity": "sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz", + "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.11" + "@vue/shared": "3.5.12" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.11.tgz", - "integrity": "sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz", + "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/reactivity": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.11.tgz", - "integrity": "sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz", + "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.11", - "@vue/runtime-core": "3.5.11", - "@vue/shared": "3.5.11", + "@vue/reactivity": "3.5.12", + "@vue/runtime-core": "3.5.12", + "@vue/shared": "3.5.12", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.11.tgz", - "integrity": "sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz", + "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12" }, "peerDependencies": { - "vue": "3.5.11" + "vue": "3.5.12" } }, "node_modules/@vue/shared": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.11.tgz", - "integrity": "sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", + "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", "license": "MIT" }, "node_modules/@vue/tsconfig": { @@ -2618,9 +2996,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "dev": true, "license": "MIT", "bin": { @@ -2681,13 +3059,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -2859,6 +3240,16 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2881,6 +3272,19 @@ "node": ">=8" } }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -2975,9 +3379,9 @@ "license": "MIT" }, "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "dev": true, "license": "MIT" }, @@ -3125,19 +3529,6 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -3255,59 +3646,64 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-compat-utils": { @@ -3371,9 +3767,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz", - "integrity": "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.29.0.tgz", + "integrity": "sha512-hamyjrBhNH6Li6R1h1VF9KHfshJlKgKEg3ARbGTn72CMNDSMhWbgC7NdkRDEh25AFW+4SDATzyNM+3gWuZii8g==", "dev": true, "license": "MIT", "dependencies": { @@ -3409,10 +3805,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-plugin-vue/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3420,7 +3829,7 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3431,49 +3840,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3481,20 +3848,17 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { @@ -3717,16 +4081,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -3760,18 +4124,17 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { @@ -3820,9 +4183,9 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, "license": "MIT", "dependencies": { @@ -3841,13 +4204,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -3947,9 +4303,9 @@ } }, "node_modules/globals": { - "version": "15.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.10.0.tgz", - "integrity": "sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", "dev": true, "license": "MIT", "engines": { @@ -4091,25 +4447,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -4185,16 +4522,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -4497,9 +4824,9 @@ "license": "ISC" }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -4529,9 +4856,9 @@ } }, "node_modules/marked": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.2.tgz", - "integrity": "sha512-f3r0yqpz31VXiDB/wj9GaOB0a2PRLQl6vJmXiFrniNwjkKdvakqJRULhjFKJpxOchlCRiG5fcacoUZY5Xa6PEQ==", + "version": "14.1.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.3.tgz", + "integrity": "sha512-ZibJqTULGlt9g5k4VMARAktMAjXoVnnr+Y3aCqW1oDftcV4BA3UmrBifzXoZyenHRk75csiPu9iwsTj4VNBT0g==", "dev": true, "license": "MIT", "bin": { @@ -4654,16 +4981,16 @@ } }, "node_modules/mlly": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz", + "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.12.1", "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" + "pkg-types": "^1.2.0", + "ufo": "^1.5.4" } }, "node_modules/ms": { @@ -4774,9 +5101,9 @@ } }, "node_modules/npm-run-all2": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.3.tgz", - "integrity": "sha512-5RsxC7jEc/RjxOYBVdEfrJf5FsJ0pHA7jr2/OxrThXknajETCTYjigOCG3iaGjdYIKEQlDuCG0ir0T1HTva8pg==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.4.tgz", + "integrity": "sha512-h/v0JWs0P12iR076jL0iTi4JzZVaJPnwse2+s4XzaIxwjtybQbQM2kg/Wd7Lxi0iEOXy3ZX2tLPNbm3MqzIFqw==", "dev": true, "license": "MIT", "dependencies": { @@ -4786,7 +5113,8 @@ "minimatch": "^9.0.0", "pidtree": "^0.6.0", "read-package-json-fast": "^3.0.2", - "shell-quote": "^1.7.3" + "shell-quote": "^1.7.3", + "which": "^3.0.1" }, "bin": { "npm-run-all": "bin/npm-run-all/index.js", @@ -4838,6 +5166,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/npm-run-all2/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -4864,16 +5208,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -5051,27 +5385,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-json/node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -5094,16 +5415,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -5162,9 +5473,9 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { @@ -5246,14 +5557,14 @@ } }, "node_modules/pkg-types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", - "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", + "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", + "confbox": "^0.1.8", + "mlly": "^1.7.2", "pathe": "^1.1.2" } }, @@ -5367,14 +5678,14 @@ } }, "node_modules/prosemirror-commands": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.0.tgz", - "integrity": "sha512-xn1U/g36OqXn2tn5nGmvnnimAj/g1pUx2ypJJIe8WkVX83WyJVC5LTARaxZa2AtQRwntu9Jc5zXs9gL9svp/mg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.1.tgz", + "integrity": "sha512-tNy4uaGWzvuUYXDke7B28krndIrdQJhSh0OLpubtwtEwFbjItOj/eoAfPvstBJyyV0S2+b5t4G+4XPXdxar6pg==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "prosemirror-transform": "^1.10.2" } }, "node_modules/prosemirror-dropcursor": { @@ -5456,9 +5767,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.22.3.tgz", - "integrity": "sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.23.0.tgz", + "integrity": "sha512-Q/fgsgl/dlOAW9ILu4OOhYWQbc7TQd4BwKH/RwmUjyVf8682Be4zj3rOYdLnYEcGzyg8LL9Q5IWYKD8tdToreQ==", "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" @@ -5524,9 +5835,9 @@ } }, "node_modules/prosemirror-transform": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.0.tgz", - "integrity": "sha512-9UOgFSgN6Gj2ekQH5CTDJ8Rp/fnKR2IkYfGdzzp5zQMFsS4zDllLVx/+jGcX86YlACpG7UR5fwAXiWzxqWtBTg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", + "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.21.0" @@ -5668,45 +5979,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", @@ -5821,9 +6093,9 @@ } }, "node_modules/seemly": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.8.tgz", - "integrity": "sha512-MW8Qs6vbzo0pHmDpFSYPna+lwpZ6Zk1ancbajw/7E8TKtHdV+1DfZZD+kKJEhG/cAoB/i+LiT+5msZOqj0DwRA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.9.tgz", + "integrity": "sha512-bMLcaEqhIViiPbaumjLN8t1y+JpD/N8SiyYOyp0i0W6RgdyLWboIsUWAbZojF//JyerxPZR5Tgda+x3Pdne75A==", "dev": true, "license": "MIT" }, @@ -6007,6 +6279,16 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6014,20 +6296,20 @@ "dev": true, "license": "MIT" }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", @@ -6043,7 +6325,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -6056,16 +6339,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6107,9 +6386,9 @@ } }, "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, "license": "MIT", "dependencies": { @@ -6196,9 +6475,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", "dev": true, "license": "0BSD" }, @@ -6216,22 +6495,22 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -6242,6 +6521,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.10.0.tgz", + "integrity": "sha512-YIu230PeN7z9zpu/EtqCIuRVHPs4iSlqW6TEvjbyDAE3MZsSl2RXBo+5ag+lbABCG8sFM1WVKEXhlQ8Ml8A3Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.10.0", + "@typescript-eslint/parser": "8.10.0", + "@typescript-eslint/utils": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -6322,9 +6625,9 @@ } }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dev": true, "license": "MIT", "dependencies": { @@ -6402,16 +6705,16 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.11.tgz", - "integrity": "sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz", + "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.11", - "@vue/compiler-sfc": "3.5.11", - "@vue/runtime-dom": "3.5.11", - "@vue/server-renderer": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-sfc": "3.5.12", + "@vue/runtime-dom": "3.5.12", + "@vue/server-renderer": "3.5.12", + "@vue/shared": "3.5.12" }, "peerDependencies": { "typescript": "*" @@ -6447,6 +6750,23 @@ "eslint": ">=6.0.0" } }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/vue-eslint-parser/node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -6695,6 +7015,16 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6717,17 +7047,17 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -6743,29 +7073,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -6787,9 +7094,9 @@ } }, "node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", "dev": true, "license": "ISC", "bin": { @@ -6853,6 +7160,16 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6875,6 +7192,19 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/Tekst-Web/package.json b/Tekst-Web/package.json index 891eabe9..cf836769 100644 --- a/Tekst-Web/package.json +++ b/Tekst-Web/package.json @@ -7,7 +7,7 @@ "api-schema": "node scripts/schemaTransform.mjs; eslint src/api/schema.d.ts --fix", "help-texts": "node scripts/parseHelpTexts.mjs; eslint src/assets/help/index.ts --fix", "type-check": "vue-tsc --build --force", - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "lint": "eslint . --fix", "format": "prettier --write src/", "prepare": "run-p help-texts", "prebuild": "run-s prepare", @@ -50,11 +50,11 @@ "@types/node": "^20.11.10", "@vicons/material": "^0.12.0", "@vitejs/plugin-vue": "^5.1.4", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^13.0.0", + "@vue/eslint-config-prettier": "^10.0.0", + "@vue/eslint-config-typescript": "^14.0.1", "@vue/tsconfig": "^0.5.1", - "eslint": "^8.56.0", - "eslint-plugin-vue": "^9.28.0", + "eslint": "^9.12.0", + "eslint-plugin-vue": "^9.29.0", "marked": "^14.1.2", "naive-ui": "^2.39.0", "npm-run-all2": "^6.2.3", @@ -62,8 +62,8 @@ "prettier": "^3.3.3", "rollup-plugin-visualizer": "^5.12.0", "start-server-and-test": "^2.0.8", - "typescript": "~5.3.0", - "vite": "^5.4.6", + "typescript": "~5.5.4", + "vite": "^5.4.8", "vue-tsc": "^2.1.6" } } diff --git a/Tekst-Web/src/api/index.ts b/Tekst-Web/src/api/index.ts index 3f698377..903af139 100644 --- a/Tekst-Web/src/api/index.ts +++ b/Tekst-Web/src/api/index.ts @@ -72,7 +72,7 @@ export const optionsPresets = { }, }; -export function getFullUrl(path: string, query?: Record): URL { +export function getFullUrl(path: string, query?: Record): URL { const searchParams = new URLSearchParams( Object.fromEntries(Object.entries(query || {}).map(([key, value]) => [key, String(value)])) ); @@ -202,10 +202,7 @@ export type MetadataEntry = components['schemas']['MetadataEntry']; export type Metadata = MetadataEntry[]; export type LocaleKey = components['schemas']['LocaleKey']; export type TranslationLocaleKey = components['schemas']['TranslationLocaleKey']; -export type Translation = { - locale: TranslationLocaleKey; - translation?: string | null; -}; +export type Translation = components['schemas']['TextLevelTranslation']; export type ResourceExportFormat = NonNullable< NonNullable['format'] >; diff --git a/Tekst-Web/src/api/schema.d.ts b/Tekst-Web/src/api/schema.d.ts index 4a26e994..68b1e04c 100644 --- a/Tekst-Web/src/api/schema.d.ts +++ b/Tekst-Web/src/api/schema.d.ts @@ -4187,7 +4187,7 @@ export interface components { ResourceCategoryTranslation: { locale: components['schemas']['TranslationLocaleKey']; /** Translation */ - translation: string | null; + translation: string; }; /** ResourceCommentTranslation */ ResourceCommentTranslation: { diff --git a/Tekst-Web/src/components/AppLoadingFeedback.vue b/Tekst-Web/src/components/AppLoadingFeedback.vue index 7c4b6f9c..803a9c88 100644 --- a/Tekst-Web/src/components/AppLoadingFeedback.vue +++ b/Tekst-Web/src/components/AppLoadingFeedback.vue @@ -17,7 +17,7 @@ const router = useRouter(); // hook in loading bar onBeforeMount(() => { router.beforeEach(() => { - !state.init.loading && loadingBar.start(); + if (!state.init.loading) loadingBar.start(); }); router.afterEach(() => { loadingBar.finish(); diff --git a/Tekst-Web/src/components/AudioPlayer.vue b/Tekst-Web/src/components/AudioPlayer.vue index 8d158531..f406b134 100644 --- a/Tekst-Web/src/components/AudioPlayer.vue +++ b/Tekst-Web/src/components/AudioPlayer.vue @@ -36,11 +36,12 @@ const currentTimeString = computed(() => secondsToTimeString(currentTime.value | const durationString = computed(() => secondsToTimeString(duration.value || 0)); function playPause() { - !playing.value ? play() : pause(); + if (!playing.value) play(); + else pause(); } function play(reset?: boolean) { - reset && (currentTime.value = 0); + if (reset) currentTime.value = 0; playing.value = true; emit('play', props.instanceId); } @@ -58,7 +59,7 @@ function openTab(url: string) { } watch(ended, (after) => { - after && emit('ended', props.instanceId); + if (after) emit('ended', props.instanceId); }); onMounted(() => { @@ -145,6 +146,7 @@ onMounted(() => { .audio-player { padding: 8px 0; } + .caption { white-space: pre-wrap; } diff --git a/Tekst-Web/src/components/browse/BrowseLocationControls.vue b/Tekst-Web/src/components/browse/BrowseLocationControls.vue index 8d72a8d9..1d75881d 100644 --- a/Tekst-Web/src/components/browse/BrowseLocationControls.vue +++ b/Tekst-Web/src/components/browse/BrowseLocationControls.vue @@ -56,10 +56,10 @@ function handleLocationSelect(locationPath: LocationRead[]) { // react to keyboard for in-/decreasing location whenever(ArrowLeft, () => { - !isOverlayOpen() && !isInputFocused() && gotoPosition('prev'); + if (!isOverlayOpen() && !isInputFocused()) gotoPosition('prev'); }); whenever(ArrowRight, () => { - !isOverlayOpen() && !isInputFocused() && gotoPosition('next'); + if (!isOverlayOpen() && !isInputFocused()) gotoPosition('next'); }); diff --git a/Tekst-Web/src/components/messages/GlobalMessenger.vue b/Tekst-Web/src/components/messages/GlobalMessenger.vue index 6fc8b4ae..4c1745a7 100644 --- a/Tekst-Web/src/components/messages/GlobalMessenger.vue +++ b/Tekst-Web/src/components/messages/GlobalMessenger.vue @@ -28,20 +28,20 @@ const MessageDispatcher = defineComponent({ if (after.length > before.length) { while (messageQueue.value.length > 0) { const msg = messageQueue.value.pop(); - msg && - messageUtil.create('', { - type: msg.type, - duration: msg.seconds * 1000, - render: (props) => - renderMessage({ - ...props, - content: () => - h(GlobalMessageContent, null, { - default: () => msg.text, - details: msg.details ? () => msg.details : undefined, - }), - }), - }); + if (!msg) continue; + messageUtil.create('', { + type: msg.type, + duration: msg.seconds * 1000, + render: (props) => + renderMessage({ + ...props, + content: () => + h(GlobalMessageContent, null, { + default: () => msg.text, + details: msg.details ? () => msg.details : undefined, + }), + }), + }); } } }); diff --git a/Tekst-Web/src/components/navigation/TextSelect.vue b/Tekst-Web/src/components/navigation/TextSelect.vue index 4aa2b97e..c9d55fb3 100644 --- a/Tekst-Web/src/components/navigation/TextSelect.vue +++ b/Tekst-Web/src/components/navigation/TextSelect.vue @@ -6,7 +6,6 @@ import { useRouter } from 'vue-router'; import { NDropdown, NButton, NIcon, useThemeVars } from 'naive-ui'; import TextSelectOption from '@/components/navigation/TextSelectOption.vue'; import { usePlatformData } from '@/composables/platformData'; -import { useI18n } from 'vue-i18n'; import { ExpandArrowDownIcon } from '@/icons'; @@ -14,7 +13,6 @@ const router = useRouter(); const state = useStateStore(); const browse = useBrowseStore(); const themeVars = useThemeVars(); -const { locale } = useI18n(); const { pfData } = usePlatformData(); const disabled = computed(() => !pfData.value?.texts || pfData.value.texts.length <= 1); @@ -31,7 +29,7 @@ const renderLabel = (t: TextRead) => { return () => h(TextSelectOption, { text: t, - locale: locale.value, + locale: state.locale, selected: t.id === state.text?.id, onClick: () => handleSelect(t), }); diff --git a/Tekst-Web/src/components/resource/DeepLLinksWidget.vue b/Tekst-Web/src/components/resource/DeepLLinksWidget.vue index bc8771ed..7346836f 100644 --- a/Tekst-Web/src/components/resource/DeepLLinksWidget.vue +++ b/Tekst-Web/src/components/resource/DeepLLinksWidget.vue @@ -18,7 +18,7 @@ const emit = defineEmits(['done']); const contentsTextEncoded = computed(() => { const contentsText = props.resource.contents - ?.map((c: Record) => c.text as string) + ?.map((c: Record) => c.text as string) .join('\n') .trim(); return encodeURIComponent( diff --git a/Tekst-Web/src/components/resource/MetadataDisplay.vue b/Tekst-Web/src/components/resource/MetadataDisplay.vue index c8984ae1..d4558ad7 100644 --- a/Tekst-Web/src/components/resource/MetadataDisplay.vue +++ b/Tekst-Web/src/components/resource/MetadataDisplay.vue @@ -14,7 +14,7 @@ const meta = computed(() => { // prioritized keys first prioritizedMetadataKeys.forEach((p: string) => { const v = data.find((d) => d.key === p)?.value; - v && m.push([$te(`models.meta.${p}`) ? $t(`models.meta.${p}`) : p, v]); + if (v) m.push([$te(`models.meta.${p}`) ? $t(`models.meta.${p}`) : p, v]); }); return m.length > 0 ? m : null; diff --git a/Tekst-Web/src/components/resource/MetadataDisplayMinimal.vue b/Tekst-Web/src/components/resource/MetadataDisplayMinimal.vue index fae0039a..14467b5e 100644 --- a/Tekst-Web/src/components/resource/MetadataDisplayMinimal.vue +++ b/Tekst-Web/src/components/resource/MetadataDisplayMinimal.vue @@ -17,10 +17,11 @@ const meta = computed(() => { // prioritized metadata goes first prioritizedMetadataKeys.forEach((p: string) => { const v = data.find((d) => d.key === p)?.value; - v && m.push(v); + if (v) m.push(v); }); // resource type - props.resource.resourceType && m.push($t(`resources.types.${props.resource.resourceType}.label`)); + if (props.resource.resourceType) + m.push($t(`resources.types.${props.resource.resourceType}.label`)); // level const levelLabel = ` – ${$t('browse.location.level')}: ${state.textLevelLabels[props.resource.level]}`; // join metadata to string diff --git a/Tekst-Web/src/components/resource/ResourceExportWidget.vue b/Tekst-Web/src/components/resource/ResourceExportWidget.vue index d5c3b06e..ad24c1a0 100644 --- a/Tekst-Web/src/components/resource/ResourceExportWidget.vue +++ b/Tekst-Web/src/components/resource/ResourceExportWidget.vue @@ -13,7 +13,7 @@ import { useMessages } from '@/composables/messages'; import { getFullLocationLabel, pickTranslation } from '@/utils'; import { useTasks } from '@/composables/tasks'; -const allFormatOptions: { label: string; value: ResourceExportFormat; [key: string]: any }[] = [ +const allFormatOptions: { label: string; value: ResourceExportFormat; [key: string]: unknown }[] = [ { label: 'JSON', value: 'json', diff --git a/Tekst-Web/src/components/user/UserDisplay.vue b/Tekst-Web/src/components/user/UserDisplay.vue index 3d1a3c61..80f0ddd8 100644 --- a/Tekst-Web/src/components/user/UserDisplay.vue +++ b/Tekst-Web/src/components/user/UserDisplay.vue @@ -8,7 +8,7 @@ import { NIcon, NFlex } from 'naive-ui'; withDefaults( defineProps<{ - user?: UserReadPublic & Record; + user?: UserReadPublic & Record; showAvatar?: boolean; size?: 'large' | 'medium' | 'small' | 'tiny'; link?: boolean; diff --git a/Tekst-Web/src/components/user/UserDisplayText.vue b/Tekst-Web/src/components/user/UserDisplayText.vue index 45a9bdc6..96d4c971 100644 --- a/Tekst-Web/src/components/user/UserDisplayText.vue +++ b/Tekst-Web/src/components/user/UserDisplayText.vue @@ -2,7 +2,7 @@ import type { UserReadPublic } from '@/api'; defineProps<{ - user: UserReadPublic & Record; + user: UserReadPublic & { [key: string]: unknown }; }>(); diff --git a/Tekst-Web/src/components/userMessages/MessagingModal.vue b/Tekst-Web/src/components/userMessages/MessagingModal.vue index 067e4d38..9820d620 100644 --- a/Tekst-Web/src/components/userMessages/MessagingModal.vue +++ b/Tekst-Web/src/components/userMessages/MessagingModal.vue @@ -40,7 +40,7 @@ async function handleSendMessage() { sender: auth.user?.id, recipient: userMessages.openThread?.contact?.id || '', }); - msg && messages.value?.push(msg); + if (msg) messages.value?.push(msg); messageInput.value = ''; await scrollDownMessageContainer(300); loadingSend.value = false; diff --git a/Tekst-Web/src/composables/errors.ts b/Tekst-Web/src/composables/errors.ts index 45fa6071..6275b225 100644 --- a/Tekst-Web/src/composables/errors.ts +++ b/Tekst-Web/src/composables/errors.ts @@ -19,7 +19,7 @@ const fapiUsersErrorCodesMap: Record = { RESET_PASSWORD_BAD_TOKEN: 'resetPasswordBadToken', }; -function isObject(o: any) { +function isObject(o: unknown) { return o && typeof o === 'object' && o.constructor === Object; } @@ -59,11 +59,11 @@ export function useErrors() { // show error message if ($te(`errors.${detail.key}`)) { const m = $t(`errors.${detail.key}`, (detail.values as Record) || undefined); - displayMessage && message.error(m, detail.values || undefined, 10); + if (displayMessage) message.error(m, detail.values || undefined, 10); return m; } else { const m = $t('errors.unexpected'); - displayMessage && message.error(m, error, 10); + if (displayMessage) message.error(m, error, 10); return m; } } diff --git a/Tekst-Web/src/composables/init.ts b/Tekst-Web/src/composables/init.ts index 266fd792..c79cdb0a 100644 --- a/Tekst-Web/src/composables/init.ts +++ b/Tekst-Web/src/composables/init.ts @@ -35,7 +35,7 @@ export function useInitializeApp() { await loadPlatformData(); await state.setLocale(localStorage.getItem('locale') || undefined); return success; - } catch (e) { + } catch { message.error($t('errors.loadData')); return false; } @@ -59,7 +59,7 @@ export function useInitializeApp() { try { await resources.load(); return success; - } catch (e) { + } catch { message.error($t('errors.loadData')); return false; } diff --git a/Tekst-Web/src/composables/modelChanges.ts b/Tekst-Web/src/composables/modelChanges.ts index aaf36cc4..f47a3167 100644 --- a/Tekst-Web/src/composables/modelChanges.ts +++ b/Tekst-Web/src/composables/modelChanges.ts @@ -1,6 +1,6 @@ import { computed, ref, type Ref } from 'vue'; -function hashCode(obj: any) { +function hashCode(obj: unknown) { const string = String(JSON.stringify(obj)); let hash = 0; for (let i = 0; i < string.length; i++) { @@ -11,8 +11,8 @@ function hashCode(obj: any) { return hash; } -export function useModelChanges(model: Ref | undefined>) { - const getPropsHashes = (ofModel: Record | undefined): Record => { +export function useModelChanges(model: Ref | undefined>) { + const getPropsHashes = (ofModel: Record | undefined): Record => { const hashes: Record = {}; if (!ofModel) return hashes; Object.keys(ofModel).forEach((k) => { @@ -20,8 +20,8 @@ export function useModelChanges(model: Ref | undefined>) { }); return hashes; }; - const getChanges = (forceProps?: string[]): Record => { - const changes: Record = {}; + const getChanges = (forceProps?: string[]): Record => { + const changes: Record = {}; if (!model.value) return changes; Object.keys(model.value).forEach((k) => { if (modelPropsHashes.value[k] !== hashCode(model.value?.[k]) || forceProps?.includes(k)) { diff --git a/Tekst-Web/src/forms/formRules.ts b/Tekst-Web/src/forms/formRules.ts index c4c08904..4151a0dd 100644 --- a/Tekst-Web/src/forms/formRules.ts +++ b/Tekst-Web/src/forms/formRules.ts @@ -1,6 +1,6 @@ import type { FormItemRule } from 'naive-ui'; import { $t, localeProfiles } from '@/i18n'; -import { resourceTypes } from '@/api'; +import { resourceTypes, type Translation } from '@/api'; function requiredStringRule( inputLabel: () => string, @@ -104,8 +104,8 @@ export const textFormRules: Record = { ], levels: [ { - validator: (rule: FormItemRule, value: any[]) => - !!value && value.length >= 1 && value.length <= 32, + validator: (rule: FormItemRule, value: Translation[]) => + !!value && Array.isArray(value) && value.length >= 1 && value.length <= 32, message: () => $t('forms.rulesFeedback.minMaxItems', { min: 1, max: 32 }), trigger: 'blur', }, @@ -138,7 +138,7 @@ export const locationFormRules: Record = { ], aliases: [ { - validator: (rule: FormItemRule, value: any) => + validator: (rule: FormItemRule, value: string[] | null) => value == null || (Array.isArray(value) && value.length <= 16), message: () => $t('forms.rulesFeedback.minMaxItems', { min: 0, max: 16 }), trigger: 'blur', @@ -339,7 +339,7 @@ export const contentFormRules: Record> = ], annotationValue: [ { - validator: (rule: FormItemRule, value: any) => !!value && Array.isArray(value), + validator: (rule: FormItemRule, value: string[]) => !!value && Array.isArray(value), message: () => $t('forms.rulesFeedback.isRequired', { x: $t('resources.types.textAnnotation.contentFields.annotationValue'), @@ -347,13 +347,13 @@ export const contentFormRules: Record> = trigger: 'change', }, { - validator: (rule: FormItemRule, value: any[]) => + validator: (rule: FormItemRule, value: string[]) => !!value && value.length >= 1 && value.length <= 64, message: () => $t('forms.rulesFeedback.minMaxItems', { min: 1, max: 64 }), trigger: 'change', }, { - validator: (rule: FormItemRule, value: any[]) => + validator: (rule: FormItemRule, value: string[]) => !!value && value.every((item) => item.length >= 1 && item.length <= 256), message: () => $t('forms.rulesFeedback.minMaxChars', { min: 1, max: 256 }), trigger: 'change', diff --git a/Tekst-Web/src/forms/resources/config/CommonResourceConfigFormItems.vue b/Tekst-Web/src/forms/resources/config/CommonResourceConfigFormItems.vue index 584ee0e1..38e3547d 100644 --- a/Tekst-Web/src/forms/resources/config/CommonResourceConfigFormItems.vue +++ b/Tekst-Web/src/forms/resources/config/CommonResourceConfigFormItems.vue @@ -22,7 +22,7 @@ const categoryOptions = computed( })) || [] ); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/config/DeepLLinksConfigFormItems.vue b/Tekst-Web/src/forms/resources/config/DeepLLinksConfigFormItems.vue index 316d8410..1db8fec0 100644 --- a/Tekst-Web/src/forms/resources/config/DeepLLinksConfigFormItems.vue +++ b/Tekst-Web/src/forms/resources/config/DeepLLinksConfigFormItems.vue @@ -7,7 +7,7 @@ const model = defineModel({ required: true }); const languageOptions = deeplSourceLanguages.map((l) => ({ label: l, value: l })); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/config/LineLabellingConfigFormItems.vue b/Tekst-Web/src/forms/resources/config/LineLabellingConfigFormItems.vue index 1ef54839..21e0a144 100644 --- a/Tekst-Web/src/forms/resources/config/LineLabellingConfigFormItems.vue +++ b/Tekst-Web/src/forms/resources/config/LineLabellingConfigFormItems.vue @@ -14,7 +14,7 @@ const labellingOptions = computed(() => })) ); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/config/ResourceConfigFormItems.vue b/Tekst-Web/src/forms/resources/config/ResourceConfigFormItems.vue index a10e72f9..a284e83a 100644 --- a/Tekst-Web/src/forms/resources/config/ResourceConfigFormItems.vue +++ b/Tekst-Web/src/forms/resources/config/ResourceConfigFormItems.vue @@ -10,7 +10,7 @@ defineProps<{ const model = defineModel({ default: {} }); -function handleUpdateGeneralConfig(field: string, value: any) { +function handleUpdateGeneralConfig(field: string, value: unknown) { model.value = { ...model.value, general: { @@ -20,7 +20,7 @@ function handleUpdateGeneralConfig(field: string, value: any) { }; } -function handleUpdateSpecialConfig(field: string, value: any) { +function handleUpdateSpecialConfig(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/config/ResourceSettingsFormItems.vue b/Tekst-Web/src/forms/resources/config/ResourceSettingsFormItems.vue index 73c9351e..e8202d8c 100644 --- a/Tekst-Web/src/forms/resources/config/ResourceSettingsFormItems.vue +++ b/Tekst-Web/src/forms/resources/config/ResourceSettingsFormItems.vue @@ -106,7 +106,7 @@ const usersOptionsWrite = computed(() => { ); }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/contents/AudioContentFormItems.vue b/Tekst-Web/src/forms/resources/contents/AudioContentFormItems.vue index b4218d28..b2754389 100644 --- a/Tekst-Web/src/forms/resources/contents/AudioContentFormItems.vue +++ b/Tekst-Web/src/forms/resources/contents/AudioContentFormItems.vue @@ -15,7 +15,7 @@ defineProps<{ const model = defineModel({ required: true }); const { message } = useMessages(); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/contents/ContentFormItems.vue b/Tekst-Web/src/forms/resources/contents/ContentFormItems.vue index 17243818..c0471650 100644 --- a/Tekst-Web/src/forms/resources/contents/ContentFormItems.vue +++ b/Tekst-Web/src/forms/resources/contents/ContentFormItems.vue @@ -10,7 +10,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/contents/ExternalReferencesFormItems.vue b/Tekst-Web/src/forms/resources/contents/ExternalReferencesFormItems.vue index b8c771f9..18a231e5 100644 --- a/Tekst-Web/src/forms/resources/contents/ExternalReferencesFormItems.vue +++ b/Tekst-Web/src/forms/resources/contents/ExternalReferencesFormItems.vue @@ -12,7 +12,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/contents/ImagesContentFormItems.vue b/Tekst-Web/src/forms/resources/contents/ImagesContentFormItems.vue index 2d32f7f4..dcf33f55 100644 --- a/Tekst-Web/src/forms/resources/contents/ImagesContentFormItems.vue +++ b/Tekst-Web/src/forms/resources/contents/ImagesContentFormItems.vue @@ -15,7 +15,7 @@ defineProps<{ const model = defineModel({ required: true }); const { message } = useMessages(); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/contents/PlainTextContentFormItems.vue b/Tekst-Web/src/forms/resources/contents/PlainTextContentFormItems.vue index c3bb4780..5a0f0342 100644 --- a/Tekst-Web/src/forms/resources/contents/PlainTextContentFormItems.vue +++ b/Tekst-Web/src/forms/resources/contents/PlainTextContentFormItems.vue @@ -10,7 +10,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/contents/RichTextContentFormItems.vue b/Tekst-Web/src/forms/resources/contents/RichTextContentFormItems.vue index 76bd0510..f13bca5d 100644 --- a/Tekst-Web/src/forms/resources/contents/RichTextContentFormItems.vue +++ b/Tekst-Web/src/forms/resources/contents/RichTextContentFormItems.vue @@ -10,7 +10,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/contents/TextAnnotationContentFormItems.vue b/Tekst-Web/src/forms/resources/contents/TextAnnotationContentFormItems.vue index 51021232..6f8325f5 100644 --- a/Tekst-Web/src/forms/resources/contents/TextAnnotationContentFormItems.vue +++ b/Tekst-Web/src/forms/resources/contents/TextAnnotationContentFormItems.vue @@ -70,7 +70,7 @@ function handleInsertToken(index: number) { return { token: undefined, annotations: [] }; } -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/search/AudioSearchFormItems.vue b/Tekst-Web/src/forms/resources/search/AudioSearchFormItems.vue index 49ba036f..c598a157 100644 --- a/Tekst-Web/src/forms/resources/search/AudioSearchFormItems.vue +++ b/Tekst-Web/src/forms/resources/search/AudioSearchFormItems.vue @@ -11,7 +11,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/search/ExternalReferencesSearchFormItems.vue b/Tekst-Web/src/forms/resources/search/ExternalReferencesSearchFormItems.vue index 748a95b0..90e470a9 100644 --- a/Tekst-Web/src/forms/resources/search/ExternalReferencesSearchFormItems.vue +++ b/Tekst-Web/src/forms/resources/search/ExternalReferencesSearchFormItems.vue @@ -11,7 +11,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/search/ImagesSearchFormItems.vue b/Tekst-Web/src/forms/resources/search/ImagesSearchFormItems.vue index 1cd32bcc..3c85d6c2 100644 --- a/Tekst-Web/src/forms/resources/search/ImagesSearchFormItems.vue +++ b/Tekst-Web/src/forms/resources/search/ImagesSearchFormItems.vue @@ -11,7 +11,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/search/PlainTextSearchFormItems.vue b/Tekst-Web/src/forms/resources/search/PlainTextSearchFormItems.vue index 33f3c674..105d0506 100644 --- a/Tekst-Web/src/forms/resources/search/PlainTextSearchFormItems.vue +++ b/Tekst-Web/src/forms/resources/search/PlainTextSearchFormItems.vue @@ -11,7 +11,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/search/RichTextSearchFormItems.vue b/Tekst-Web/src/forms/resources/search/RichTextSearchFormItems.vue index e7a1b093..be5694cc 100644 --- a/Tekst-Web/src/forms/resources/search/RichTextSearchFormItems.vue +++ b/Tekst-Web/src/forms/resources/search/RichTextSearchFormItems.vue @@ -11,7 +11,7 @@ defineProps<{ const model = defineModel({ required: true }); -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/forms/resources/search/TextAnnotationSearchFormItems.vue b/Tekst-Web/src/forms/resources/search/TextAnnotationSearchFormItems.vue index 10162ae6..b5ea157e 100644 --- a/Tekst-Web/src/forms/resources/search/TextAnnotationSearchFormItems.vue +++ b/Tekst-Web/src/forms/resources/search/TextAnnotationSearchFormItems.vue @@ -62,7 +62,7 @@ function getAnnoValueSelectStyle(value?: string) { return value ? annoValueStyle : undefined; } -function handleUpdate(field: string, value: any) { +function handleUpdate(field: string, value: unknown) { model.value = { ...model.value, [field]: value, diff --git a/Tekst-Web/src/i18n.ts b/Tekst-Web/src/i18n.ts index 056f8c8a..5658ddc3 100644 --- a/Tekst-Web/src/i18n.ts +++ b/Tekst-Web/src/i18n.ts @@ -48,28 +48,20 @@ const i18nOptions: I18nOptions = { }; export const i18n = createI18n(i18nOptions); -export const { t: $t, te: $te, tm: $tm } = i18n.global; - -// set initial i18n locale -//(happens before app init, where locale is set respecting platform settings) -// @ts-ignore -i18n.global.locale.value = 'enUS'; +export const $t: typeof i18n.global.t = i18n.global.t; +export const $te: typeof i18n.global.te = i18n.global.te; +i18n.global.locale = 'enUS'; export function getLocaleProfile(localeKey: string): LocaleProfile | undefined { return localeProfiles.find((lp) => lp.key === localeKey); } -export function setI18nLocale(locale: I18nOptions['locale'] = i18n.global.locale): LocaleProfile { - const l = unref(locale) ?? i18n.global.locale; - if (!l) { - // passed locale is invalid - console.error(`Invalid locale code: ${l}`); - return getLocaleProfile('enUS') || localeProfiles[0]; - } - // @ts-ignore - i18n.global.locale.value = l; - document.querySelector('html')?.setAttribute('lang', l); - return getLocaleProfile(l) || localeProfiles[0]; +export function setI18nLocale( + newLocale: I18nOptions['locale'] = i18n.global.locale +): LocaleProfile { + i18n.global.locale = unref(newLocale); + document.querySelector('html')?.setAttribute('lang', i18n.global.locale); + return getLocaleProfile(i18n.global.locale) || localeProfiles[0]; } export function getAvaliableBrowserLocaleKey() { diff --git a/Tekst-Web/src/stores/auth.ts b/Tekst-Web/src/stores/auth.ts index 26f58e9c..bd7eb676 100644 --- a/Tekst-Web/src/stores/auth.ts +++ b/Tekst-Web/src/stores/auth.ts @@ -104,9 +104,9 @@ export const useAuthStore = defineStore('auth', () => { } function closeLoginModal(gotoNextRoute: boolean = true) { - gotoNextRoute && - loginModalState.value.nextRoute && + if (gotoNextRoute && loginModalState.value.nextRoute) { router.replace(loginModalState.value.nextRoute); + } loginModalState.value = {}; } @@ -165,8 +165,8 @@ export const useAuthStore = defineStore('auth', () => { async function logout(noMsg?: boolean) { router.push({ name: 'home' }); - if (!(await POST('/auth/cookie/logout', {})).error) { - !noMsg && message.success($t('account.logoutSuccessful')); + if (!(await POST('/auth/cookie/logout', {})).error && !noMsg) { + message.success($t('account.logoutSuccessful')); } _cleanupSession(); await loadPlatformData(); // reload platform data as some resources might not be accessible anymore diff --git a/Tekst-Web/src/stores/search.ts b/Tekst-Web/src/stores/search.ts index 65d355ec..202d3ec6 100644 --- a/Tekst-Web/src/stores/search.ts +++ b/Tekst-Web/src/stores/search.ts @@ -29,7 +29,7 @@ type QuickSearchSettings = { txt?: string[]; }; -type AdvancedSearchSettings = {}; +type AdvancedSearchSettings = { [key: string]: never }; type QuickSearchRequest = { type: 'quick'; diff --git a/Tekst-Web/src/stores/state.ts b/Tekst-Web/src/stores/state.ts index e75efb34..71323657 100644 --- a/Tekst-Web/src/stores/state.ts +++ b/Tekst-Web/src/stores/state.ts @@ -2,11 +2,10 @@ import { ref, computed, watch } from 'vue'; import { defineStore } from 'pinia'; import { useWindowSize } from '@vueuse/core'; import type { RouteLocationNormalized } from 'vue-router'; -import { i18n, setI18nLocale, getAvaliableBrowserLocaleKey, localeProfiles } from '@/i18n'; +import { $t, $te, i18n, setI18nLocale, getAvaliableBrowserLocaleKey, localeProfiles } from '@/i18n'; import type { LocaleProfile } from '@/i18n'; import { useRoute } from 'vue-router'; import type { TextRead, TranslationLocaleKey } from '@/api'; -import { $t, $te } from '@/i18n'; import { usePlatformData } from '@/composables/platformData'; import { useAuthStore } from './auth'; import type { LocaleKey } from '@/api'; @@ -125,7 +124,7 @@ export const useStateStore = defineStore('state', () => { () => text.value?.id, () => { setPageTitle(route); - text.value && localStorage.setItem('text', text.value?.slug); + if (text.value) localStorage.setItem('text', text.value?.slug); } ); diff --git a/Tekst-Web/src/stores/userMessages.ts b/Tekst-Web/src/stores/userMessages.ts index 5017f833..3f08a776 100644 --- a/Tekst-Web/src/stores/userMessages.ts +++ b/Tekst-Web/src/stores/userMessages.ts @@ -13,9 +13,12 @@ export const useUserMessagesStore = defineStore('userMessages', () => { const { pause: stopThreadsPolling, resume: startThreadsPolling } = useIntervalFn( async () => { - auth.user && (await loadThreads()); - unreadCount.value && + if (auth.user) { + await loadThreads(); + } + if (unreadCount.value) { message.info($t('account.messages.msgUnreadCount', { count: unreadCount.value })); + } }, 30 * 1000, // 30 seconds { immediate: false, immediateCallback: true } diff --git a/Tekst-Web/src/utils.ts b/Tekst-Web/src/utils.ts index f37135bb..055befa8 100644 --- a/Tekst-Web/src/utils.ts +++ b/Tekst-Web/src/utils.ts @@ -2,7 +2,7 @@ import { h, type Component } from 'vue'; import type { LocationRead, TextRead, Translation, TranslationLocaleKey } from '@/api'; import { NIcon } from 'naive-ui'; -export function hashCode(obj: any) { +export function hashCode(obj: object) { const string = JSON.stringify(obj); let hash = 0; for (let i = 0; i < string.length; i++) { diff --git a/Tekst-Web/src/views/ContentsView.vue b/Tekst-Web/src/views/ContentsView.vue index ff2ca37c..a61a5480 100644 --- a/Tekst-Web/src/views/ContentsView.vue +++ b/Tekst-Web/src/views/ContentsView.vue @@ -377,10 +377,10 @@ async function handleNearestChangeClick(mode: 'preceding' | 'subsequent') { // react to keyboard for in-/decreasing location whenever(ArrowLeft, () => { - !isOverlayOpen() && !isInputFocused() && navigateContents(-1); + if (!isOverlayOpen() && !isInputFocused()) navigateContents(-1); }); whenever(ArrowRight, () => { - !isOverlayOpen() && !isInputFocused() && navigateContents(1); + if (!isOverlayOpen() && !isInputFocused()) navigateContents(1); }); diff --git a/Tekst-Web/src/views/InfoPageView.vue b/Tekst-Web/src/views/InfoPageView.vue index 5fd85c92..c93194bb 100644 --- a/Tekst-Web/src/views/InfoPageView.vue +++ b/Tekst-Web/src/views/InfoPageView.vue @@ -2,17 +2,17 @@ import type { ClientSegmentRead } from '@/api'; import { usePlatformData } from '@/composables/platformData'; import { ref, type Component, watchEffect } from 'vue'; -import { useI18n } from 'vue-i18n'; import { NSpin } from 'naive-ui'; import IconHeading from '@/components/generic/IconHeading.vue'; import { useRoute, useRouter } from 'vue-router'; +import { useStateStore } from '@/stores'; const props = defineProps<{ pageKey?: string; icon?: Component; }>(); -const { locale } = useI18n(); +const state = useStateStore(); const loading = ref(false); const { getSegment } = usePlatformData(); const router = useRouter(); @@ -22,7 +22,7 @@ const page = ref(); watchEffect(async () => { loading.value = true; - page.value = await getSegment(props.pageKey || String(route.params.p), locale.value); + page.value = await getSegment(props.pageKey || String(route.params.p), state.locale); if (!page.value) { router.replace({ name: 'browse' }); } diff --git a/Tekst-Web/src/views/RegisterView.vue b/Tekst-Web/src/views/RegisterView.vue index 6a186487..f6a4694a 100644 --- a/Tekst-Web/src/views/RegisterView.vue +++ b/Tekst-Web/src/views/RegisterView.vue @@ -92,7 +92,7 @@ function handleRegisterClick() { loading.value = true; formRef.value ?.validate((errors) => { - !errors && registerUser(); + if (!errors) registerUser(); }) .catch(() => { message.error($t('errors.followFormRules')); diff --git a/Tekst-Web/src/views/ResetView.vue b/Tekst-Web/src/views/ResetView.vue index c5eb1035..99bab4a6 100644 --- a/Tekst-Web/src/views/ResetView.vue +++ b/Tekst-Web/src/views/ResetView.vue @@ -65,7 +65,7 @@ async function handlePasswordSave() { } onMounted(() => { - !token && router.push({ name: 'home' }); + if (!token) router.push({ name: 'home' }); }); diff --git a/Tekst-Web/src/views/SearchResultsView.vue b/Tekst-Web/src/views/SearchResultsView.vue index 7ffbb10d..57948b66 100644 --- a/Tekst-Web/src/views/SearchResultsView.vue +++ b/Tekst-Web/src/views/SearchResultsView.vue @@ -56,10 +56,14 @@ const browseViewLabel = computed( // react to keyboard for in-/decreasing page number whenever(ArrowRight, () => { - !isOverlayOpen() && !isInputFocused() && search.turnPage('next'); + if (!isOverlayOpen() && !isInputFocused()) { + search.turnPage('next'); + } }); whenever(ArrowLeft, () => { - !isOverlayOpen() && !isInputFocused() && search.turnPage('previous'); + if (!isOverlayOpen() && !isInputFocused()) { + search.turnPage('previous'); + } }); onBeforeMount(() => { diff --git a/Tekst-Web/src/views/account/AccountSettingsView.vue b/Tekst-Web/src/views/account/AccountSettingsView.vue index 5c35601f..c32fe286 100644 --- a/Tekst-Web/src/views/account/AccountSettingsView.vue +++ b/Tekst-Web/src/views/account/AccountSettingsView.vue @@ -180,29 +180,29 @@ function handleEmailSave() { async function handlePasswordSave() { passwordFormRef.value ?.validate(async (errors) => { - !errors && - dialog.warning({ - title: $t('general.warning'), - content: $t('account.settings.msgPasswordChangeWarning'), - positiveText: $t('general.saveAction'), - negativeText: $t('general.cancelAction'), - autoFocus: false, - closable: false, - ...dialogProps, - onPositiveClick: async () => { - if ( - !(await updateUser({ - password: passwordFormModel.value.password || undefined, - })) - ) - return; - passwordFormModel.value = initialPasswordModel(); - resetPasswordModelChanges(); - message.success($t('account.settings.msgPasswordSaveSuccess')); - await auth.logout(); - auth.showLoginModal(undefined, { name: 'accountProfile' }, false); - }, - }); + if (errors) return; + dialog.warning({ + title: $t('general.warning'), + content: $t('account.settings.msgPasswordChangeWarning'), + positiveText: $t('general.saveAction'), + negativeText: $t('general.cancelAction'), + autoFocus: false, + closable: false, + ...dialogProps, + onPositiveClick: async () => { + if ( + !(await updateUser({ + password: passwordFormModel.value.password || undefined, + })) + ) + return; + passwordFormModel.value = initialPasswordModel(); + resetPasswordModelChanges(); + message.success($t('account.settings.msgPasswordSaveSuccess')); + await auth.logout(); + auth.showLoginModal(undefined, { name: 'accountProfile' }, false); + }, + }); }) .catch(() => { message.error($t('errors.followFormRules')); diff --git a/Tekst-Web/src/views/admin/AdminNewTextView.vue b/Tekst-Web/src/views/admin/AdminNewTextView.vue index 49fd3bb5..30398b1f 100644 --- a/Tekst-Web/src/views/admin/AdminNewTextView.vue +++ b/Tekst-Web/src/views/admin/AdminNewTextView.vue @@ -8,30 +8,31 @@ import { POST } from '@/api'; import { useStateStore } from '@/stores'; import { usePlatformData } from '@/composables/platformData'; import { useRouter } from 'vue-router'; -import type { TextCreate, Translation } from '@/api'; +import type { TextCreate } from '@/api'; import HelpButtonWidget from '@/components/HelpButtonWidget.vue'; import IconHeading from '@/components/generic/IconHeading.vue'; import ButtonShelf from '@/components/generic/ButtonShelf.vue'; import DynamicInputControls from '@/forms/DynamicInputControls.vue'; import { AddCircleIcon } from '@/icons'; -interface NewTextModel { - title?: string; - slug?: string; - levels: Translation[][]; -} - -const initialModel = (): NewTextModel => ({ - title: undefined, - slug: undefined, +const initialModel = (): TextCreate => ({ + title: '', + slug: '', levels: [[{ locale: '*', translation: '' }]], + accentColor: '#43895F', + defaultLevel: 0, + isActive: false, + labeledLocation: true, + locDelim: '; ', + resourceCategories: [], + subtitle: [], }); const router = useRouter(); const { message } = useMessages(); const state = useStateStore(); const { loadPlatformData } = usePlatformData(); -const model = ref>(initialModel()); +const model = ref(initialModel()); const formRef = ref(null); const loading = ref(false); diff --git a/Tekst-Web/src/views/admin/AdminSystemInfoPagesView.vue b/Tekst-Web/src/views/admin/AdminSystemInfoPagesView.vue index a60e1ae9..c91695b6 100644 --- a/Tekst-Web/src/views/admin/AdminSystemInfoPagesView.vue +++ b/Tekst-Web/src/views/admin/AdminSystemInfoPagesView.vue @@ -19,19 +19,16 @@ import { usePlatformData } from '@/composables/platformData'; import { PATCH, type ClientSegmentUpdate, POST, type ClientSegmentCreate, DELETE } from '@/api'; import HugeLabelledIcon from '@/components/generic/HugeLabelledIcon.vue'; import ButtonShelf from '@/components/generic/ButtonShelf.vue'; -import { useI18n } from 'vue-i18n'; import { useModelChanges } from '@/composables/modelChanges'; import { useMessages } from '@/composables/messages'; import { infoSegmentFormRules } from '@/forms/formRules'; import { dialogProps } from '@/common'; import { useStateStore } from '@/stores'; - import { AddIcon, FileOpenIcon, InfoIcon } from '@/icons'; import IconHeading from '@/components/generic/IconHeading.vue'; const state = useStateStore(); const { pfData, loadPlatformData, getSegment } = usePlatformData(); -const { locale } = useI18n(); const { message } = useMessages(); const dialog = useDialog(); @@ -51,7 +48,7 @@ const segmentOptions = computed(() => [...new Set(pfData.value?.infoSegments.map((p) => p.key))].map((key) => { const groupSegments = pfData.value?.infoSegments.filter((s) => s.key === key) || []; const currLocaleSegment = - groupSegments.find((s) => s.locale === locale.value) || + groupSegments.find((s) => s.locale === state.locale) || groupSegments.find((s) => s.locale === 'enUS') || groupSegments[0]; return { diff --git a/Tekst-Web/src/views/admin/AdminSystemSegmentsView.vue b/Tekst-Web/src/views/admin/AdminSystemSegmentsView.vue index 76be7429..d998a3ca 100644 --- a/Tekst-Web/src/views/admin/AdminSystemSegmentsView.vue +++ b/Tekst-Web/src/views/admin/AdminSystemSegmentsView.vue @@ -18,8 +18,6 @@ import { import { usePlatformData } from '@/composables/platformData'; import { PATCH, type ClientSegmentUpdate, POST, type ClientSegmentCreate, DELETE } from '@/api'; import HugeLabelledIcon from '@/components/generic/HugeLabelledIcon.vue'; - -import { useI18n } from 'vue-i18n'; import { useModelChanges } from '@/composables/modelChanges'; import { useMessages } from '@/composables/messages'; import { systemSegmentFormRules } from '@/forms/formRules'; @@ -31,7 +29,6 @@ import IconHeading from '@/components/generic/IconHeading.vue'; const state = useStateStore(); const { pfData, loadPlatformData } = usePlatformData(); -const { locale } = useI18n(); const { message } = useMessages(); const dialog = useDialog(); @@ -51,7 +48,7 @@ const segmentOptions = computed(() => [...new Set(pfData.value?.systemSegments.map((s) => s.key))].map((key) => { const groupSegments = pfData.value?.systemSegments.filter((s) => s.key === key) || []; const currLocaleSegment = - groupSegments.find((s) => s.locale === locale.value) || + groupSegments.find((s) => s.locale === state.locale) || groupSegments.find((s) => s.locale === '*') || groupSegments.find((s) => s.locale === 'enUS') || groupSegments[0]; diff --git a/Tekst-Web/src/views/admin/AdminTextsLevelsView.vue b/Tekst-Web/src/views/admin/AdminTextsLevelsView.vue index 8dac07c7..65c8834d 100644 --- a/Tekst-Web/src/views/admin/AdminTextsLevelsView.vue +++ b/Tekst-Web/src/views/admin/AdminTextsLevelsView.vue @@ -13,23 +13,20 @@ import { useMessages } from '@/composables/messages'; import { $t } from '@/i18n'; import { POST, PATCH, DELETE } from '@/api'; import { usePlatformData } from '@/composables/platformData'; -import { useI18n } from 'vue-i18n'; import TranslationFormItem from '@/forms/TranslationFormItem.vue'; import GenericModal from '@/components/generic/GenericModal.vue'; - import { DeleteIcon, EditIcon, LevelsIcon } from '@/icons'; import IconHeading from '@/components/generic/IconHeading.vue'; const state = useStateStore(); const { loadPlatformData } = usePlatformData(); const { message } = useMessages(); -const { locale } = useI18n({ useScope: 'global' }); const dialog = useDialog(); const levels = computed(() => state.text?.levels || [[]]); const showEditModal = ref(false); -const formModel = ref>({}); +const formModel = ref<{ translations: Translation[] }>({ translations: [] }); const formRef = ref(null); const loading = ref(false); const editModalLevel = ref(-1); @@ -96,11 +93,11 @@ function handleDeleteClick(level: number) { function getLevelLabel(lvl: Translation[]) { if (!lvl?.length) return ''; - return lvl.find((t) => t.locale === locale.value)?.translation || lvl[0].translation || ''; + return lvl.find((t) => t.locale === state.locale)?.translation || lvl[0].translation || ''; } function destroyEditModal() { - formModel.value = {}; + formModel.value.translations = []; editModalAction.value = 'edit'; editModalLevel.value = -1; } diff --git a/Tekst-Web/tsconfig.json b/Tekst-Web/tsconfig.json index f0509bf9..97a4fb05 100644 --- a/Tekst-Web/tsconfig.json +++ b/Tekst-Web/tsconfig.json @@ -11,7 +11,7 @@ "compilerOptions": { "baseUrl": ".", // this must be specified if "paths" is specified. "paths": { - "@": ["./src"] // this mapping is relative to "baseUrl" + "@": ["./src"] // this mapping is relative to "baseUrl", }, "noErrorTruncation": true }