From a7a68f74aebed2d5c936a88d0be843e962d8ca2d Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 15 Jul 2025 20:02:06 +0200 Subject: [PATCH 001/225] chore: update minor dependencies (#5295) --- frontend/eslint.config.js | 19 +- frontend/package.json | 47 +- frontend/pnpm-lock.yaml | 1072 ++++++++++++++--------- frontend/src/components/ProgressBar.vue | 3 +- go.mod | 36 +- go.sum | 82 +- 6 files changed, 731 insertions(+), 528 deletions(-) diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index 0ee268b3..8d660425 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -1,26 +1,25 @@ import pluginVue from "eslint-plugin-vue"; -import vueTsEslintConfig from "@vue/eslint-config-typescript"; +import { + defineConfigWithVueTs, + vueTsConfigs, +} from "@vue/eslint-config-typescript"; import prettierConfig from "@vue/eslint-config-prettier"; -export default [ +export default defineConfigWithVueTs( { name: "app/files-to-lint", files: ["**/*.{ts,mts,tsx,vue}"], }, - { name: "app/files-to-ignore", ignores: ["**/dist/**", "**/dist-ssr/**", "**/coverage/**"], }, - - ...pluginVue.configs["flat/essential"], - ...vueTsEslintConfig(), + pluginVue.configs["flat/essential"], + vueTsConfigs.recommended, prettierConfig, - { rules: { // Note: you must disable the base rule as it can report incorrect errors - "no-unused-expressions": "off", "@typescript-eslint/no-unused-expressions": "off", // TODO: theres too many of these from before ts "@typescript-eslint/no-explicit-any": "off", @@ -34,5 +33,5 @@ export default [ }, ], }, - }, -]; + } +); diff --git a/frontend/package.json b/frontend/package.json index e09558c7..b0dbc1b3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,9 +21,9 @@ "@chenfengyuan/vue-number-input": "^2.0.1", "@vueuse/core": "^12.5.0", "@vueuse/integrations": "^12.5.0", - "ace-builds": "^1.37.5", - "core-js": "^3.40.0", - "dayjs": "^1.11.10", + "ace-builds": "^1.43.2", + "core-js": "^3.44.0", + "dayjs": "^1.11.13", "dompurify": "^3.2.6", "epubjs": "^0.3.93", "filesize": "^10.1.1", @@ -31,45 +31,46 @@ "jwt-decode": "^4.0.0", "lodash-es": "^4.17.21", "marked": "^15.0.6", - "material-icons": "^1.13.13", + "material-icons": "^1.13.14", "normalize.css": "^8.0.1", "pinia": "^2.3.1", "pretty-bytes": "^6.1.1", - "qrcode.vue": "^3.4.1", + "qrcode.vue": "^3.6.0", "tus-js-client": "^4.3.1", "utif": "^3.1.0", - "video.js": "^8.21.0", + "video.js": "^8.23.3", "videojs-hotkeys": "^0.2.28", "videojs-mobile-ui": "^1.1.1", - "vue": "^3.4.21", - "vue-final-modal": "^4.5.4", - "vue-i18n": "^11.1.2", + "vue": "^3.5.17", + "vue-final-modal": "^4.5.5", + "vue-i18n": "^11.1.9", "vue-lazyload": "^3.0.0", "vue-reader": "^1.2.17", - "vue-router": "^4.3.0", + "vue-router": "^4.5.1", "vue-toastification": "^2.0.0-rc.5" }, "devDependencies": { - "@intlify/unplugin-vue-i18n": "^6.0.3", - "@playwright/test": "^1.50.0", - "@tsconfig/node22": "^22.0.0", + "@intlify/unplugin-vue-i18n": "^6.0.8", + "@playwright/test": "^1.54.1", + "@tsconfig/node22": "^22.0.2", "@types/lodash-es": "^4.17.12", "@types/node": "^22.10.10", - "@typescript-eslint/eslint-plugin": "^8.21.0", + "@typescript-eslint/eslint-plugin": "^8.37.0", "@vitejs/plugin-legacy": "^6.0.0", "@vitejs/plugin-vue": "^5.0.4", "@vue/eslint-config-prettier": "^10.2.0", - "@vue/eslint-config-typescript": "^14.3.0", + "@vue/eslint-config-typescript": "^14.6.0", "@vue/tsconfig": "^0.7.0", - "autoprefixer": "^10.4.19", - "concurrently": "^9.1.2", - "eslint": "^9.19.0", - "eslint-plugin-prettier": "^5.2.3", + "autoprefixer": "^10.4.21", + "concurrently": "^9.2.0", + "eslint": "^9.31.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-prettier": "^5.5.1", "eslint-plugin-vue": "^9.24.0", - "jsdom": "^26.0.0", - "postcss": "^8.5.1", - "prettier": "^3.4.2", - "terser": "^5.37.0", + "jsdom": "^26.1.0", + "postcss": "^8.5.6", + "prettier": "^3.6.2", + "terser": "^5.43.1", "vite": "^6.1.6", "vite-plugin-compression2": "^1.0.0", "vue-tsc": "^2.2.0" diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 66142514..401be2b7 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@chenfengyuan/vue-number-input': specifier: ^2.0.1 - version: 2.0.1(vue@3.5.13(typescript@5.6.3)) + version: 2.0.1(vue@3.5.17(typescript@5.6.3)) '@vueuse/core': specifier: ^12.5.0 version: 12.5.0(typescript@5.6.3) @@ -18,13 +18,13 @@ importers: specifier: ^12.5.0 version: 12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3) ace-builds: - specifier: ^1.37.5 - version: 1.37.5 + specifier: ^1.43.2 + version: 1.43.2 core-js: - specifier: ^3.40.0 - version: 3.40.0 + specifier: ^3.44.0 + version: 3.44.0 dayjs: - specifier: ^1.11.10 + specifier: ^1.11.13 version: 1.11.13 dompurify: specifier: ^3.2.6 @@ -48,20 +48,20 @@ importers: specifier: ^15.0.6 version: 15.0.6 material-icons: - specifier: ^1.13.13 - version: 1.13.13 + specifier: ^1.13.14 + version: 1.13.14 normalize.css: specifier: ^8.0.1 version: 8.0.1 pinia: specifier: ^2.3.1 - version: 2.3.1(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) + version: 2.3.1(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)) pretty-bytes: specifier: ^6.1.1 version: 6.1.1 qrcode.vue: - specifier: ^3.4.1 - version: 3.6.0(vue@3.5.13(typescript@5.6.3)) + specifier: ^3.6.0 + version: 3.6.0(vue@3.5.17(typescript@5.6.3)) tus-js-client: specifier: ^4.3.1 version: 4.3.1 @@ -69,45 +69,45 @@ importers: specifier: ^3.1.0 version: 3.1.0 video.js: - specifier: ^8.21.0 - version: 8.21.0 + specifier: ^8.23.3 + version: 8.23.3 videojs-hotkeys: specifier: ^0.2.28 version: 0.2.30 videojs-mobile-ui: specifier: ^1.1.1 - version: 1.1.1(video.js@8.21.0) + version: 1.1.1(video.js@8.23.3) vue: - specifier: ^3.4.21 - version: 3.5.13(typescript@5.6.3) + specifier: ^3.5.17 + version: 3.5.17(typescript@5.6.3) vue-final-modal: - specifier: ^4.5.4 - version: 4.5.5(@vueuse/core@12.5.0(typescript@5.6.3))(@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3))(focus-trap@7.6.2)(vue@3.5.13(typescript@5.6.3)) + specifier: ^4.5.5 + version: 4.5.5(@vueuse/core@12.5.0(typescript@5.6.3))(@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3))(focus-trap@7.6.2)(vue@3.5.17(typescript@5.6.3)) vue-i18n: - specifier: ^11.1.2 - version: 11.1.2(vue@3.5.13(typescript@5.6.3)) + specifier: ^11.1.9 + version: 11.1.9(vue@3.5.17(typescript@5.6.3)) vue-lazyload: specifier: ^3.0.0 version: 3.0.0 vue-reader: specifier: ^1.2.17 - version: 1.2.17(vue@3.5.13(typescript@5.6.3)) + version: 1.2.17(vue@3.5.17(typescript@5.6.3)) vue-router: - specifier: ^4.3.0 - version: 4.5.0(vue@3.5.13(typescript@5.6.3)) + specifier: ^4.5.1 + version: 4.5.1(vue@3.5.17(typescript@5.6.3)) vue-toastification: specifier: ^2.0.0-rc.5 - version: 2.0.0-rc.5(vue@3.5.13(typescript@5.6.3)) + version: 2.0.0-rc.5(vue@3.5.17(typescript@5.6.3)) devDependencies: '@intlify/unplugin-vue-i18n': - specifier: ^6.0.3 - version: 6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3)) + specifier: ^6.0.8 + version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3)) '@playwright/test': - specifier: ^1.50.0 - version: 1.50.0 + specifier: ^1.54.1 + version: 1.54.1 '@tsconfig/node22': - specifier: ^22.0.0 - version: 22.0.0 + specifier: ^22.0.2 + version: 22.0.2 '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 @@ -115,56 +115,59 @@ importers: specifier: ^22.10.10 version: 22.10.10 '@typescript-eslint/eslint-plugin': - specifier: ^8.21.0 - version: 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.6.3))(eslint@9.19.0)(typescript@5.6.3) + specifier: ^8.37.0 + version: 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3))(eslint@9.31.0)(typescript@5.6.3) '@vitejs/plugin-legacy': specifier: ^6.0.0 - version: 6.0.0(terser@5.37.0)(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)) + version: 6.0.0(terser@5.43.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)) '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.2.1(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.1(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3)) '@vue/eslint-config-prettier': specifier: ^10.2.0 - version: 10.2.0(eslint@9.19.0)(prettier@3.4.2) + version: 10.2.0(eslint@9.31.0)(prettier@3.6.2) '@vue/eslint-config-typescript': - specifier: ^14.3.0 - version: 14.3.0(eslint-plugin-vue@9.32.0(eslint@9.19.0))(eslint@9.19.0)(typescript@5.6.3) + specifier: ^14.6.0 + version: 14.6.0(eslint-plugin-vue@9.32.0(eslint@9.31.0))(eslint@9.31.0)(typescript@5.6.3) '@vue/tsconfig': specifier: ^0.7.0 - version: 0.7.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) + version: 0.7.0(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)) autoprefixer: - specifier: ^10.4.19 - version: 10.4.20(postcss@8.5.1) + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.6) concurrently: - specifier: ^9.1.2 - version: 9.1.2 + specifier: ^9.2.0 + version: 9.2.0 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.31.0 + version: 9.31.0 + eslint-config-prettier: + specifier: ^10.1.5 + version: 10.1.5(eslint@9.31.0) eslint-plugin-prettier: - specifier: ^5.2.3 - version: 5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2) + specifier: ^5.5.1 + version: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2) eslint-plugin-vue: specifier: ^9.24.0 - version: 9.32.0(eslint@9.19.0) + version: 9.32.0(eslint@9.31.0) jsdom: - specifier: ^26.0.0 - version: 26.0.0 + specifier: ^26.1.0 + version: 26.1.0 postcss: - specifier: ^8.5.1 - version: 8.5.1 + specifier: ^8.5.6 + version: 8.5.6 prettier: - specifier: ^3.4.2 - version: 3.4.2 + specifier: ^3.6.2 + version: 3.6.2 terser: - specifier: ^5.37.0 - version: 5.37.0 + specifier: ^5.43.1 + version: 5.43.1 vite: specifier: ^6.1.6 - version: 6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0) + version: 6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) vite-plugin-compression2: specifier: ^1.0.0 - version: 1.3.3(rollup@4.40.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)) + version: 1.3.3(rollup@4.40.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)) vue-tsc: specifier: ^2.2.0 version: 2.2.0(typescript@5.6.3) @@ -269,10 +272,18 @@ packages: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} @@ -295,6 +306,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} @@ -684,6 +700,10 @@ packages: resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + engines: {node: '>=6.9.0'} + '@chenfengyuan/vue-number-input@2.0.1': resolution: {integrity: sha512-/jqmfmFulFOGlozts0Sf2GCESMRYVTfZZSz2Tf4n9O5DKjqMi5B/MfRzm5H5A57WuG3L80yXFWFN+XeACKaIhQ==} peerDependencies: @@ -873,32 +893,42 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.19.0': - resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/js@9.31.0': + resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -917,12 +947,12 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@intlify/bundle-utils@10.0.0': - resolution: {integrity: sha512-BR5yLOkF2dzrARTbAg7RGAIPcx9Aark7p1K/0O285F7rfzso9j2dsa+S4dA67clZ0rToZ10NSSTfbyUptVu7Bg==} + '@intlify/bundle-utils@10.0.1': + resolution: {integrity: sha512-WkaXfSevtpgtUR4t8K2M6lbR7g03mtOxFeh+vXp5KExvPqS12ppaRj1QxzwRuRI5VUto54A22BjKoBMLyHILWQ==} engines: {node: '>= 18'} peerDependencies: petite-vue-i18n: '*' @@ -933,16 +963,16 @@ packages: vue-i18n: optional: true - '@intlify/core-base@11.1.2': - resolution: {integrity: sha512-nmG512G8QOABsserleechwHGZxzKSAlggGf9hQX0nltvSwyKNVuB/4o6iFeG2OnjXK253r8p8eSDOZf8PgFdWw==} + '@intlify/core-base@11.1.9': + resolution: {integrity: sha512-Lrdi4wp3XnGhWmB/mMD/XtfGUw1Jt+PGpZI/M63X1ZqhTDjNHRVCs/i8vv8U1cwaj1A9fb0bkCQHLSL0SK+pIQ==} engines: {node: '>= 16'} '@intlify/message-compiler@11.1.2': resolution: {integrity: sha512-T/xbNDzi+Yv0Qn2Dfz2CWCAJiwNgU5d95EhhAEf4YmOgjCKktpfpiUSmLcBvK1CtLpPQ85AMMQk/2NCcXnNj1g==} engines: {node: '>= 16'} - '@intlify/message-compiler@12.0.0-alpha.2': - resolution: {integrity: sha512-PD9C+oQbb7BF52hec0+vLnScaFkvnfX+R7zSbODYuRo/E2niAtGmHd0wPvEMsDhf9Z9b8f/qyDsVeZnD/ya9Ug==} + '@intlify/message-compiler@11.1.9': + resolution: {integrity: sha512-84SNs3Ikjg0rD1bOuchzb3iK1vR2/8nxrkyccIl5DjFTeMzE/Fxv6X+A7RN5ZXjEWelc1p5D4kHA6HEOhlKL5Q==} engines: {node: '>= 16'} '@intlify/shared@11.1.2': @@ -953,12 +983,12 @@ packages: resolution: {integrity: sha512-4yZeMt2Aa/7n5Ehy4KalUlvt3iRLcg1tq9IBVfOgkyWFArN4oygn6WxgGIFibP3svpaH8DarbNaottq+p0gUZQ==} engines: {node: '>= 16'} - '@intlify/shared@12.0.0-alpha.2': - resolution: {integrity: sha512-P2DULVX9nz3y8zKNqLw9Es1aAgQ1JGC+kgpx5q7yLmrnAKkPR5MybQWoEhxanefNJgUY5ehsgo+GKif59SrncA==} + '@intlify/shared@11.1.9': + resolution: {integrity: sha512-H/83xgU1l8ox+qG305p6ucmoy93qyjIPnvxGWRA7YdOoHe1tIiW9IlEu4lTdsOR7cfP1ecrwyflQSqXdXBacXA==} engines: {node: '>= 16'} - '@intlify/unplugin-vue-i18n@6.0.3': - resolution: {integrity: sha512-9ZDjBlhUHtgjRl23TVcgfJttgu8cNepwVhWvOv3mUMRDAhjW0pur1mWKEUKr1I8PNwE4Gvv2IQ1xcl4RL0nG0g==} + '@intlify/unplugin-vue-i18n@6.0.8': + resolution: {integrity: sha512-Vvm3KhjE6TIBVUQAk37rBiaYy2M5OcWH0ZcI1XKEsOTeN1o0bErk+zeuXmcrcMc/73YggfI8RoxOUz9EB/69JQ==} engines: {node: '>= 18'} peerDependencies: petite-vue-i18n: '*' @@ -1025,12 +1055,12 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.50.0': - resolution: {integrity: sha512-ZGNXbt+d65EGjBORQHuYKj+XhCewlwpnSd/EDuLPZGSiEWmgOJB5RmMCCYGy5aMfTs9wx61RivfDKi8H/hcMvw==} + '@playwright/test@1.54.1': + resolution: {integrity: sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==} engines: {node: '>=18'} hasBin: true @@ -1152,8 +1182,8 @@ packages: cpu: [x64] os: [win32] - '@tsconfig/node22@22.0.0': - resolution: {integrity: sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg==} + '@tsconfig/node22@22.0.2': + resolution: {integrity: sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==} '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1183,55 +1213,85 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@typescript-eslint/eslint-plugin@8.21.0': - resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} + '@typescript-eslint/eslint-plugin@8.37.0': + resolution: {integrity: sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.37.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.21.0': - resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} + '@typescript-eslint/parser@8.37.0': + resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.37.0': + resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/scope-manager@8.21.0': resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.21.0': - resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} + '@typescript-eslint/scope-manager@8.37.0': + resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.37.0': + resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.37.0': + resolution: {integrity: sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@8.21.0': resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.37.0': + resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.21.0': resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.21.0': - resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} + '@typescript-eslint/typescript-estree@8.37.0': + resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.37.0': + resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@8.21.0': resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@videojs/http-streaming@3.16.2': - resolution: {integrity: sha512-fvt4ko7FknxiT9FnjyNQt6q2px+awrkM+Orv7IB/4gldvj94u4fowGfmNHynnvNTPgPkdxHklGmFLGfclYw8HA==} + '@typescript-eslint/visitor-keys@8.37.0': + resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@videojs/http-streaming@3.17.0': + resolution: {integrity: sha512-Ch1P3tvvIEezeZXyK11UfWgp4cWKX4vIhZ30baN/lRinqdbakZ5hiAI3pGjRy3d+q/Epyc8Csz5xMdKNNGYpcw==} engines: {node: '>=8', npm: '>=5'} peerDependencies: video.js: ^8.19.0 @@ -1269,14 +1329,20 @@ packages: '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.17': + resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + '@vue/compiler-dom@3.5.13': resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-dom@3.5.17': + resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-sfc@3.5.17': + resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} + + '@vue/compiler-ssr@3.5.17': + resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -1290,12 +1356,12 @@ packages: eslint: '>= 8.21.0' prettier: '>= 3.0.0' - '@vue/eslint-config-typescript@14.3.0': - resolution: {integrity: sha512-bOreIxlSC/xsUdhDdKIHb1grwJah+IokNeJ50LqA1StdOHeSPUxSIPNxyKgRx4YdjhyzC6TKtrCf6yYK99x3Uw==} + '@vue/eslint-config-typescript@14.6.0': + resolution: {integrity: sha512-UpiRY/7go4Yps4mYCjkvlIbVWmn9YvPGQDxTAlcKLphyaD77LjIu3plH4Y9zNT0GB4f3K5tMmhhtRhPOgrQ/bQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^9.10.0 - eslint-plugin-vue: ^9.28.0 + eslint-plugin-vue: ^9.28.0 || ^10.0.0 typescript: '>=4.8.4' peerDependenciesMeta: typescript: @@ -1309,23 +1375,26 @@ packages: typescript: optional: true - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.17': + resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.17': + resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.17': + resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + '@vue/server-renderer@3.5.17': + resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} peerDependencies: - vue: 3.5.13 + vue: 3.5.17 '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.17': + resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + '@vue/tsconfig@0.7.0': resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} peerDependencies: @@ -1396,8 +1465,8 @@ packages: resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} - ace-builds@1.37.5: - resolution: {integrity: sha512-VMJ4Cnhq6L9dwvOCyuyyvQuiVTSwdZC7zDKJBBBJJax0wGQ7MvzQZFoi0gMmCm2I4Zuv/ZbtwU/dlglIhCNLhw==} + ace-builds@1.43.2: + resolution: {integrity: sha512-3wzJUJX0RpMc03jo0V8Q3bSb/cKPnS7Nqqw8fVHsCCHweKMiTIxT3fP46EhjmVy6MCuxwP801ere+RW245phGw==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1409,6 +1478,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + aes-decrypter@4.0.2: resolution: {integrity: sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==} @@ -1433,11 +1507,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -1486,6 +1557,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1496,6 +1572,9 @@ packages: caniuse-lite@1.0.30001685: resolution: {integrity: sha512-e/kJN1EMyHQzgcMEEgoo+YTCO1NGCmIYHk5Qk8jT6AazWemS5QFKJ5ShCJlH3GZrNIdZofcNCEwZqbMjjKzmnA==} + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1514,18 +1593,14 @@ packages: combine-errors@3.0.3: resolution: {integrity: sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@9.1.2: - resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + concurrently@9.2.0: + resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} engines: {node: '>=18'} hasBin: true @@ -1538,8 +1613,8 @@ packages: core-js-compat@3.39.0: resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} - core-js@3.40.0: - resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + core-js@3.44.0: + resolution: {integrity: sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1601,16 +1676,15 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} dompurify@3.2.6: resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + electron-to-chromium@1.5.183: + resolution: {integrity: sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==} + electron-to-chromium@1.5.67: resolution: {integrity: sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==} @@ -1653,19 +1727,19 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.0.1: - resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.2.3: - resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} + eslint-plugin-prettier@5.5.1: + resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' - eslint-config-prettier: '*' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' prettier: '>=3.0.0' peerDependenciesMeta: '@types/eslint': @@ -1687,6 +1761,10 @@ packages: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1695,8 +1773,12 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.19.0: - resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.31.0: + resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1713,6 +1795,10 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1792,10 +1878,6 @@ packages: focus-trap@7.6.2: resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==} - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -1881,6 +1963,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -1941,8 +2027,8 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@26.0.0: - resolution: {integrity: sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} engines: {node: '>=18'} peerDependencies: canvas: ^3.0.0 @@ -2048,6 +2134,9 @@ packages: magic-string@0.30.14: resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + marked@15.0.6: resolution: {integrity: sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==} engines: {node: '>= 18'} @@ -2056,8 +2145,8 @@ packages: marks-pane@1.0.9: resolution: {integrity: sha512-Ahs4oeG90tbdPWwAJkAAoHg2lRR8lAs9mZXETNPO9hYg3AkjUJBKi1NQ4aaIQZVGrig7c/3NUV1jANl8rFTeMg==} - material-icons@1.13.13: - resolution: {integrity: sha512-jYh0VkYvsYfArOIB1LqmmoXiONBk5YaIf0f8b5pTNQdVDl4b7htoqXuQF7G03fqFQpwvv1FcMdQ1rrLWd9ftWg==} + material-icons@1.13.14: + resolution: {integrity: sha512-kZOfc7xCC0rAT8Q3DQixYAeT+tBqZnxkseQtp2bxBxz7q5pMAC+wmit7vJn1g/l7wRU+HEPq23gER4iPjGs5Cg==} meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} @@ -2071,14 +2160,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} @@ -2112,11 +2193,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2126,6 +2202,9 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} @@ -2211,13 +2290,13 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.50.0: - resolution: {integrity: sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ==} + playwright-core@1.54.1: + resolution: {integrity: sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==} engines: {node: '>=18'} hasBin: true - playwright@1.50.0: - resolution: {integrity: sha512-+GinGfGTrd2IfX1TA4N2gNmeIksSb+IAe589ZH+FlmpV3MYTx6+buChGIuDLQwrGNCw2lWibqV50fU510N7S+w==} + playwright@1.54.1: + resolution: {integrity: sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==} engines: {node: '>=18'} hasBin: true @@ -2228,12 +2307,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2244,8 +2319,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true @@ -2420,8 +2495,8 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} systemjs@6.15.1: @@ -2433,8 +2508,8 @@ packages: tar-mini@0.2.0: resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==} - terser@5.37.0: - resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true @@ -2449,12 +2524,12 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@5.1.0: - resolution: {integrity: sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} tree-kill@1.2.2: @@ -2467,6 +2542,12 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2485,12 +2566,12 @@ packages: type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typescript-eslint@8.21.0: - resolution: {integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==} + typescript-eslint@8.37.0: + resolution: {integrity: sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} @@ -2529,6 +2610,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2541,8 +2628,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - video.js@8.21.0: - resolution: {integrity: sha512-zcwerRb257QAuWfi8NH9yEX7vrGKFthjfcONmOQ4lxFRpDAbAi+u5LAjCjMWqhJda6zEmxkgdDpOMW3Y21QpXA==} + video.js@8.23.3: + resolution: {integrity: sha512-Toe0VLlDZcUhiaWfcePS1OEdT3ATfktm0hk/PELfD7zUoPDHeT+cJf/wZmCy5M5eGVwtGUg25RWPCj1L/1XufA==} videojs-contrib-quality-levels@4.1.0: resolution: {integrity: sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==} @@ -2624,6 +2711,12 @@ packages: '@vue/composition-api': optional: true + vue-eslint-parser@10.2.0: + resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + vue-eslint-parser@9.4.3: resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} @@ -2638,8 +2731,8 @@ packages: focus-trap: '>=7.2.0' vue: '>=3.2.0' - vue-i18n@11.1.2: - resolution: {integrity: sha512-MfdkdKGUHN+jkkaMT5Zbl4FpRmN7kfelJIwKoUpJ32ONIxdFhzxZiLTVaAXkAwvH3y9GmWpoiwjDqbPIkPIMFA==} + vue-i18n@11.1.9: + resolution: {integrity: sha512-N9ZTsXdRmX38AwS9F6Rh93RtPkvZTkSy/zNv63FTIwZCUbLwwrpqlKz9YQuzFLdlvRdZTnWAUE5jMxr8exdl7g==} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 @@ -2656,8 +2749,8 @@ packages: '@vue/composition-api': optional: true - vue-router@4.5.0: - resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} peerDependencies: vue: ^3.2.0 @@ -2672,8 +2765,8 @@ packages: peerDependencies: typescript: '>=5.0.0' - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + vue@3.5.17: + resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -2699,8 +2792,8 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.1.0: - resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} which@2.0.2: @@ -2931,8 +3024,12 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} '@babel/helper-wrap-function@7.25.9': @@ -2956,6 +3053,10 @@ snapshots: dependencies: '@babel/types': 7.26.7 + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -3452,9 +3553,14 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@chenfengyuan/vue-number-input@2.0.1(vue@3.5.13(typescript@5.6.3))': + '@babel/types@7.28.1': dependencies: - vue: 3.5.13(typescript@5.6.3) + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@chenfengyuan/vue-number-input@2.0.1(vue@3.5.17(typescript@5.6.3))': + dependencies: + vue: 3.5.17(typescript@5.6.3) '@csstools/color-helpers@5.0.1': {} @@ -3551,30 +3657,37 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.31.0)': dependencies: - eslint: 9.19.0 + eslint: 9.31.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': + dependencies: + eslint: 9.31.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.21.0': dependencies: - '@eslint/object-schema': 2.1.5 + '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0 - espree: 10.3.0 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -3584,13 +3697,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.19.0': {} + '@eslint/js@9.31.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.3.3': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -3604,12 +3717,12 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.3': {} - '@intlify/bundle-utils@10.0.0(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))': + '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))': dependencies: - '@intlify/message-compiler': 12.0.0-alpha.2 - '@intlify/shared': 12.0.0-alpha.2 + '@intlify/message-compiler': 11.1.2 + '@intlify/shared': 11.1.7 acorn: 8.14.0 escodegen: 2.1.0 estree-walker: 2.0.2 @@ -3618,35 +3731,35 @@ snapshots: source-map-js: 1.2.1 yaml-eslint-parser: 1.2.3 optionalDependencies: - vue-i18n: 11.1.2(vue@3.5.13(typescript@5.6.3)) + vue-i18n: 11.1.9(vue@3.5.17(typescript@5.6.3)) - '@intlify/core-base@11.1.2': + '@intlify/core-base@11.1.9': dependencies: - '@intlify/message-compiler': 11.1.2 - '@intlify/shared': 11.1.2 + '@intlify/message-compiler': 11.1.9 + '@intlify/shared': 11.1.9 '@intlify/message-compiler@11.1.2': dependencies: '@intlify/shared': 11.1.2 source-map-js: 1.2.1 - '@intlify/message-compiler@12.0.0-alpha.2': + '@intlify/message-compiler@11.1.9': dependencies: - '@intlify/shared': 12.0.0-alpha.2 + '@intlify/shared': 11.1.9 source-map-js: 1.2.1 '@intlify/shared@11.1.2': {} '@intlify/shared@11.1.7': {} - '@intlify/shared@12.0.0-alpha.2': {} + '@intlify/shared@11.1.9': {} - '@intlify/unplugin-vue-i18n@6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))': + '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) - '@intlify/bundle-utils': 10.0.0(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3))) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) + '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3))) '@intlify/shared': 11.1.7 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3)) + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3)) '@rollup/pluginutils': 5.1.4(rollup@4.40.1) '@typescript-eslint/scope-manager': 8.21.0 '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3) @@ -3658,9 +3771,9 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 unplugin: 1.16.1 - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) optionalDependencies: - vue-i18n: 11.1.2(vue@3.5.13(typescript@5.6.3)) + vue-i18n: 11.1.9(vue@3.5.17(typescript@5.6.3)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -3668,14 +3781,14 @@ snapshots: - supports-color - typescript - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': dependencies: '@babel/parser': 7.26.7 optionalDependencies: '@intlify/shared': 11.1.7 - '@vue/compiler-dom': 3.5.13 - vue: 3.5.13(typescript@5.6.3) - vue-i18n: 11.1.2(vue@3.5.13(typescript@5.6.3)) + '@vue/compiler-dom': 3.5.17 + vue: 3.5.17(typescript@5.6.3) + vue-i18n: 11.1.9(vue@3.5.17(typescript@5.6.3)) '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -3717,11 +3830,11 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 - '@pkgr/core@0.1.1': {} + '@pkgr/core@0.2.7': {} - '@playwright/test@1.50.0': + '@playwright/test@1.54.1': dependencies: - playwright: 1.50.0 + playwright: 1.54.1 '@rollup/pluginutils@5.1.3(rollup@4.40.1)': dependencies: @@ -3733,7 +3846,7 @@ snapshots: '@rollup/pluginutils@5.1.4(rollup@4.40.1)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: @@ -3799,7 +3912,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.1': optional: true - '@tsconfig/node22@22.0.0': {} + '@tsconfig/node22@22.0.2': {} '@types/estree@1.0.6': {} @@ -3826,31 +3939,40 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.6.3))(eslint@9.19.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3))(eslint@9.31.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.21.0(eslint@9.19.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@9.19.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.21.0 - eslint: 9.19.0 + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/type-utils': 8.37.0(eslint@9.31.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.37.0 + eslint: 9.31.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.6.3) + ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.0 + eslint: 9.31.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.37.0(typescript@5.6.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.6.3) + '@typescript-eslint/types': 8.37.0 debug: 4.4.0 - eslint: 9.19.0 typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -3860,19 +3982,31 @@ snapshots: '@typescript-eslint/types': 8.21.0 '@typescript-eslint/visitor-keys': 8.21.0 - '@typescript-eslint/type-utils@8.21.0(eslint@9.19.0)(typescript@5.6.3)': + '@typescript-eslint/scope-manager@8.37.0': dependencies: - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.6.3)': + dependencies: + typescript: 5.6.3 + + '@typescript-eslint/type-utils@8.37.0(eslint@9.31.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0)(typescript@5.6.3) debug: 4.4.0 - eslint: 9.19.0 - ts-api-utils: 2.0.0(typescript@5.6.3) + eslint: 9.31.0 + ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.21.0': {} + '@typescript-eslint/types@8.37.0': {} + '@typescript-eslint/typescript-estree@8.21.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.21.0 @@ -3887,13 +4021,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.21.0(eslint@9.19.0)(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3) - eslint: 9.19.0 + '@typescript-eslint/project-service': 8.37.0(typescript@5.6.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.6.3) + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 2.1.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.37.0(eslint@9.31.0)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) + eslint: 9.31.0 typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -3903,7 +4053,12 @@ snapshots: '@typescript-eslint/types': 8.21.0 eslint-visitor-keys: 4.2.0 - '@videojs/http-streaming@3.16.2(video.js@8.21.0)': + '@typescript-eslint/visitor-keys@8.37.0': + dependencies: + '@typescript-eslint/types': 8.37.0 + eslint-visitor-keys: 4.2.1 + + '@videojs/http-streaming@3.17.0(video.js@8.23.3)': dependencies: '@babel/runtime': 7.26.7 '@videojs/vhs-utils': 4.1.1 @@ -3912,7 +4067,7 @@ snapshots: m3u8-parser: 7.2.0 mpd-parser: 1.3.1 mux.js: 7.1.0 - video.js: 8.21.0 + video.js: 8.23.3 '@videojs/vhs-utils@4.1.1': dependencies: @@ -3925,25 +4080,25 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-legacy@6.0.0(terser@5.37.0)(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))': + '@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.0 '@babel/preset-env': 7.26.0(@babel/core@7.26.0) browserslist: 4.24.2 browserslist-to-esbuild: 2.1.1(browserslist@4.24.2) - core-js: 3.40.0 + core-js: 3.44.0 magic-string: 0.30.14 regenerator-runtime: 0.14.1 systemjs: 6.15.1 - terser: 5.37.0 - vite: 6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0) + terser: 5.43.1 + vite: 6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.1(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))': dependencies: - vite: 6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0) - vue: 3.5.13(typescript@5.6.3) + vite: 6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) + vue: 3.5.17(typescript@5.6.3) '@volar/language-core@2.4.11': dependencies: @@ -3965,27 +4120,40 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.17': + dependencies: + '@babel/parser': 7.28.0 + '@vue/shared': 3.5.17 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.13': dependencies: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 - '@vue/compiler-sfc@3.5.13': + '@vue/compiler-dom@3.5.17': dependencies: - '@babel/parser': 7.26.2 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.17 + '@vue/shared': 3.5.17 + + '@vue/compiler-sfc@3.5.17': + dependencies: + '@babel/parser': 7.28.0 + '@vue/compiler-core': 3.5.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 estree-walker: 2.0.2 - magic-string: 0.30.14 - postcss: 8.5.3 + magic-string: 0.30.17 + postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.13': + '@vue/compiler-ssr@3.5.17': dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.17 + '@vue/shared': 3.5.17 '@vue/compiler-vue2@2.7.16': dependencies: @@ -3994,23 +4162,23 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/eslint-config-prettier@10.2.0(eslint@9.19.0)(prettier@3.4.2)': + '@vue/eslint-config-prettier@10.2.0(eslint@9.31.0)(prettier@3.6.2)': dependencies: - eslint: 9.19.0 - eslint-config-prettier: 10.0.1(eslint@9.19.0) - eslint-plugin-prettier: 5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2) - prettier: 3.4.2 + eslint: 9.31.0 + eslint-config-prettier: 10.1.5(eslint@9.31.0) + eslint-plugin-prettier: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2) + prettier: 3.6.2 transitivePeerDependencies: - '@types/eslint' - '@vue/eslint-config-typescript@14.3.0(eslint-plugin-vue@9.32.0(eslint@9.19.0))(eslint@9.19.0)(typescript@5.6.3)': + '@vue/eslint-config-typescript@14.6.0(eslint-plugin-vue@9.32.0(eslint@9.31.0))(eslint@9.31.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.6.3) - eslint: 9.19.0 - eslint-plugin-vue: 9.32.0(eslint@9.19.0) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0)(typescript@5.6.3) + eslint: 9.31.0 + eslint-plugin-vue: 9.32.0(eslint@9.31.0) fast-glob: 3.3.3 - typescript-eslint: 8.21.0(eslint@9.19.0)(typescript@5.6.3) - vue-eslint-parser: 9.4.3(eslint@9.19.0) + typescript-eslint: 8.37.0(eslint@9.31.0)(typescript@5.6.3) + vue-eslint-parser: 10.2.0(eslint@9.31.0) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -4029,41 +4197,43 @@ snapshots: optionalDependencies: typescript: 5.6.3 - '@vue/reactivity@3.5.13': + '@vue/reactivity@3.5.17': dependencies: - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.17 - '@vue/runtime-core@3.5.13': + '@vue/runtime-core@3.5.17': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/runtime-dom@3.5.13': + '@vue/runtime-dom@3.5.17': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.17 + '@vue/runtime-core': 3.5.17 + '@vue/shared': 3.5.17 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.3))': + '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.6.3))': dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.6.3) + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 + vue: 3.5.17(typescript@5.6.3) '@vue/shared@3.5.13': {} - '@vue/tsconfig@0.7.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3))': + '@vue/shared@3.5.17': {} + + '@vue/tsconfig@0.7.0(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3))': optionalDependencies: typescript: 5.6.3 - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) '@vueuse/core@12.5.0(typescript@5.6.3)': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 12.5.0 '@vueuse/shared': 12.5.0(typescript@5.6.3) - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) transitivePeerDependencies: - typescript @@ -4071,7 +4241,7 @@ snapshots: dependencies: '@vueuse/core': 12.5.0(typescript@5.6.3) '@vueuse/shared': 12.5.0(typescript@5.6.3) - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) optionalDependencies: focus-trap: 7.6.2 jwt-decode: 4.0.0 @@ -4082,7 +4252,7 @@ snapshots: '@vueuse/shared@12.5.0(typescript@5.6.3)': dependencies: - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) transitivePeerDependencies: - typescript @@ -4090,14 +4260,20 @@ snapshots: '@xmldom/xmldom@0.8.10': {} - ace-builds@1.37.5: {} + ace-builds@1.43.2: {} acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn@8.14.0: {} + acorn@8.15.0: {} + aes-decrypter@4.0.2: dependencies: '@babel/runtime': 7.26.7 @@ -4124,16 +4300,14 @@ snapshots: argparse@2.0.1: {} - asynckit@0.4.0: {} - - autoprefixer@10.4.20(postcss@8.5.1): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001685 + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.1 + postcss: 8.5.6 postcss-value-parser: 4.2.0 babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): @@ -4189,12 +4363,21 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.183 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + buffer-from@1.1.2: {} callsites@3.1.0: {} caniuse-lite@1.0.30001685: {} + caniuse-lite@1.0.30001727: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -4217,15 +4400,11 @@ snapshots: custom-error-instance: 2.1.1 lodash.uniqby: 4.5.0 - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@2.20.3: {} concat-map@0.0.1: {} - concurrently@9.1.2: + concurrently@9.2.0: dependencies: chalk: 4.1.2 lodash: 4.17.21 @@ -4243,7 +4422,7 @@ snapshots: dependencies: browserslist: 4.24.2 - core-js@3.40.0: {} + core-js@3.44.0: {} core-util-is@1.0.3: {} @@ -4272,7 +4451,7 @@ snapshots: data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 - whatwg-url: 14.1.0 + whatwg-url: 14.2.0 dayjs@1.11.13: {} @@ -4290,14 +4469,14 @@ snapshots: deep-is@0.1.4: {} - delayed-stream@1.0.0: {} - dom-walk@0.1.2: {} dompurify@3.2.6: optionalDependencies: '@types/trusted-types': 2.0.7 + electron-to-chromium@1.5.183: {} + electron-to-chromium@1.5.67: {} emoji-regex@8.0.0: {} @@ -4308,7 +4487,7 @@ snapshots: dependencies: '@types/localforage': 0.0.34 '@xmldom/xmldom': 0.7.13 - core-js: 3.40.0 + core-js: 3.44.0 event-emitter: 0.3.5 jszip: 3.10.1 localforage: 1.10.0 @@ -4374,29 +4553,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.1(eslint@9.19.0): + eslint-config-prettier@10.1.5(eslint@9.31.0): dependencies: - eslint: 9.19.0 + eslint: 9.31.0 - eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2): + eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.5(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2): dependencies: - eslint: 9.19.0 - prettier: 3.4.2 + eslint: 9.31.0 + prettier: 3.6.2 prettier-linter-helpers: 1.0.0 - synckit: 0.9.2 + synckit: 0.11.8 optionalDependencies: - eslint-config-prettier: 10.0.1(eslint@9.19.0) + eslint-config-prettier: 10.1.5(eslint@9.31.0) - eslint-plugin-vue@9.32.0(eslint@9.19.0): + eslint-plugin-vue@9.32.0(eslint@9.31.0): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) - eslint: 9.19.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) + eslint: 9.31.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.6.3 - vue-eslint-parser: 9.4.3(eslint@9.19.0) + vue-eslint-parser: 9.4.3(eslint@9.31.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -4411,32 +4590,40 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.0: {} - eslint@9.19.0: + eslint-visitor-keys@4.2.1: {} + + eslint@9.31.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.10.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.19.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.15.1 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.31.0 + '@eslint/plugin-kit': 0.3.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -4467,6 +4654,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + espree@9.6.1: dependencies: acorn: 8.14.0 @@ -4544,12 +4737,6 @@ snapshots: dependencies: tabbable: 6.2.0 - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - fraction.js@4.3.7: {} fsevents@2.3.2: @@ -4621,6 +4808,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + immediate@3.0.6: {} import-fresh@3.3.0: @@ -4664,12 +4853,11 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@26.0.0: + jsdom@26.1.0: dependencies: cssstyle: 4.2.1 data-urls: 5.0.0 decimal.js: 10.5.0 - form-data: 4.0.1 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -4679,12 +4867,12 @@ snapshots: rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 5.1.0 + tough-cookie: 5.1.2 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 - whatwg-url: 14.1.0 + whatwg-url: 14.2.0 ws: 8.18.0 xml-name-validator: 5.0.0 transitivePeerDependencies: @@ -4793,11 +4981,15 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + marked@15.0.6: {} marks-pane@1.0.9: {} - material-icons@1.13.13: {} + material-icons@1.13.14: {} meow@13.2.0: {} @@ -4808,12 +5000,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - min-document@2.19.0: dependencies: dom-walk: 0.1.2 @@ -4851,14 +5037,14 @@ snapshots: nanoid@3.3.11: {} - nanoid@3.3.8: {} - natural-compare@1.4.0: {} next-tick@1.1.0: {} node-releases@2.0.18: {} + node-releases@2.0.19: {} + normalize-range@0.1.2: {} normalize.css@8.0.1: {} @@ -4916,11 +5102,11 @@ snapshots: picomatch@4.0.2: {} - pinia@2.3.1(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)): + pinia@2.3.1(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.6.3) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) + vue: 3.5.17(typescript@5.6.3) + vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3)) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -4936,11 +5122,11 @@ snapshots: mlly: 1.7.4 pathe: 2.0.2 - playwright-core@1.50.0: {} + playwright-core@1.54.1: {} - playwright@1.50.0: + playwright@1.54.1: dependencies: - playwright-core: 1.50.0 + playwright-core: 1.54.1 optionalDependencies: fsevents: 2.3.2 @@ -4951,13 +5137,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.1: - dependencies: - nanoid: 3.3.8 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - postcss@8.5.3: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -4969,7 +5149,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.4.2: {} + prettier@3.6.2: {} pretty-bytes@6.1.1: {} @@ -4985,9 +5165,9 @@ snapshots: punycode@2.3.1: {} - qrcode.vue@3.6.0(vue@3.5.13(typescript@5.6.3)): + qrcode.vue@3.6.0(vue@3.5.17(typescript@5.6.3)): dependencies: - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) querystringify@2.2.0: {} @@ -5143,10 +5323,9 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.9.2: + synckit@0.11.8: dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.8.1 + '@pkgr/core': 0.2.7 systemjs@6.15.1: {} @@ -5154,7 +5333,7 @@ snapshots: tar-mini@0.2.0: {} - terser@5.37.0: + terser@5.43.1: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.14.0 @@ -5171,11 +5350,11 @@ snapshots: dependencies: is-number: 7.0.0 - tough-cookie@5.1.0: + tough-cookie@5.1.2: dependencies: tldts: 6.1.74 - tr46@5.0.0: + tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -5185,6 +5364,10 @@ snapshots: dependencies: typescript: 5.6.3 + ts-api-utils@2.1.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + tslib@2.8.1: {} tus-js-client@4.3.1: @@ -5205,12 +5388,13 @@ snapshots: type@2.7.3: {} - typescript-eslint@8.21.0(eslint@9.19.0)(typescript@5.6.3): + typescript-eslint@8.37.0(eslint@9.31.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.6.3))(eslint@9.19.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.21.0(eslint@9.19.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.6.3) - eslint: 9.19.0 + '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3))(eslint@9.31.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0)(typescript@5.6.3) + eslint: 9.31.0 typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -5243,6 +5427,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -5258,10 +5448,10 @@ snapshots: util-deprecate@1.0.2: {} - video.js@8.21.0: + video.js@8.23.3: dependencies: '@babel/runtime': 7.26.7 - '@videojs/http-streaming': 3.16.2(video.js@8.21.0) + '@videojs/http-streaming': 3.17.0(video.js@8.23.3) '@videojs/vhs-utils': 4.1.1 '@videojs/xhr': 2.7.0 aes-decrypter: 4.0.2 @@ -5269,57 +5459,69 @@ snapshots: m3u8-parser: 7.2.0 mpd-parser: 1.3.1 mux.js: 7.1.0 - videojs-contrib-quality-levels: 4.1.0(video.js@8.21.0) + videojs-contrib-quality-levels: 4.1.0(video.js@8.23.3) videojs-font: 4.2.0 videojs-vtt.js: 0.15.5 - videojs-contrib-quality-levels@4.1.0(video.js@8.21.0): + videojs-contrib-quality-levels@4.1.0(video.js@8.23.3): dependencies: global: 4.4.0 - video.js: 8.21.0 + video.js: 8.23.3 videojs-font@4.2.0: {} videojs-hotkeys@0.2.30: {} - videojs-mobile-ui@1.1.1(video.js@8.21.0): + videojs-mobile-ui@1.1.1(video.js@8.23.3): dependencies: global: 4.4.0 - video.js: 8.21.0 + video.js: 8.23.3 videojs-vtt.js@0.15.5: dependencies: global: 4.4.0 - vite-plugin-compression2@1.3.3(rollup@4.40.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)): + vite-plugin-compression2@1.3.3(rollup@4.40.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)): dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.40.1) tar-mini: 0.2.0 - vite: 6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0) + vite: 6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) transitivePeerDependencies: - rollup - vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0): + vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0): dependencies: esbuild: 0.24.2 - postcss: 8.5.3 + postcss: 8.5.6 rollup: 4.40.1 optionalDependencies: '@types/node': 22.10.10 fsevents: 2.3.3 - terser: 5.37.0 + terser: 5.43.1 yaml: 2.7.0 vscode-uri@3.0.8: {} - vue-demi@0.14.10(vue@3.5.13(typescript@5.6.3)): + vue-demi@0.14.10(vue@3.5.17(typescript@5.6.3)): dependencies: - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) - vue-eslint-parser@9.4.3(eslint@9.19.0): + vue-eslint-parser@10.2.0(eslint@9.31.0): + dependencies: + debug: 4.4.0 + eslint: 9.31.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + vue-eslint-parser@9.4.3(eslint@9.31.0): dependencies: debug: 4.3.7 - eslint: 9.19.0 + eslint: 9.31.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -5329,36 +5531,36 @@ snapshots: transitivePeerDependencies: - supports-color - vue-final-modal@4.5.5(@vueuse/core@12.5.0(typescript@5.6.3))(@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3))(focus-trap@7.6.2)(vue@3.5.13(typescript@5.6.3)): + vue-final-modal@4.5.5(@vueuse/core@12.5.0(typescript@5.6.3))(@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3))(focus-trap@7.6.2)(vue@3.5.17(typescript@5.6.3)): dependencies: '@vueuse/core': 12.5.0(typescript@5.6.3) '@vueuse/integrations': 12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3) focus-trap: 7.6.2 - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) - vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)): + vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)): dependencies: - '@intlify/core-base': 11.1.2 - '@intlify/shared': 11.1.2 + '@intlify/core-base': 11.1.9 + '@intlify/shared': 11.1.9 '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) vue-lazyload@3.0.0: {} - vue-reader@1.2.17(vue@3.5.13(typescript@5.6.3)): + vue-reader@1.2.17(vue@3.5.17(typescript@5.6.3)): dependencies: epubjs: 0.3.93 - vue: 3.5.13(typescript@5.6.3) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) + vue: 3.5.17(typescript@5.6.3) + vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3)) - vue-router@4.5.0(vue@3.5.13(typescript@5.6.3)): + vue-router@4.5.1(vue@3.5.17(typescript@5.6.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) - vue-toastification@2.0.0-rc.5(vue@3.5.13(typescript@5.6.3)): + vue-toastification@2.0.0-rc.5(vue@3.5.17(typescript@5.6.3)): dependencies: - vue: 3.5.13(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) vue-tsc@2.2.0(typescript@5.6.3): dependencies: @@ -5366,13 +5568,13 @@ snapshots: '@vue/language-core': 2.2.0(typescript@5.6.3) typescript: 5.6.3 - vue@3.5.13(typescript@5.6.3): + vue@3.5.17(typescript@5.6.3): dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.6.3)) - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-sfc': 3.5.17 + '@vue/runtime-dom': 3.5.17 + '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.6.3)) + '@vue/shared': 3.5.17 optionalDependencies: typescript: 5.6.3 @@ -5390,9 +5592,9 @@ snapshots: whatwg-mimetype@4.0.0: {} - whatwg-url@14.1.0: + whatwg-url@14.2.0: dependencies: - tr46: 5.0.0 + tr46: 5.1.1 webidl-conversions: 7.0.0 which@2.0.2: diff --git a/frontend/src/components/ProgressBar.vue b/frontend/src/components/ProgressBar.vue index 2cb9474b..bd4f75d4 100644 --- a/frontend/src/components/ProgressBar.vue +++ b/frontend/src/components/ProgressBar.vue @@ -192,7 +192,8 @@ export default { style["position"] = "absolute"; style["top"] = "0"; style["height"] = "100%"; - (style["min-height"] = this.size_px + "px"), (style["z-index"] = "-1"); + ((style["min-height"] = this.size_px + "px"), + (style["z-index"] = "-1")); } return style; diff --git a/go.mod b/go.mod index 09a12662..37f5d6da 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.2 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.3 + github.com/jellydator/ttlcache/v3 v3.4.0 github.com/maruel/natural v1.1.1 github.com/marusama/semaphore/v2 v2.5.0 github.com/mholt/archives v0.1.3 @@ -23,21 +24,21 @@ require ( github.com/spf13/viper v1.20.1 github.com/stretchr/testify v1.10.0 github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce - go.etcd.io/bbolt v1.4.1 - golang.org/x/crypto v0.39.0 - golang.org/x/image v0.28.0 - golang.org/x/text v0.26.0 + go.etcd.io/bbolt v1.4.2 + golang.org/x/crypto v0.40.0 + golang.org/x/image v0.29.0 + golang.org/x/text v0.27.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v2 v2.4.0 ) require ( - github.com/STARRY-S/zip v0.2.1 // indirect - github.com/andybalholm/brotli v1.1.2-0.20250424173009-453214e765f3 // indirect - github.com/asticode/go-astikit v0.55.0 // indirect + github.com/STARRY-S/zip v0.2.3 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect + github.com/asticode/go-astikit v0.56.0 // indirect github.com/asticode/go-astits v1.13.0 // indirect github.com/bodgit/plumbing v1.3.0 // indirect - github.com/bodgit/sevenzip v1.6.0 // indirect + github.com/bodgit/sevenzip v1.6.1 // indirect github.com/bodgit/windows v1.0.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect @@ -46,24 +47,21 @@ require ( github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-viper/mapstructure/v2 v2.3.0 // indirect - github.com/golang/geo v0.0.0-20250606134707-e8fe6a72b492 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/golang/geo v0.0.0-20250707181242-c5087ca84cf4 // indirect github.com/golang/snappy v1.0.0 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jellydator/ttlcache/v3 v3.4.0 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/mikelolasagasti/xz v1.0.1 // indirect - github.com/minio/minlz v1.0.0 // indirect - github.com/nwaples/rardecode/v2 v2.1.0 // indirect + github.com/minio/minlz v1.0.1 // indirect + github.com/nwaples/rardecode/v2 v2.1.1 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/sagikazarmark/locafero v0.9.0 // indirect - github.com/sorairolake/lzip-go v0.3.5 // indirect + github.com/sorairolake/lzip-go v0.3.7 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/cast v1.9.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect @@ -71,9 +69,9 @@ require ( github.com/yusufpapurcu/wmi v1.2.4 // indirect go.uber.org/multierr v1.11.0 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/net v0.41.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 8e5e336c..a9ccaa5b 100644 --- a/go.sum +++ b/go.sum @@ -19,18 +19,18 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/STARRY-S/zip v0.2.1 h1:pWBd4tuSGm3wtpoqRZZ2EAwOmcHK6XFf7bU9qcJXyFg= -github.com/STARRY-S/zip v0.2.1/go.mod h1:xNvshLODWtC4EJ702g7cTYn13G53o1+X9BWnPFpcWV4= +github.com/STARRY-S/zip v0.2.3 h1:luE4dMvRPDOWQdeDdUxUoZkzUIpTccdKdhHHsQJ1fm4= +github.com/STARRY-S/zip v0.2.3/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk= github.com/Sereal/Sereal v0.0.0-20190618215532-0b8ac451a863 h1:BRrxwOZBolJN4gIwvZMJY1tzqBvQgpaZiQRuIDD40jM= github.com/Sereal/Sereal v0.0.0-20190618215532-0b8ac451a863/go.mod h1:D0JMgToj/WdxCgd30Kc1UcA9E+WdZoJqeVOuYW7iTBM= -github.com/andybalholm/brotli v1.1.2-0.20250424173009-453214e765f3 h1:8PmGpDEZl9yDpcdEr6Odf23feCxK3LNUNMxjXg41pZQ= -github.com/andybalholm/brotli v1.1.2-0.20250424173009-453214e765f3/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/asdine/storm/v3 v3.2.1 h1:I5AqhkPK6nBZ/qJXySdI7ot5BlXSZ7qvDY1zAn5ZJac= github.com/asdine/storm/v3 v3.2.1/go.mod h1:LEpXwGt4pIqrE/XcTvCnZHT5MgZCV6Ub9q7yQzOFWr0= github.com/asticode/go-astikit v0.20.0/go.mod h1:h4ly7idim1tNhaVkdVBeXQZEE3L0xblP7fCWbgwipF0= github.com/asticode/go-astikit v0.30.0/go.mod h1:h4ly7idim1tNhaVkdVBeXQZEE3L0xblP7fCWbgwipF0= -github.com/asticode/go-astikit v0.55.0 h1:jdR6djfjAF2SwtFu1hzwkenCRejzOZUREsr3xPAPHeg= -github.com/asticode/go-astikit v0.55.0/go.mod h1:fV43j20UZYfXzP9oBn33udkvCvDvCDhzjVqoLFuuYZE= +github.com/asticode/go-astikit v0.56.0 h1:DmD2p7YnvxiPdF0h+dRmos3bsejNEXbycENsY5JfBqw= +github.com/asticode/go-astikit v0.56.0/go.mod h1:fV43j20UZYfXzP9oBn33udkvCvDvCDhzjVqoLFuuYZE= github.com/asticode/go-astisub v0.34.0 h1:owKNj0A9pc7YVW/rNy2MJZ1mf0L8DTdklZVfyZDhTWI= github.com/asticode/go-astisub v0.34.0/go.mod h1:WTkuSzFB+Bp7wezuSf2Oxulj5A8zu2zLRVFf6bIFQK8= github.com/asticode/go-astits v1.8.0/go.mod h1:DkOWmBNQpnr9mv24KfZjq4JawCFX1FCqjLVGvO0DygQ= @@ -38,8 +38,8 @@ github.com/asticode/go-astits v1.13.0 h1:XOgkaadfZODnyZRR5Y0/DWkA9vrkLLPLeeOvDwf github.com/asticode/go-astits v1.13.0/go.mod h1:QSHmknZ51pf6KJdHKZHJTLlMegIrhega3LPWz3ND/iI= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= -github.com/bodgit/sevenzip v1.6.0 h1:a4R0Wu6/P1o1pP/3VV++aEOcyeBxeO/xE2Y9NSTrr6A= -github.com/bodgit/sevenzip v1.6.0/go.mod h1:zOBh9nJUof7tcrlqJFv1koWRrhz3LbDbUNngkuZxLMc= +github.com/bodgit/sevenzip v1.6.1 h1:kikg2pUMYC9ljU7W9SaqHXhym5HyKm8/M/jd31fYan4= +github.com/bodgit/sevenzip v1.6.1/go.mod h1:GVoYQbEVbOGT8n2pfqCIMRUaRjQ8F9oSqoBEqZh5fQ8= github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4= github.com/bodgit/windows v1.0.1/go.mod h1:a6JLwrB4KrTR5hBpp8FI9/9W9jJfeQ2h4XDXU74ZCdM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -93,15 +93,15 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= -github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/golang/geo v0.0.0-20250606134707-e8fe6a72b492 h1:8mHyM6CCmj/DQAhHXJVTgdkg/6hAH71N7qGEF+t4Bzg= -github.com/golang/geo v0.0.0-20250606134707-e8fe6a72b492/go.mod h1:Vaw7L5b+xa3Rj4/pRtrQkymn3lSBRB/NAEdbF9YEVLA= +github.com/golang/geo v0.0.0-20250707181242-c5087ca84cf4 h1:vCeHcs8N7MOccOOsOVIy1xcYu+kBkA4J5urTgigww7c= +github.com/golang/geo v0.0.0-20250707181242-c5087ca84cf4/go.mod h1:AN0OjM34c3PbjAsX+QNma1nYtJtRxl+s9MZNV7S+efw= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -113,8 +113,9 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -138,11 +139,6 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -179,12 +175,12 @@ github.com/mholt/archives v0.1.3 h1:aEAaOtNra78G+TvV5ohmXrJOAzf++dIlYeDW3N9q458= github.com/mholt/archives v0.1.3/go.mod h1:LUCGp++/IbV/I0Xq4SzcIR6uwgeh2yjnQWamjRQfLTU= github.com/mikelolasagasti/xz v1.0.1 h1:Q2F2jX0RYJUG3+WsM+FJknv+6eVjsjXNDV0KJXZzkD0= github.com/mikelolasagasti/xz v1.0.1/go.mod h1:muAirjiOUxPRXwm9HdDtB3uoRPrGnL85XHtokL9Hcgc= -github.com/minio/minlz v1.0.0 h1:Kj7aJZ1//LlTP1DM8Jm7lNKvvJS2m74gyyXXn3+uJWQ= -github.com/minio/minlz v1.0.0/go.mod h1:qT0aEB35q79LLornSzeDH75LBf3aH1MV+jB5w9Wasec= +github.com/minio/minlz v1.0.1 h1:OUZUzXcib8diiX+JYxyRLIdomyZYzHct6EShOKtQY2A= +github.com/minio/minlz v1.0.1/go.mod h1:qT0aEB35q79LLornSzeDH75LBf3aH1MV+jB5w9Wasec= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/nwaples/rardecode/v2 v2.1.0 h1:JQl9ZoBPDy+nIZGb1mx8+anfHp/LV3NE2MjMiv0ct/U= -github.com/nwaples/rardecode/v2 v2.1.0/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw= +github.com/nwaples/rardecode/v2 v2.1.1 h1:OJaYalXdliBUXPmC8CZGQ7oZDxzX1/5mQmgn0/GASew= +github.com/nwaples/rardecode/v2 v2.1.1/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= @@ -197,16 +193,16 @@ github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/sagikazarmark/locafero v0.9.0 h1:GbgQGNtTrEmddYDSAH9QLRyfAHY12md+8YFTqyMTC9k= github.com/sagikazarmark/locafero v0.9.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPrx49OMO0Bn0hJqk= github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= -github.com/sorairolake/lzip-go v0.3.5 h1:ms5Xri9o1JBIWvOFAorYtUNik6HI3HgBTkISiqu0Cwg= -github.com/sorairolake/lzip-go v0.3.5/go.mod h1:N0KYq5iWrMXI0ZEXKXaS9hCyOjZUQdBDEIbXfoUwbdk= +github.com/sorairolake/lzip-go v0.3.7 h1:vP2uiD/NoklLyzYMdgOWkZME0ulkSfVTTE4MNRKCwNs= +github.com/sorairolake/lzip-go v0.3.7/go.mod h1:THOHr0FlNVCw2eOIEE9shFJAG1QxQg/pf2XUPAmNIqg= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= @@ -222,6 +218,8 @@ github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqj github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -244,12 +242,14 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.4.1 h1:5mOV+HWjIPLEAlUGMsveaUvK2+byZMFOzojoi7bh7uI= -go.etcd.io/bbolt v1.4.1/go.mod h1:c8zu2BnXWTu2XM4XcICtbGSl9cFwsXtcf9zLt2OncM8= +go.etcd.io/bbolt v1.4.2 h1:IrUHp260R8c+zYx/Tm8QZr04CX+qWS5PGfPdevhdm1I= +go.etcd.io/bbolt v1.4.2/go.mod h1:Is8rSHO/b4f3XigBC0lL0+4FwAQv3HXEEIgFMuKHceM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc= @@ -260,8 +260,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -273,8 +273,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.28.0 h1:gdem5JW1OLS4FbkWgLO+7ZeFzYtL3xClb97GaUzYMFE= -golang.org/x/image v0.28.0/go.mod h1:GUJYXtnGKEUgggyzh+Vxt+AviiCcyiwpsl8iQ8MvwGY= +golang.org/x/image v0.29.0 h1:HcdsyR4Gsuys/Axh0rDEmlBmB68rW1U9BUdB3UVHsas= +golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -313,8 +313,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -327,8 +327,8 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -354,8 +354,8 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -366,8 +366,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -432,6 +432,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 3faec03ed7a9385cbba8a7f338baee921e8fce0e Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Wed, 16 Jul 2025 16:57:02 +0200 Subject: [PATCH 002/225] chore: update bug_report.yml --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 9c02689f..bda0cd38 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,6 @@ name: Bug Report description: Report a bug in FileBrowser. -labels: [bug, triage] +labels: [bug, waiting: triage] body: - type: checkboxes attributes: From 7e758357d1a774b14b6515445aaffb4bdb2d35f3 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Wed, 16 Jul 2025 16:57:35 +0200 Subject: [PATCH 003/225] chore: update bug_report.yml --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index bda0cd38..f84e7933 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,6 @@ name: Bug Report description: Report a bug in FileBrowser. -labels: [bug, waiting: triage] +labels: [bug, 'waiting: triage'] body: - type: checkboxes attributes: From d61110e4d7155a5849557adf3b75dc0191f17e80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 19:38:10 +0000 Subject: [PATCH 004/225] build(deps): bump vue-i18n from 11.1.9 to 11.1.10 in /frontend Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.1.9 to 11.1.10. - [Release notes](https://github.com/intlify/vue-i18n/releases) - [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/intlify/vue-i18n/commits/v11.1.10/packages/vue-i18n) --- updated-dependencies: - dependency-name: vue-i18n dependency-version: 11.1.10 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frontend/package.json | 2 +- frontend/pnpm-lock.yaml | 66 ++++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index b0dbc1b3..680232c9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -43,7 +43,7 @@ "videojs-mobile-ui": "^1.1.1", "vue": "^3.5.17", "vue-final-modal": "^4.5.5", - "vue-i18n": "^11.1.9", + "vue-i18n": "^11.1.10", "vue-lazyload": "^3.0.0", "vue-reader": "^1.2.17", "vue-router": "^4.5.1", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 401be2b7..0f5f79ad 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -84,8 +84,8 @@ importers: specifier: ^4.5.5 version: 4.5.5(@vueuse/core@12.5.0(typescript@5.6.3))(@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3))(focus-trap@7.6.2)(vue@3.5.17(typescript@5.6.3)) vue-i18n: - specifier: ^11.1.9 - version: 11.1.9(vue@3.5.17(typescript@5.6.3)) + specifier: ^11.1.10 + version: 11.1.10(vue@3.5.17(typescript@5.6.3)) vue-lazyload: specifier: ^3.0.0 version: 3.0.0 @@ -101,7 +101,7 @@ importers: devDependencies: '@intlify/unplugin-vue-i18n': specifier: ^6.0.8 - version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3)) + version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3)) '@playwright/test': specifier: ^1.54.1 version: 1.54.1 @@ -963,16 +963,20 @@ packages: vue-i18n: optional: true - '@intlify/core-base@11.1.9': - resolution: {integrity: sha512-Lrdi4wp3XnGhWmB/mMD/XtfGUw1Jt+PGpZI/M63X1ZqhTDjNHRVCs/i8vv8U1cwaj1A9fb0bkCQHLSL0SK+pIQ==} + '@intlify/core-base@11.1.10': + resolution: {integrity: sha512-JhRb40hD93Vk0BgMgDc/xMIFtdXPHoytzeK6VafBNOj6bb6oUZrGamXkBKecMsmGvDQQaPRGG2zpa25VCw8pyw==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.1.10': + resolution: {integrity: sha512-TABl3c8tSLWbcD+jkQTyBhrnW251dzqW39MPgEUCsd69Ua3ceoimsbIzvkcPzzZvt1QDxNkenMht+5//V3JvLQ==} engines: {node: '>= 16'} '@intlify/message-compiler@11.1.2': resolution: {integrity: sha512-T/xbNDzi+Yv0Qn2Dfz2CWCAJiwNgU5d95EhhAEf4YmOgjCKktpfpiUSmLcBvK1CtLpPQ85AMMQk/2NCcXnNj1g==} engines: {node: '>= 16'} - '@intlify/message-compiler@11.1.9': - resolution: {integrity: sha512-84SNs3Ikjg0rD1bOuchzb3iK1vR2/8nxrkyccIl5DjFTeMzE/Fxv6X+A7RN5ZXjEWelc1p5D4kHA6HEOhlKL5Q==} + '@intlify/shared@11.1.10': + resolution: {integrity: sha512-6ZW/f3Zzjxfa1Wh0tYQI5pLKUtU+SY7l70pEG+0yd0zjcsYcK0EBt6Fz30Dy0tZhEqemziQQy2aNU3GJzyrMUA==} engines: {node: '>= 16'} '@intlify/shared@11.1.2': @@ -983,10 +987,6 @@ packages: resolution: {integrity: sha512-4yZeMt2Aa/7n5Ehy4KalUlvt3iRLcg1tq9IBVfOgkyWFArN4oygn6WxgGIFibP3svpaH8DarbNaottq+p0gUZQ==} engines: {node: '>= 16'} - '@intlify/shared@11.1.9': - resolution: {integrity: sha512-H/83xgU1l8ox+qG305p6ucmoy93qyjIPnvxGWRA7YdOoHe1tIiW9IlEu4lTdsOR7cfP1ecrwyflQSqXdXBacXA==} - engines: {node: '>= 16'} - '@intlify/unplugin-vue-i18n@6.0.8': resolution: {integrity: sha512-Vvm3KhjE6TIBVUQAk37rBiaYy2M5OcWH0ZcI1XKEsOTeN1o0bErk+zeuXmcrcMc/73YggfI8RoxOUz9EB/69JQ==} engines: {node: '>= 18'} @@ -2731,8 +2731,8 @@ packages: focus-trap: '>=7.2.0' vue: '>=3.2.0' - vue-i18n@11.1.9: - resolution: {integrity: sha512-N9ZTsXdRmX38AwS9F6Rh93RtPkvZTkSy/zNv63FTIwZCUbLwwrpqlKz9YQuzFLdlvRdZTnWAUE5jMxr8exdl7g==} + vue-i18n@11.1.10: + resolution: {integrity: sha512-C+IwnSg8QDSOAox0gdFYP5tsKLx5jNWxiawNoiNB/Tw4CReXmM1VJMXbduhbrEzAFLhreqzfDocuSVjGbxQrag==} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 @@ -3719,7 +3719,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))': + '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))': dependencies: '@intlify/message-compiler': 11.1.2 '@intlify/shared': 11.1.7 @@ -3731,35 +3731,35 @@ snapshots: source-map-js: 1.2.1 yaml-eslint-parser: 1.2.3 optionalDependencies: - vue-i18n: 11.1.9(vue@3.5.17(typescript@5.6.3)) + vue-i18n: 11.1.10(vue@3.5.17(typescript@5.6.3)) - '@intlify/core-base@11.1.9': + '@intlify/core-base@11.1.10': dependencies: - '@intlify/message-compiler': 11.1.9 - '@intlify/shared': 11.1.9 + '@intlify/message-compiler': 11.1.10 + '@intlify/shared': 11.1.10 + + '@intlify/message-compiler@11.1.10': + dependencies: + '@intlify/shared': 11.1.10 + source-map-js: 1.2.1 '@intlify/message-compiler@11.1.2': dependencies: '@intlify/shared': 11.1.2 source-map-js: 1.2.1 - '@intlify/message-compiler@11.1.9': - dependencies: - '@intlify/shared': 11.1.9 - source-map-js: 1.2.1 + '@intlify/shared@11.1.10': {} '@intlify/shared@11.1.2': {} '@intlify/shared@11.1.7': {} - '@intlify/shared@11.1.9': {} - - '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': + '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) - '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3))) + '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3))) '@intlify/shared': 11.1.7 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3)) + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3)) '@rollup/pluginutils': 5.1.4(rollup@4.40.1) '@typescript-eslint/scope-manager': 8.21.0 '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3) @@ -3773,7 +3773,7 @@ snapshots: unplugin: 1.16.1 vue: 3.5.17(typescript@5.6.3) optionalDependencies: - vue-i18n: 11.1.9(vue@3.5.17(typescript@5.6.3)) + vue-i18n: 11.1.10(vue@3.5.17(typescript@5.6.3)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -3781,14 +3781,14 @@ snapshots: - supports-color - typescript - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': dependencies: '@babel/parser': 7.26.7 optionalDependencies: '@intlify/shared': 11.1.7 '@vue/compiler-dom': 3.5.17 vue: 3.5.17(typescript@5.6.3) - vue-i18n: 11.1.9(vue@3.5.17(typescript@5.6.3)) + vue-i18n: 11.1.10(vue@3.5.17(typescript@5.6.3)) '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -5538,10 +5538,10 @@ snapshots: focus-trap: 7.6.2 vue: 3.5.17(typescript@5.6.3) - vue-i18n@11.1.9(vue@3.5.17(typescript@5.6.3)): + vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)): dependencies: - '@intlify/core-base': 11.1.9 - '@intlify/shared': 11.1.9 + '@intlify/core-base': 11.1.10 + '@intlify/shared': 11.1.10 '@vue/devtools-api': 6.6.4 vue: 3.5.17(typescript@5.6.3) From 607f5708a2484428ab837781a5ef26b8cc3194f4 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 17 Jul 2025 18:06:59 +0200 Subject: [PATCH 005/225] fix: Location header on TUS endpoint (#5302) --- http/tus_handlers.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/http/tus_handlers.go b/http/tus_handlers.go index 002d78b5..f7ed1718 100644 --- a/http/tus_handlers.go +++ b/http/tus_handlers.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "net/url" "os" "path/filepath" "strconv" @@ -147,9 +148,12 @@ func tusPostHandler() handleFunc { // Enables the user to utilize the PATCH endpoint for uploading file data registerUpload(file.RealPath(), uploadLength) - // Signal the frontend to reuse the current request URL - w.Header().Set("Location", "") + path, err := url.JoinPath("/", d.server.BaseURL, "/api/tus", r.URL.Path) + if err != nil { + return http.StatusBadRequest, fmt.Errorf("invalid path: %w", err) + } + w.Header().Set("Location", path) return http.StatusCreated, nil }) } From 5b7ea9f95a444c51c601e0447ab97a19c4917051 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 17 Jul 2025 18:09:15 +0200 Subject: [PATCH 006/225] chore(release): 2.40.2 --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c13780ac..e641c790 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [2.40.2](https://github.com/filebrowser/filebrowser/compare/v2.40.1...v2.40.2) (2025-07-17) + + +### Bug Fixes + +* Location header on TUS endpoint ([#5302](https://github.com/filebrowser/filebrowser/issues/5302)) ([607f570](https://github.com/filebrowser/filebrowser/commit/607f5708a2484428ab837781a5ef26b8cc3194f4)) + + +### Build + +* **deps:** bump vue-i18n from 11.1.9 to 11.1.10 in /frontend ([d61110e](https://github.com/filebrowser/filebrowser/commit/d61110e4d7155a5849557adf3b75dc0191f17e80)) + ### [2.40.1](https://github.com/filebrowser/filebrowser/compare/v2.40.0...v2.40.1) (2025-07-15) From 21ad653b7eb246c0e95ccdc131f8d59267de7818 Mon Sep 17 00:00:00 2001 From: Vincent Lee Date: Sun, 20 Jul 2025 18:21:52 -0700 Subject: [PATCH 007/225] feat: Allow file and directory creation modes to be configured The defaults remain the same as before. For now, the config options are global instead of per-user. Note also that the BoltDB creation maintains the old default mode of 0640 since it's not really a user-facing filesystem manipulation. Fixes #5316, #5200 --- cmd/config.go | 6 ++++++ cmd/config_init.go | 2 ++ cmd/config_set.go | 4 ++++ cmd/utils.go | 14 ++++++++++++-- files/file.go | 3 --- fileutils/copy.go | 9 +++++---- fileutils/dir.go | 13 +++++++------ fileutils/file.go | 25 ++++++++++++------------- http/resource.go | 21 +++++++++++---------- http/tus_handlers.go | 6 +++--- settings/settings.go | 5 +++++ settings/storage.go | 6 ++++++ 12 files changed, 73 insertions(+), 41 deletions(-) diff --git a/cmd/config.go b/cmd/config.go index 3ee8dab8..43e07730 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -49,6 +49,10 @@ func addConfigFlags(flags *pflag.FlagSet) { flags.String("branding.files", "", "path to directory with images and custom styles") flags.Bool("branding.disableExternal", false, "disable external links such as GitHub links") flags.Bool("branding.disableUsedPercentage", false, "disable used disk percentage graph") + // NB: these are string so they can be presented as octal in the help text + // as that's the conventional representation for modes in Unix. + flags.String("file-mode", fmt.Sprintf("%O", settings.DefaultFileMode), "Mode bits that new files are created with") + flags.String("dir-mode", fmt.Sprintf("%O", settings.DefaultDirMode), "Mode bits that new directories are created with") } //nolint:gocyclo @@ -170,6 +174,8 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut fmt.Fprintf(w, "\tLocale:\t%s\n", set.Defaults.Locale) fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode) fmt.Fprintf(w, "\tSingle Click:\t%t\n", set.Defaults.SingleClick) + fmt.Fprintf(w, "\tFile Creation Mode:\t%O\n", set.FileMode) + fmt.Fprintf(w, "\tDirectory Creation Mode:\t%O\n", set.DirMode) fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " ")) fmt.Fprintf(w, "\tSorting:\n") fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By) diff --git a/cmd/config_init.go b/cmd/config_init.go index d9710514..f168a448 100644 --- a/cmd/config_init.go +++ b/cmd/config_init.go @@ -43,6 +43,8 @@ override the options.`, Theme: mustGetString(flags, "branding.theme"), Files: mustGetString(flags, "branding.files"), }, + FileMode: mustGetMode(flags, "file-mode"), + DirMode: mustGetMode(flags, "dir-mode"), } ser := &settings.Server{ diff --git a/cmd/config_set.go b/cmd/config_set.go index 05816795..6ba99e73 100644 --- a/cmd/config_set.go +++ b/cmd/config_set.go @@ -65,6 +65,10 @@ you want to change. Other options will remain unchanged.`, set.Branding.DisableUsedPercentage = mustGetBool(flags, flag.Name) case "branding.files": set.Branding.Files = mustGetString(flags, flag.Name) + case "file-mode": + set.FileMode = mustGetMode(flags, flag.Name) + case "dir-mode": + set.DirMode = mustGetMode(flags, flag.Name) } }) diff --git a/cmd/utils.go b/cmd/utils.go index 909a1558..e88233fb 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -4,9 +4,11 @@ import ( "encoding/json" "errors" "fmt" + "io/fs" "log" "os" "path/filepath" + "strconv" "strings" "github.com/asdine/storm/v3" @@ -14,12 +16,13 @@ import ( "github.com/spf13/pflag" yaml "gopkg.in/yaml.v2" - "github.com/filebrowser/filebrowser/v2/files" "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/storage" "github.com/filebrowser/filebrowser/v2/storage/bolt" ) +const dbPerms = 0640 + func checkErr(err error) { if err != nil { log.Fatal(err) @@ -32,6 +35,13 @@ func mustGetString(flags *pflag.FlagSet, flag string) string { return s } +func mustGetMode(flags *pflag.FlagSet, flag string) fs.FileMode { + s := mustGetString(flags, flag) + b, err := strconv.ParseUint(s, 0, 32) + checkErr(err) + return fs.FileMode(b) +} + func mustGetBool(flags *pflag.FlagSet, flag string) bool { b, err := flags.GetBool(flag) checkErr(err) @@ -106,7 +116,7 @@ func python(fn pythonFunc, cfg pythonConfig) cobraFunc { log.Println("Using database: " + absPath) data.hadDB = exists - db, err := storm.Open(path, storm.BoltOptions(files.PermFile, nil)) + db, err := storm.Open(path, storm.BoltOptions(dbPerms, nil)) checkErr(err) defer db.Close() data.store, err = bolt.NewStorage(db) diff --git a/files/file.go b/files/file.go index 1ba1cd58..8e27e549 100644 --- a/files/file.go +++ b/files/file.go @@ -27,9 +27,6 @@ import ( "github.com/filebrowser/filebrowser/v2/rules" ) -const PermFile = 0640 -const PermDir = 0750 - var ( reSubDirs = regexp.MustCompile("(?i)^sub(s|titles)$") reSubExts = regexp.MustCompile("(?i)(.vtt|.srt|.ass|.ssa)$") diff --git a/fileutils/copy.go b/fileutils/copy.go index 57c961da..6c80c5c9 100644 --- a/fileutils/copy.go +++ b/fileutils/copy.go @@ -1,6 +1,7 @@ package fileutils import ( + "io/fs" "os" "path" @@ -8,7 +9,7 @@ import ( ) // Copy copies a file or folder from one place to another. -func Copy(fs afero.Fs, src, dst string) error { +func Copy(afs afero.Fs, src, dst string, fileMode, dirMode fs.FileMode) error { if src = path.Clean("/" + src); src == "" { return os.ErrNotExist } @@ -26,14 +27,14 @@ func Copy(fs afero.Fs, src, dst string) error { return os.ErrInvalid } - info, err := fs.Stat(src) + info, err := afs.Stat(src) if err != nil { return err } if info.IsDir() { - return CopyDir(fs, src, dst) + return CopyDir(afs, src, dst, fileMode, dirMode) } - return CopyFile(fs, src, dst) + return CopyFile(afs, src, dst, fileMode, dirMode) } diff --git a/fileutils/dir.go b/fileutils/dir.go index 07a3528e..e0b049db 100644 --- a/fileutils/dir.go +++ b/fileutils/dir.go @@ -2,6 +2,7 @@ package fileutils import ( "errors" + "io/fs" "github.com/spf13/afero" ) @@ -9,20 +10,20 @@ import ( // CopyDir copies a directory from source to dest and all // of its sub-directories. It doesn't stop if it finds an error // during the copy. Returns an error if any. -func CopyDir(fs afero.Fs, source, dest string) error { +func CopyDir(afs afero.Fs, source, dest string, fileMode, dirMode fs.FileMode) error { // Get properties of source. - srcinfo, err := fs.Stat(source) + srcinfo, err := afs.Stat(source) if err != nil { return err } // Create the destination directory. - err = fs.MkdirAll(dest, srcinfo.Mode()) + err = afs.MkdirAll(dest, srcinfo.Mode()) if err != nil { return err } - dir, _ := fs.Open(source) + dir, _ := afs.Open(source) obs, err := dir.Readdir(-1) if err != nil { return err @@ -36,13 +37,13 @@ func CopyDir(fs afero.Fs, source, dest string) error { if obj.IsDir() { // Create sub-directories, recursively. - err = CopyDir(fs, fsource, fdest) + err = CopyDir(afs, fsource, fdest, fileMode, dirMode) if err != nil { errs = append(errs, err) } } else { // Perform the file copy. - err = CopyFile(fs, fsource, fdest) + err = CopyFile(afs, fsource, fdest, fileMode, dirMode) if err != nil { errs = append(errs, err) } diff --git a/fileutils/file.go b/fileutils/file.go index a12f2720..784f728f 100644 --- a/fileutils/file.go +++ b/fileutils/file.go @@ -2,29 +2,28 @@ package fileutils import ( "io" + "io/fs" "os" "path" "path/filepath" "github.com/spf13/afero" - - "github.com/filebrowser/filebrowser/v2/files" ) // MoveFile moves file from src to dst. // By default the rename filesystem system call is used. If src and dst point to different volumes // the file copy is used as a fallback -func MoveFile(fs afero.Fs, src, dst string) error { - if fs.Rename(src, dst) == nil { +func MoveFile(afs afero.Fs, src, dst string, fileMode, dirMode fs.FileMode) error { + if afs.Rename(src, dst) == nil { return nil } // fallback - err := Copy(fs, src, dst) + err := Copy(afs, src, dst, fileMode, dirMode) if err != nil { - _ = fs.Remove(dst) + _ = afs.Remove(dst) return err } - if err := fs.RemoveAll(src); err != nil { + if err := afs.RemoveAll(src); err != nil { return err } return nil @@ -32,9 +31,9 @@ func MoveFile(fs afero.Fs, src, dst string) error { // CopyFile copies a file from source to dest and returns // an error if any. -func CopyFile(fs afero.Fs, source, dest string) error { +func CopyFile(afs afero.Fs, source, dest string, fileMode, dirMode fs.FileMode) error { // Open the source file. - src, err := fs.Open(source) + src, err := afs.Open(source) if err != nil { return err } @@ -42,13 +41,13 @@ func CopyFile(fs afero.Fs, source, dest string) error { // Makes the directory needed to create the dst // file. - err = fs.MkdirAll(filepath.Dir(dest), files.PermDir) + err = afs.MkdirAll(filepath.Dir(dest), dirMode) if err != nil { return err } // Create the destination file. - dst, err := fs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, files.PermFile) + dst, err := afs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, fileMode) if err != nil { return err } @@ -61,11 +60,11 @@ func CopyFile(fs afero.Fs, source, dest string) error { } // Copy the mode - info, err := fs.Stat(source) + info, err := afs.Stat(source) if err != nil { return err } - err = fs.Chmod(dest, info.Mode()) + err = afs.Chmod(dest, info.Mode()) if err != nil { return err } diff --git a/http/resource.go b/http/resource.go index f657856e..74d7e6c3 100644 --- a/http/resource.go +++ b/http/resource.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io" + "io/fs" "log" "net/http" "net/url" @@ -105,7 +106,7 @@ func resourcePostHandler(fileCache FileCache) handleFunc { // Directories creation on POST. if strings.HasSuffix(r.URL.Path, "/") { - err := d.user.Fs.MkdirAll(r.URL.Path, files.PermDir) + err := d.user.Fs.MkdirAll(r.URL.Path, d.settings.DirMode) return errToStatus(err), err } @@ -134,7 +135,7 @@ func resourcePostHandler(fileCache FileCache) handleFunc { } err = d.RunHook(func() error { - info, writeErr := writeFile(d.user.Fs, r.URL.Path, r.Body) + info, writeErr := writeFile(d.user.Fs, r.URL.Path, r.Body, d.settings.FileMode, d.settings.DirMode) if writeErr != nil { return writeErr } @@ -171,7 +172,7 @@ var resourcePutHandler = withUser(func(w http.ResponseWriter, r *http.Request, d } err = d.RunHook(func() error { - info, writeErr := writeFile(d.user.Fs, r.URL.Path, r.Body) + info, writeErr := writeFile(d.user.Fs, r.URL.Path, r.Body, d.settings.FileMode, d.settings.DirMode) if writeErr != nil { return writeErr } @@ -243,14 +244,14 @@ func checkParent(src, dst string) error { return nil } -func addVersionSuffix(source string, fs afero.Fs) string { +func addVersionSuffix(source string, afs afero.Fs) string { counter := 1 dir, name := path.Split(source) ext := filepath.Ext(name) base := strings.TrimSuffix(name, ext) for { - if _, err := fs.Stat(source); err != nil { + if _, err := afs.Stat(source); err != nil { break } renamed := fmt.Sprintf("%s(%d)%s", base, counter, ext) @@ -261,14 +262,14 @@ func addVersionSuffix(source string, fs afero.Fs) string { return source } -func writeFile(fs afero.Fs, dst string, in io.Reader) (os.FileInfo, error) { +func writeFile(afs afero.Fs, dst string, in io.Reader, fileMode, dirMode fs.FileMode) (os.FileInfo, error) { dir, _ := path.Split(dst) - err := fs.MkdirAll(dir, files.PermDir) + err := afs.MkdirAll(dir, dirMode) if err != nil { return nil, err } - file, err := fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, files.PermFile) + file, err := afs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, fileMode) if err != nil { return nil, err } @@ -306,7 +307,7 @@ func patchAction(ctx context.Context, action, src, dst string, d *data, fileCach return fbErrors.ErrPermissionDenied } - return fileutils.Copy(d.user.Fs, src, dst) + return fileutils.Copy(d.user.Fs, src, dst, d.settings.FileMode, d.settings.DirMode) case "rename": if !d.user.Perm.Rename { return fbErrors.ErrPermissionDenied @@ -332,7 +333,7 @@ func patchAction(ctx context.Context, action, src, dst string, d *data, fileCach return err } - return fileutils.MoveFile(d.user.Fs, src, dst) + return fileutils.MoveFile(d.user.Fs, src, dst, d.settings.FileMode, d.settings.DirMode) default: return fmt.Errorf("unsupported action %s: %w", action, fbErrors.ErrInvalidRequestParams) } diff --git a/http/tus_handlers.go b/http/tus_handlers.go index f7ed1718..05671cf7 100644 --- a/http/tus_handlers.go +++ b/http/tus_handlers.go @@ -92,7 +92,7 @@ func tusPostHandler() handleFunc { case errors.Is(err, afero.ErrFileNotFound): dirPath := filepath.Dir(r.URL.Path) if _, statErr := d.user.Fs.Stat(dirPath); os.IsNotExist(statErr) { - if mkdirErr := d.user.Fs.MkdirAll(dirPath, files.PermDir); mkdirErr != nil { + if mkdirErr := d.user.Fs.MkdirAll(dirPath, d.settings.DirMode); mkdirErr != nil { return http.StatusInternalServerError, err } } @@ -121,7 +121,7 @@ func tusPostHandler() handleFunc { fileFlags |= os.O_TRUNC } - openFile, err := d.user.Fs.OpenFile(r.URL.Path, fileFlags, files.PermFile) + openFile, err := d.user.Fs.OpenFile(r.URL.Path, fileFlags, d.settings.FileMode) if err != nil { return errToStatus(err), err } @@ -239,7 +239,7 @@ func tusPatchHandler() handleFunc { ) } - openFile, err := d.user.Fs.OpenFile(r.URL.Path, os.O_WRONLY|os.O_APPEND, files.PermFile) + openFile, err := d.user.Fs.OpenFile(r.URL.Path, os.O_WRONLY|os.O_APPEND, d.settings.FileMode) if err != nil { return http.StatusInternalServerError, fmt.Errorf("could not open file: %w", err) } diff --git a/settings/settings.go b/settings/settings.go index 2199968b..787921e9 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -2,6 +2,7 @@ package settings import ( "crypto/rand" + "io/fs" "log" "strings" "time" @@ -11,6 +12,8 @@ import ( const DefaultUsersHomeBasePath = "/users" const DefaultMinimumPasswordLength = 12 +const DefaultFileMode = 0640 +const DefaultDirMode = 0750 // AuthMethod describes an authentication method. type AuthMethod string @@ -29,6 +32,8 @@ type Settings struct { Shell []string `json:"shell"` Rules []rules.Rule `json:"rules"` MinimumPasswordLength uint `json:"minimumPasswordLength"` + FileMode fs.FileMode `json:"fileMode"` + DirMode fs.FileMode `json:"dirMode"` } // GetRules implements rules.Provider. diff --git a/settings/storage.go b/settings/storage.go index 64dc4896..d401996d 100644 --- a/settings/storage.go +++ b/settings/storage.go @@ -42,6 +42,12 @@ func (s *Storage) Get() (*Settings, error) { RetryCount: DefaultTusRetryCount, } } + if set.FileMode == 0 { + set.FileMode = DefaultFileMode + } + if set.DirMode == 0 { + set.DirMode = DefaultDirMode + } return set, nil } From 1582b8b2cd1c62fa93e60ca9b4e740e940b02e84 Mon Sep 17 00:00:00 2001 From: Jagadam Dinesh Reddy Date: Tue, 22 Jul 2025 11:55:21 +0530 Subject: [PATCH 008/225] feat: better error handling for sys kill signals --- cmd/cmd.go | 10 +-- cmd/cmds_add.go | 11 ++- cmd/cmds_ls.go | 12 ++- cmd/cmds_rm.go | 19 +++-- cmd/config.go | 193 +++++++++++++++++++++++++++---------------- cmd/config_cat.go | 16 ++-- cmd/config_export.go | 19 +++-- cmd/config_import.go | 64 ++++++++++---- cmd/config_init.go | 163 +++++++++++++++++++++++++++++------- cmd/config_set.go | 88 +++++++++++++------- cmd/docs.go | 37 ++++++--- cmd/hash.go | 7 +- cmd/root.go | 122 ++++++++++++++++++++------- cmd/rule_rm.go | 22 ++--- cmd/rules.go | 55 ++++++++---- cmd/rules_add.go | 24 +++--- cmd/rules_ls.go | 4 +- cmd/upgrade.go | 19 +++-- cmd/users.go | 57 +++++++------ cmd/users_add.go | 39 +++++++-- cmd/users_export.go | 11 ++- cmd/users_find.go | 11 ++- cmd/users_import.go | 63 +++++++++----- cmd/users_rm.go | 7 +- cmd/users_update.go | 39 +++++++-- cmd/utils.go | 64 ++++++++------ errors/errors.go | 54 ++++++++++++ main.go | 7 +- 28 files changed, 876 insertions(+), 361 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index 18f52337..2dc02107 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1,12 +1,6 @@ package cmd -import ( - "log" -) - // Execute executes the commands. -func Execute() { - if err := rootCmd.Execute(); err != nil { - log.Fatal(err) - } +func Execute() error { + return rootCmd.Execute() } diff --git a/cmd/cmds_add.go b/cmd/cmds_add.go index 63571ba6..a4d17061 100644 --- a/cmd/cmds_add.go +++ b/cmd/cmds_add.go @@ -15,13 +15,18 @@ var cmdsAddCmd = &cobra.Command{ Short: "Add a command to run on a specific event", Long: `Add a command to run on a specific event.`, Args: cobra.MinimumNArgs(2), - Run: python(func(_ *cobra.Command, args []string, d pythonData) { + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { s, err := d.store.Settings.Get() - checkErr(err) + if err != nil { + return err + } command := strings.Join(args[1:], " ") s.Commands[args[0]] = append(s.Commands[args[0]], command) err = d.store.Settings.Save(s) - checkErr(err) + if err != nil { + return err + } printEvents(s.Commands) + return nil }, pythonConfig{}), } diff --git a/cmd/cmds_ls.go b/cmd/cmds_ls.go index 6d19c846..fa901a56 100644 --- a/cmd/cmds_ls.go +++ b/cmd/cmds_ls.go @@ -14,10 +14,15 @@ var cmdsLsCmd = &cobra.Command{ Short: "List all commands for each event", Long: `List all commands for each event.`, Args: cobra.NoArgs, - Run: python(func(cmd *cobra.Command, _ []string, d pythonData) { + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { s, err := d.store.Settings.Get() - checkErr(err) - evt := mustGetString(cmd.Flags(), "event") + if err != nil { + return err + } + evt, err := getString(cmd.Flags(), "event") + if err != nil { + return err + } if evt == "" { printEvents(s.Commands) @@ -27,5 +32,6 @@ var cmdsLsCmd = &cobra.Command{ show["after_"+evt] = s.Commands["after_"+evt] printEvents(show) } + return nil }, pythonConfig{}), } diff --git a/cmd/cmds_rm.go b/cmd/cmds_rm.go index 7f187f7f..34089388 100644 --- a/cmd/cmds_rm.go +++ b/cmd/cmds_rm.go @@ -35,22 +35,31 @@ including 'index_end'.`, return nil }, - Run: python(func(_ *cobra.Command, args []string, d pythonData) { + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { s, err := d.store.Settings.Get() - checkErr(err) + if err != nil { + return err + } evt := args[0] i, err := strconv.Atoi(args[1]) - checkErr(err) + if err != nil { + return err + } f := i if len(args) == 3 { f, err = strconv.Atoi(args[2]) - checkErr(err) + if err != nil { + return err + } } s.Commands[evt] = append(s.Commands[evt][:i], s.Commands[evt][f+1:]...) err = d.store.Settings.Save(s) - checkErr(err) + if err != nil { + return err + } printEvents(s.Commands) + return nil }, pythonConfig{}), } diff --git a/cmd/config.go b/cmd/config.go index 43e07730..5ce54ad9 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -55,9 +55,12 @@ func addConfigFlags(flags *pflag.FlagSet) { flags.String("dir-mode", fmt.Sprintf("%O", settings.DefaultDirMode), "Mode bits that new directories are created with") } -//nolint:gocyclo -func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings.AuthMethod, auth.Auther) { - method := settings.AuthMethod(mustGetString(flags, "auth.method")) +func getAuthMethod(flags *pflag.FlagSet, defaults ...interface{}) (settings.AuthMethod, map[string]interface{}, error) { + methodStr, err := getString(flags, "auth.method") + if err != nil { + return "", nil, err + } + method := settings.AuthMethod(methodStr) var defaultAuther map[string]interface{} if len(defaults) > 0 { @@ -68,83 +71,124 @@ func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings. method = def.AuthMethod case auth.Auther: ms, err := json.Marshal(def) - checkErr(err) + if err != nil { + return "", nil, err + } err = json.Unmarshal(ms, &defaultAuther) - checkErr(err) + if err != nil { + return "", nil, err + } } } } } - var auther auth.Auther - if method == auth.MethodProxyAuth { - header := mustGetString(flags, "auth.header") - - if header == "" { - header = defaultAuther["header"].(string) - } - - if header == "" { - checkErr(nerrors.New("you must set the flag 'auth.header' for method 'proxy'")) - } - - auther = &auth.ProxyAuth{Header: header} - } - - if method == auth.MethodNoAuth { - auther = &auth.NoAuth{} - } - - if method == auth.MethodJSONAuth { - jsonAuth := &auth.JSONAuth{} - host := mustGetString(flags, "recaptcha.host") - key := mustGetString(flags, "recaptcha.key") - secret := mustGetString(flags, "recaptcha.secret") - - if key == "" { - if kmap, ok := defaultAuther["recaptcha"].(map[string]interface{}); ok { - key = kmap["key"].(string) - } - } - - if secret == "" { - if smap, ok := defaultAuther["recaptcha"].(map[string]interface{}); ok { - secret = smap["secret"].(string) - } - } - - if key != "" && secret != "" { - jsonAuth.ReCaptcha = &auth.ReCaptcha{ - Host: host, - Key: key, - Secret: secret, - } - } - auther = jsonAuth - } - - if method == auth.MethodHookAuth { - command := mustGetString(flags, "auth.command") - - if command == "" { - command = defaultAuther["command"].(string) - } - - if command == "" { - checkErr(nerrors.New("you must set the flag 'auth.command' for method 'hook'")) - } - - auther = &auth.HookAuth{Command: command} - } - - if auther == nil { - panic(errors.ErrInvalidAuthMethod) - } - - return method, auther + return method, defaultAuther, nil } -func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Auther) { +func getProxyAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { + header, err := getString(flags, "auth.header") + if err != nil { + return nil, err + } + + if header == "" { + header = defaultAuther["header"].(string) + } + + if header == "" { + return nil, nerrors.New("you must set the flag 'auth.header' for method 'proxy'") + } + + return &auth.ProxyAuth{Header: header}, nil +} + +func getNoAuth() auth.Auther { + return &auth.NoAuth{} +} + +func getJSONAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { + jsonAuth := &auth.JSONAuth{} + host, err := getString(flags, "recaptcha.host") + if err != nil { + return nil, err + } + key, err := getString(flags, "recaptcha.key") + if err != nil { + return nil, err + } + secret, err := getString(flags, "recaptcha.secret") + if err != nil { + return nil, err + } + + if key == "" { + if kmap, ok := defaultAuther["recaptcha"].(map[string]interface{}); ok { + key = kmap["key"].(string) + } + } + + if secret == "" { + if smap, ok := defaultAuther["recaptcha"].(map[string]interface{}); ok { + secret = smap["secret"].(string) + } + } + + if key != "" && secret != "" { + jsonAuth.ReCaptcha = &auth.ReCaptcha{ + Host: host, + Key: key, + Secret: secret, + } + } + return jsonAuth, nil +} + +func getHookAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { + command, err := getString(flags, "auth.command") + if err != nil { + return nil, err + } + + if command == "" { + command = defaultAuther["command"].(string) + } + + if command == "" { + return nil, nerrors.New("you must set the flag 'auth.command' for method 'hook'") + } + + return &auth.HookAuth{Command: command}, nil +} + +func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings.AuthMethod, auth.Auther, error) { + method, defaultAuther, err := getAuthMethod(flags, defaults...) + if err != nil { + return "", nil, err + } + + var auther auth.Auther + switch method { + case auth.MethodProxyAuth: + auther, err = getProxyAuth(flags, defaultAuther) + case auth.MethodNoAuth: + auther = getNoAuth() + case auth.MethodJSONAuth: + auther, err = getJSONAuth(flags, defaultAuther) + case auth.MethodHookAuth: + auther, err = getHookAuth(flags, defaultAuther) + default: + return "", nil, errors.ErrInvalidAuthMethod + } + + if err != nil { + return "", nil, err + } + + return method, auther, nil +} + +func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Auther) error { w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) fmt.Fprintf(w, "Sign up:\t%t\n", set.Signup) @@ -192,6 +236,9 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut w.Flush() b, err := json.MarshalIndent(auther, "", " ") - checkErr(err) + if err != nil { + return err + } fmt.Printf("\nAuther configuration (raw):\n\n%s\n\n", string(b)) + return nil } diff --git a/cmd/config_cat.go b/cmd/config_cat.go index 8aaf05c3..39b1f664 100644 --- a/cmd/config_cat.go +++ b/cmd/config_cat.go @@ -13,13 +13,19 @@ var configCatCmd = &cobra.Command{ Short: "Prints the configuration", Long: `Prints the configuration.`, Args: cobra.NoArgs, - Run: python(func(_ *cobra.Command, _ []string, d pythonData) { + RunE: python(func(_ *cobra.Command, _ []string, d *pythonData) error { set, err := d.store.Settings.Get() - checkErr(err) + if err != nil { + return err + } ser, err := d.store.Settings.GetServer() - checkErr(err) + if err != nil { + return err + } auther, err := d.store.Auth.Get(set.AuthMethod) - checkErr(err) - printSettings(ser, set, auther) + if err != nil { + return err + } + return printSettings(ser, set, auther) }, pythonConfig{}), } diff --git a/cmd/config_export.go b/cmd/config_export.go index 6472bbe6..9877fb63 100644 --- a/cmd/config_export.go +++ b/cmd/config_export.go @@ -15,15 +15,21 @@ var configExportCmd = &cobra.Command{ json or yaml file. This exported configuration can be changed, and imported again with 'config import' command.`, Args: jsonYamlArg, - Run: python(func(_ *cobra.Command, args []string, d pythonData) { + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { settings, err := d.store.Settings.Get() - checkErr(err) + if err != nil { + return err + } server, err := d.store.Settings.GetServer() - checkErr(err) + if err != nil { + return err + } auther, err := d.store.Auth.Get(settings.AuthMethod) - checkErr(err) + if err != nil { + return err + } data := &settingsFile{ Settings: settings, @@ -32,6 +38,9 @@ and imported again with 'config import' command.`, } err = marshal(args[0], data) - checkErr(err) + if err != nil { + return err + } + return nil }, pythonConfig{}), } diff --git a/cmd/config_import.go b/cmd/config_import.go index 6c609481..7763517d 100644 --- a/cmd/config_import.go +++ b/cmd/config_import.go @@ -34,26 +34,35 @@ database. The path must be for a json or yaml file.`, Args: jsonYamlArg, - Run: python(func(_ *cobra.Command, args []string, d pythonData) { + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { var key []byte + var err error if d.hadDB { - settings, err := d.store.Settings.Get() - checkErr(err) + settings, settingErr := d.store.Settings.Get() + if settingErr != nil { + return settingErr + } key = settings.Key } else { key = generateKey() } file := settingsFile{} - err := unmarshal(args[0], &file) - checkErr(err) + err = unmarshal(args[0], &file) + if err != nil { + return err + } file.Settings.Key = key err = d.store.Settings.Save(file.Settings) - checkErr(err) + if err != nil { + return err + } err = d.store.Settings.SaveServer(file.Server) - checkErr(err) + if err != nil { + return err + } var rawAuther interface{} if filepath.Ext(args[0]) != ".json" { @@ -63,32 +72,51 @@ The path must be for a json or yaml file.`, } var auther auth.Auther + var autherErr error switch file.Settings.AuthMethod { case auth.MethodJSONAuth: - auther = getAuther(auth.JSONAuth{}, rawAuther).(*auth.JSONAuth) + var a interface{} + a, autherErr = getAuther(auth.JSONAuth{}, rawAuther) + auther = a.(*auth.JSONAuth) case auth.MethodNoAuth: - auther = getAuther(auth.NoAuth{}, rawAuther).(*auth.NoAuth) + var a interface{} + a, autherErr = getAuther(auth.NoAuth{}, rawAuther) + auther = a.(*auth.NoAuth) case auth.MethodProxyAuth: - auther = getAuther(auth.ProxyAuth{}, rawAuther).(*auth.ProxyAuth) + var a interface{} + a, autherErr = getAuther(auth.ProxyAuth{}, rawAuther) + auther = a.(*auth.ProxyAuth) case auth.MethodHookAuth: - auther = getAuther(&auth.HookAuth{}, rawAuther).(*auth.HookAuth) + var a interface{} + a, autherErr = getAuther(&auth.HookAuth{}, rawAuther) + auther = a.(*auth.HookAuth) default: - checkErr(errors.New("invalid auth method")) + return errors.New("invalid auth method") + } + + if autherErr != nil { + return autherErr } err = d.store.Auth.Save(auther) - checkErr(err) + if err != nil { + return err + } - printSettings(file.Server, file.Settings, auther) + return printSettings(file.Server, file.Settings, auther) }, pythonConfig{allowNoDB: true}), } -func getAuther(sample auth.Auther, data interface{}) interface{} { +func getAuther(sample auth.Auther, data interface{}) (interface{}, error) { authType := reflect.TypeOf(sample) auther := reflect.New(authType).Interface() bytes, err := json.Marshal(data) - checkErr(err) + if err != nil { + return nil, err + } err = json.Unmarshal(bytes, &auther) - checkErr(err) - return auther + if err != nil { + return nil, err + } + return auther, nil } diff --git a/cmd/config_init.go b/cmd/config_init.go index f168a448..ea756d0b 100644 --- a/cmd/config_init.go +++ b/cmd/config_init.go @@ -22,54 +22,161 @@ this options can be changed in the future with the command to the defaults when creating new users and you don't override the options.`, Args: cobra.NoArgs, - Run: python(func(cmd *cobra.Command, _ []string, d pythonData) { + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { defaults := settings.UserDefaults{} flags := cmd.Flags() - getUserDefaults(flags, &defaults, true) - authMethod, auther := getAuthentication(flags) + err := getUserDefaults(flags, &defaults, true) + if err != nil { + return err + } + authMethod, auther, err := getAuthentication(flags) + if err != nil { + return err + } + + key := generateKey() + + signup, err := getBool(flags, "signup") + if err != nil { + return err + } + + createUserDir, err := getBool(flags, "create-user-dir") + if err != nil { + return err + } + + minLength, err := getUint(flags, "minimum-password-length") + if err != nil { + return err + } + + shell, err := getString(flags, "shell") + if err != nil { + return err + } + + brandingName, err := getString(flags, "branding.name") + if err != nil { + return err + } + + brandingDisableExternal, err := getBool(flags, "branding.disableExternal") + if err != nil { + return err + } + + brandingDisableUsedPercentage, err := getBool(flags, "branding.disableUsedPercentage") + if err != nil { + return err + } + + brandingTheme, err := getString(flags, "branding.theme") + if err != nil { + return err + } + + brandingFiles, err := getString(flags, "branding.files") + if err != nil { + return err + } s := &settings.Settings{ - Key: generateKey(), - Signup: mustGetBool(flags, "signup"), - CreateUserDir: mustGetBool(flags, "create-user-dir"), - MinimumPasswordLength: mustGetUint(flags, "minimum-password-length"), - Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")), + Key: key, + Signup: signup, + CreateUserDir: createUserDir, + MinimumPasswordLength: minLength, + Shell: convertCmdStrToCmdArray(shell), AuthMethod: authMethod, Defaults: defaults, Branding: settings.Branding{ - Name: mustGetString(flags, "branding.name"), - DisableExternal: mustGetBool(flags, "branding.disableExternal"), - DisableUsedPercentage: mustGetBool(flags, "branding.disableUsedPercentage"), - Theme: mustGetString(flags, "branding.theme"), - Files: mustGetString(flags, "branding.files"), + Name: brandingName, + DisableExternal: brandingDisableExternal, + DisableUsedPercentage: brandingDisableUsedPercentage, + Theme: brandingTheme, + Files: brandingFiles, }, - FileMode: mustGetMode(flags, "file-mode"), - DirMode: mustGetMode(flags, "dir-mode"), + } + + s.FileMode, err = getMode(flags, "file-mode") + if err != nil { + return err + } + + s.DirMode, err = getMode(flags, "file-mode") + if err != nil { + return err + } + + address, err := getString(flags, "address") + if err != nil { + return err + } + + socket, err := getString(flags, "socket") + if err != nil { + return err + } + + root, err := getString(flags, "root") + if err != nil { + return err + } + + baseURL, err := getString(flags, "baseurl") + if err != nil { + return err + } + + tlsKey, err := getString(flags, "key") + if err != nil { + return err + } + + cert, err := getString(flags, "cert") + if err != nil { + return err + } + + port, err := getString(flags, "port") + if err != nil { + return err + } + + log, err := getString(flags, "log") + if err != nil { + return err } ser := &settings.Server{ - Address: mustGetString(flags, "address"), - Socket: mustGetString(flags, "socket"), - Root: mustGetString(flags, "root"), - BaseURL: mustGetString(flags, "baseurl"), - TLSKey: mustGetString(flags, "key"), - TLSCert: mustGetString(flags, "cert"), - Port: mustGetString(flags, "port"), - Log: mustGetString(flags, "log"), + Address: address, + Socket: socket, + Root: root, + BaseURL: baseURL, + TLSKey: tlsKey, + TLSCert: cert, + Port: port, + Log: log, } - err := d.store.Settings.Save(s) - checkErr(err) + err = d.store.Settings.Save(s) + if err != nil { + return err + } err = d.store.Settings.SaveServer(ser) - checkErr(err) + if err != nil { + return err + } err = d.store.Auth.Save(auther) - checkErr(err) + if err != nil { + return err + } fmt.Printf(` Congratulations! You've set up your database to use with File Browser. Now add your first user via 'filebrowser users add' and then you just need to call the main command to boot up the server. `) - printSettings(ser, s, auther) + return printSettings(ser, s, auther) }, pythonConfig{noDB: true}), } diff --git a/cmd/config_set.go b/cmd/config_set.go index 6ba99e73..a7f66902 100644 --- a/cmd/config_set.go +++ b/cmd/config_set.go @@ -16,77 +16,105 @@ var configSetCmd = &cobra.Command{ Long: `Updates the configuration. Set the flags for the options you want to change. Other options will remain unchanged.`, Args: cobra.NoArgs, - Run: python(func(cmd *cobra.Command, _ []string, d pythonData) { + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { flags := cmd.Flags() set, err := d.store.Settings.Get() - checkErr(err) + if err != nil { + return err + } ser, err := d.store.Settings.GetServer() - checkErr(err) + if err != nil { + return err + } hasAuth := false flags.Visit(func(flag *pflag.Flag) { + if err != nil { + return + } switch flag.Name { case "baseurl": - ser.BaseURL = mustGetString(flags, flag.Name) + ser.BaseURL, err = getString(flags, flag.Name) case "root": - ser.Root = mustGetString(flags, flag.Name) + ser.Root, err = getString(flags, flag.Name) case "socket": - ser.Socket = mustGetString(flags, flag.Name) + ser.Socket, err = getString(flags, flag.Name) case "cert": - ser.TLSCert = mustGetString(flags, flag.Name) + ser.TLSCert, err = getString(flags, flag.Name) case "key": - ser.TLSKey = mustGetString(flags, flag.Name) + ser.TLSKey, err = getString(flags, flag.Name) case "address": - ser.Address = mustGetString(flags, flag.Name) + ser.Address, err = getString(flags, flag.Name) case "port": - ser.Port = mustGetString(flags, flag.Name) + ser.Port, err = getString(flags, flag.Name) case "log": - ser.Log = mustGetString(flags, flag.Name) + ser.Log, err = getString(flags, flag.Name) case "signup": - set.Signup = mustGetBool(flags, flag.Name) + set.Signup, err = getBool(flags, flag.Name) case "auth.method": hasAuth = true case "shell": - set.Shell = convertCmdStrToCmdArray(mustGetString(flags, flag.Name)) + var shell string + shell, err = getString(flags, flag.Name) + set.Shell = convertCmdStrToCmdArray(shell) case "create-user-dir": - set.CreateUserDir = mustGetBool(flags, flag.Name) + set.CreateUserDir, err = getBool(flags, flag.Name) case "minimum-password-length": - set.MinimumPasswordLength = mustGetUint(flags, flag.Name) + set.MinimumPasswordLength, err = getUint(flags, flag.Name) case "branding.name": - set.Branding.Name = mustGetString(flags, flag.Name) + set.Branding.Name, err = getString(flags, flag.Name) case "branding.color": - set.Branding.Color = mustGetString(flags, flag.Name) + set.Branding.Color, err = getString(flags, flag.Name) case "branding.theme": - set.Branding.Theme = mustGetString(flags, flag.Name) + set.Branding.Theme, err = getString(flags, flag.Name) case "branding.disableExternal": - set.Branding.DisableExternal = mustGetBool(flags, flag.Name) + set.Branding.DisableExternal, err = getBool(flags, flag.Name) case "branding.disableUsedPercentage": - set.Branding.DisableUsedPercentage = mustGetBool(flags, flag.Name) + set.Branding.DisableUsedPercentage, err = getBool(flags, flag.Name) case "branding.files": - set.Branding.Files = mustGetString(flags, flag.Name) + set.Branding.Files, err = getString(flags, flag.Name) case "file-mode": - set.FileMode = mustGetMode(flags, flag.Name) + set.FileMode, err = getMode(flags, flag.Name) case "dir-mode": - set.DirMode = mustGetMode(flags, flag.Name) + set.DirMode, err = getMode(flags, flag.Name) } }) - getUserDefaults(flags, &set.Defaults, false) + if err != nil { + return err + } + + err = getUserDefaults(flags, &set.Defaults, false) + if err != nil { + return err + } // read the defaults auther, err := d.store.Auth.Get(set.AuthMethod) - checkErr(err) + if err != nil { + return err + } // check if there are new flags for existing auth method - set.AuthMethod, auther = getAuthentication(flags, hasAuth, set, auther) + set.AuthMethod, auther, err = getAuthentication(flags, hasAuth, set, auther) + if err != nil { + return err + } err = d.store.Auth.Save(auther) - checkErr(err) + if err != nil { + return err + } err = d.store.Settings.Save(set) - checkErr(err) + if err != nil { + return err + } err = d.store.Settings.SaveServer(ser) - checkErr(err) - printSettings(ser, set, auther) + if err != nil { + return err + } + + return printSettings(ser, set, auther) }, pythonConfig{}), } diff --git a/cmd/docs.go b/cmd/docs.go index 88d39d18..5f26daf9 100644 --- a/cmd/docs.go +++ b/cmd/docs.go @@ -39,12 +39,19 @@ var docsCmd = &cobra.Command{ Use: "docs", Hidden: true, Args: cobra.NoArgs, - Run: func(cmd *cobra.Command, _ []string) { - dir := mustGetString(cmd.Flags(), "path") - generateDocs(rootCmd, dir) + RunE: func(cmd *cobra.Command, _ []string) error { + dir, err := getString(cmd.Flags(), "path") + if err != nil { + return err + } + + err = generateDocs(rootCmd, dir) + if err != nil { + return err + } names := []string{} - err := filepath.Walk(dir, func(_ string, info os.FileInfo, err error) error { + err = filepath.Walk(dir, func(_ string, info os.FileInfo, err error) error { if err != nil || info.IsDir() { return err } @@ -56,30 +63,38 @@ var docsCmd = &cobra.Command{ names = append(names, info.Name()) return nil }) + if err != nil { + return err + } - checkErr(err) printToc(names) + return nil }, } -func generateDocs(cmd *cobra.Command, dir string) { +func generateDocs(cmd *cobra.Command, dir string) error { for _, c := range cmd.Commands() { if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { continue } - generateDocs(c, dir) + err := generateDocs(c, dir) + if err != nil { + return err + } } basename := strings.Replace(cmd.CommandPath(), " ", "-", -1) + ".md" filename := filepath.Join(dir, basename) f, err := os.Create(filename) - checkErr(err) + if err != nil { + return err + } defer f.Close() - generateMarkdown(cmd, f) + return generateMarkdown(cmd, f) } -func generateMarkdown(cmd *cobra.Command, w io.Writer) { +func generateMarkdown(cmd *cobra.Command, w io.Writer) error { cmd.InitDefaultHelpCmd() cmd.InitDefaultHelpFlag() @@ -108,7 +123,7 @@ func generateMarkdown(cmd *cobra.Command, w io.Writer) { printOptions(buf, cmd) _, err := buf.WriteTo(w) - checkErr(err) + return err } func generateFlagsTable(fs *pflag.FlagSet, buf io.StringWriter) { diff --git a/cmd/hash.go b/cmd/hash.go index 7d16df5e..3e7d8cdc 100644 --- a/cmd/hash.go +++ b/cmd/hash.go @@ -17,9 +17,12 @@ var hashCmd = &cobra.Command{ Short: "Hashes a password", Long: `Hashes a password using bcrypt algorithm.`, Args: cobra.ExactArgs(1), - Run: func(_ *cobra.Command, args []string) { + RunE: func(_ *cobra.Command, args []string) error { pwd, err := users.HashPwd(args[0]) - checkErr(err) + if err != nil { + return err + } fmt.Println(pwd) + return nil }, } diff --git a/cmd/root.go b/cmd/root.go index fd800188..286f6343 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -4,6 +4,7 @@ import ( "context" "crypto/tls" "errors" + "fmt" "io" "io/fs" "log" @@ -25,6 +26,7 @@ import ( "github.com/filebrowser/filebrowser/v2/auth" "github.com/filebrowser/filebrowser/v2/diskcache" + fbErrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/frontend" fbhttp "github.com/filebrowser/filebrowser/v2/http" "github.com/filebrowser/filebrowser/v2/img" @@ -39,6 +41,7 @@ var ( func init() { cobra.OnInitialize(initConfig) + rootCmd.SilenceUsage = true cobra.MousetrapHelpText = "" rootCmd.SetVersionTemplate("File Browser version {{printf \"%s\" .Version}}\n") @@ -112,36 +115,48 @@ set FB_DATABASE. Also, if the database path doesn't exist, File Browser will enter into the quick setup mode and a new database will be bootstrapped and a new user created with the credentials from options "username" and "password".`, - Run: python(func(cmd *cobra.Command, _ []string, d pythonData) { + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { log.Println(cfgFile) if !d.hadDB { - quickSetup(cmd.Flags(), d) + err := quickSetup(cmd.Flags(), *d) + if err != nil { + return err + } } // build img service workersCount, err := cmd.Flags().GetInt("img-processors") - checkErr(err) + if err != nil { + return err + } if workersCount < 1 { - log.Fatal("Image resize workers count could not be < 1") + return errors.New("image resize workers count could not be < 1") } imgSvc := img.New(workersCount) var fileCache diskcache.Interface = diskcache.NewNoOp() cacheDir, err := cmd.Flags().GetString("cache-dir") - checkErr(err) + if err != nil { + return err + } if cacheDir != "" { if err := os.MkdirAll(cacheDir, 0700); err != nil { //nolint:govet - log.Fatalf("can't make directory %s: %s", cacheDir, err) + return fmt.Errorf("can't make directory %s: %w", cacheDir, err) } fileCache = diskcache.New(afero.NewOsFs(), cacheDir) } - server := getRunParams(cmd.Flags(), d.store) + server, err := getRunParams(cmd.Flags(), d.store) + if err != nil { + return err + } setupLog(server.Log) root, err := filepath.Abs(server.Root) - checkErr(err) + if err != nil { + return err + } server.Root = root adr := server.Address + ":" + server.Port @@ -151,22 +166,34 @@ user created with the credentials from options "username" and "password".`, switch { case server.Socket != "": listener, err = net.Listen("unix", server.Socket) - checkErr(err) + if err != nil { + return err + } socketPerm, err := cmd.Flags().GetUint32("socket-perm") //nolint:govet - checkErr(err) + if err != nil { + return err + } err = os.Chmod(server.Socket, os.FileMode(socketPerm)) - checkErr(err) + if err != nil { + return err + } case server.TLSKey != "" && server.TLSCert != "": cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) //nolint:govet - checkErr(err) + if err != nil { + return err + } listener, err = tls.Listen("tcp", adr, &tls.Config{ MinVersion: tls.VersionTLS12, Certificates: []tls.Certificate{cer}}, ) - checkErr(err) + if err != nil { + return err + } default: listener, err = net.Listen("tcp", adr) - checkErr(err) + if err != nil { + return err + } } assetsFs, err := fs.Sub(frontend.Assets(), "dist") @@ -175,7 +202,9 @@ user created with the credentials from options "username" and "password".`, } handler, err := fbhttp.NewHandler(imgSvc, fileCache, d.store, server, assetsFs) - checkErr(err) + if err != nil { + return err + } defer listener.Close() @@ -194,8 +223,15 @@ user created with the credentials from options "username" and "password".`, }() sigc := make(chan os.Signal, 1) - signal.Notify(sigc, os.Interrupt, syscall.SIGTERM) - <-sigc + signal.Notify(sigc, + os.Interrupt, + syscall.SIGHUP, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + ) + sig := <-sigc + log.Println("Got signal:", sig) shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second) //nolint:mnd defer shutdownRelease() @@ -204,13 +240,28 @@ user created with the credentials from options "username" and "password".`, log.Fatalf("HTTP shutdown error: %v", err) } log.Println("Graceful shutdown complete.") + + switch sig { + case syscall.SIGHUP: + d.err = fbErrors.ErrSighup + case syscall.SIGINT: + d.err = fbErrors.ErrSigint + case syscall.SIGQUIT: + d.err = fbErrors.ErrSigquit + case syscall.SIGTERM: + d.err = fbErrors.ErrSigTerm + } + + return d.err }, pythonConfig{allowNoDB: true}), } //nolint:gocyclo -func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server { +func getRunParams(flags *pflag.FlagSet, st *storage.Storage) (*settings.Server, error) { server, err := st.Settings.GetServer() - checkErr(err) + if err != nil { + return nil, err + } if val, set := getStringParamB(flags, "root"); set { server.Root = val @@ -253,7 +304,7 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server { } if isAddrSet && isSocketSet { - checkErr(errors.New("--socket flag cannot be used with --address, --port, --key nor --cert")) + return nil, errors.New("--socket flag cannot be used with --address, --port, --key nor --cert") } // Do not use saved Socket if address was manually set. @@ -284,7 +335,7 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server { server.TokenExpirationTime = val } - return server + return server, nil } // getBoolParamB returns a parameter as a string and a boolean to tell if it is different from the default @@ -363,7 +414,7 @@ func setupLog(logMethod string) { } } -func quickSetup(flags *pflag.FlagSet, d pythonData) { +func quickSetup(flags *pflag.FlagSet, d pythonData) error { log.Println("Performing quick setup") set := &settings.Settings{ @@ -406,10 +457,14 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) { set.AuthMethod = auth.MethodJSONAuth err = d.store.Auth.Save(&auth.JSONAuth{}) } + if err != nil { + return err + } - checkErr(err) err = d.store.Settings.Save(set) - checkErr(err) + if err != nil { + return err + } ser := &settings.Server{ BaseURL: getStringParam(flags, "baseurl"), @@ -422,7 +477,9 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) { } err = d.store.Settings.SaveServer(ser) - checkErr(err) + if err != nil { + return err + } username := getStringParam(flags, "username") password := getStringParam(flags, "password") @@ -430,11 +487,15 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) { if password == "" { var pwd string pwd, err = users.RandomPwd(set.MinimumPasswordLength) - checkErr(err) + if err != nil { + return err + } log.Printf("User '%s' initialized with randomly generated password: %s\n", username, pwd) password, err = users.ValidateAndHashPwd(pwd, set.MinimumPasswordLength) - checkErr(err) + if err != nil { + return err + } } else { log.Printf("User '%s' initialize wth user-provided password\n", username) } @@ -452,14 +513,15 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) { set.Defaults.Apply(user) user.Perm.Admin = true - err = d.store.Users.Save(user) - checkErr(err) + return d.store.Users.Save(user) } func initConfig() { if cfgFile == "" { home, err := homedir.Dir() - checkErr(err) + if err != nil { + panic(err) + } v.AddConfigPath(".") v.AddConfigPath(home) v.AddConfigPath("/etc/filebrowser/") diff --git a/cmd/rule_rm.go b/cmd/rule_rm.go index 4b7ba851..26e801ae 100644 --- a/cmd/rule_rm.go +++ b/cmd/rule_rm.go @@ -40,27 +40,29 @@ including 'index_end'.`, return nil }, - Run: python(func(cmd *cobra.Command, args []string, d pythonData) { + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { i, err := strconv.Atoi(args[0]) - checkErr(err) + if err != nil { + return err + } f := i if len(args) == 2 { f, err = strconv.Atoi(args[1]) - checkErr(err) + if err != nil { + return err + } } - user := func(u *users.User) { + user := func(u *users.User) error { u.Rules = append(u.Rules[:i], u.Rules[f+1:]...) - err := d.store.Users.Save(u) - checkErr(err) + return d.store.Users.Save(u) } - global := func(s *settings.Settings) { + global := func(s *settings.Settings) error { s.Rules = append(s.Rules[:i], s.Rules[f+1:]...) - err := d.store.Settings.Save(s) - checkErr(err) + return d.store.Settings.Save(s) } - runRules(d.store, cmd, user, global) + return runRules(d.store, cmd, user, global) }, pythonConfig{}), } diff --git a/cmd/rules.go b/cmd/rules.go index 3bf91dd1..ffa5b1ae 100644 --- a/cmd/rules.go +++ b/cmd/rules.go @@ -29,41 +29,62 @@ rules.`, Args: cobra.NoArgs, } -func runRules(st *storage.Storage, cmd *cobra.Command, usersFn func(*users.User), globalFn func(*settings.Settings)) { - id := getUserIdentifier(cmd.Flags()) +func runRules(st *storage.Storage, cmd *cobra.Command, usersFn func(*users.User) error, globalFn func(*settings.Settings) error) error { + id, err := getUserIdentifier(cmd.Flags()) + if err != nil { + return err + } if id != nil { - user, err := st.Users.Get("", id) - checkErr(err) + var user *users.User + user, err = st.Users.Get("", id) + if err != nil { + return err + } if usersFn != nil { - usersFn(user) + err = usersFn(user) + if err != nil { + return err + } } printRules(user.Rules, id) - return + return nil } s, err := st.Settings.Get() - checkErr(err) + if err != nil { + return err + } if globalFn != nil { - globalFn(s) + err = globalFn(s) + if err != nil { + return err + } } printRules(s.Rules, id) + return nil } -func getUserIdentifier(flags *pflag.FlagSet) interface{} { - id := mustGetUint(flags, "id") - username := mustGetString(flags, "username") - - if id != 0 { - return id - } else if username != "" { - return username +func getUserIdentifier(flags *pflag.FlagSet) (interface{}, error) { + id, err := getUint(flags, "id") + if err != nil { + return nil, err + } + username, err := getString(flags, "username") + if err != nil { + return nil, err } - return nil + if id != 0 { + return id, nil + } else if username != "" { + return username, nil + } + + return nil, nil } func printRules(rulez []rules.Rule, id interface{}) { diff --git a/cmd/rules_add.go b/cmd/rules_add.go index fcdc7fb4..9d1f0cf9 100644 --- a/cmd/rules_add.go +++ b/cmd/rules_add.go @@ -21,9 +21,15 @@ var rulesAddCmd = &cobra.Command{ Short: "Add a global rule or user rule", Long: `Add a global rule or user rule.`, Args: cobra.ExactArgs(1), - Run: python(func(cmd *cobra.Command, args []string, d pythonData) { - allow := mustGetBool(cmd.Flags(), "allow") - regex := mustGetBool(cmd.Flags(), "regex") + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { + allow, err := getBool(cmd.Flags(), "allow") + if err != nil { + return err + } + regex, err := getBool(cmd.Flags(), "regex") + if err != nil { + return err + } exp := args[0] if regex { @@ -41,18 +47,16 @@ var rulesAddCmd = &cobra.Command{ rule.Path = exp } - user := func(u *users.User) { + user := func(u *users.User) error { u.Rules = append(u.Rules, rule) - err := d.store.Users.Save(u) - checkErr(err) + return d.store.Users.Save(u) } - global := func(s *settings.Settings) { + global := func(s *settings.Settings) error { s.Rules = append(s.Rules, rule) - err := d.store.Settings.Save(s) - checkErr(err) + return d.store.Settings.Save(s) } - runRules(d.store, cmd, user, global) + return runRules(d.store, cmd, user, global) }, pythonConfig{}), } diff --git a/cmd/rules_ls.go b/cmd/rules_ls.go index 0a8ed721..67a279dc 100644 --- a/cmd/rules_ls.go +++ b/cmd/rules_ls.go @@ -13,7 +13,7 @@ var rulesLsCommand = &cobra.Command{ Short: "List global rules or user specific rules", Long: `List global rules or user specific rules.`, Args: cobra.NoArgs, - Run: python(func(cmd *cobra.Command, _ []string, d pythonData) { - runRules(d.store, cmd, nil, nil) + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { + return runRules(d.store, cmd, nil, nil) }, pythonConfig{}), } diff --git a/cmd/upgrade.go b/cmd/upgrade.go index f6966e2e..7142b151 100644 --- a/cmd/upgrade.go +++ b/cmd/upgrade.go @@ -21,11 +21,20 @@ var upgradeCmd = &cobra.Command{ import share links because they are incompatible with this version.`, Args: cobra.NoArgs, - Run: func(cmd *cobra.Command, _ []string) { + RunE: func(cmd *cobra.Command, _ []string) error { flags := cmd.Flags() - oldDB := mustGetString(flags, "old.database") - oldConf := mustGetString(flags, "old.config") - err := importer.Import(oldDB, oldConf, getStringParam(flags, "database")) - checkErr(err) + oldDB, err := getString(flags, "old.database") + if err != nil { + return err + } + oldConf, err := getString(flags, "old.config") + if err != nil { + return err + } + db, err := getString(flags, "database") + if err != nil { + return err + } + return importer.Import(oldDB, oldConf, db) }, } diff --git a/cmd/users.go b/cmd/users.go index d3f97da6..a70b5fe4 100644 --- a/cmd/users.go +++ b/cmd/users.go @@ -79,50 +79,60 @@ func addUserFlags(flags *pflag.FlagSet) { flags.Bool("singleClick", false, "use single clicks only") } -func getViewMode(flags *pflag.FlagSet) users.ViewMode { - viewMode := users.ViewMode(mustGetString(flags, "viewMode")) - if viewMode != users.ListViewMode && viewMode != users.MosaicViewMode { - checkErr(errors.New("view mode must be \"" + string(users.ListViewMode) + "\" or \"" + string(users.MosaicViewMode) + "\"")) +func getViewMode(flags *pflag.FlagSet) (users.ViewMode, error) { + viewModeStr, err := getString(flags, "viewMode") + if err != nil { + return "", err } - return viewMode + viewMode := users.ViewMode(viewModeStr) + if viewMode != users.ListViewMode && viewMode != users.MosaicViewMode { + return "", errors.New("view mode must be \"" + string(users.ListViewMode) + "\" or \"" + string(users.MosaicViewMode) + "\"") + } + return viewMode, nil } //nolint:gocyclo -func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all bool) { +func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all bool) error { + var visitErr error visit := func(flag *pflag.Flag) { + if visitErr != nil { + return + } + var err error switch flag.Name { case "scope": - defaults.Scope = mustGetString(flags, flag.Name) + defaults.Scope, err = getString(flags, flag.Name) case "locale": - defaults.Locale = mustGetString(flags, flag.Name) + defaults.Locale, err = getString(flags, flag.Name) case "viewMode": - defaults.ViewMode = getViewMode(flags) + defaults.ViewMode, err = getViewMode(flags) case "singleClick": - defaults.SingleClick = mustGetBool(flags, flag.Name) + defaults.SingleClick, err = getBool(flags, flag.Name) case "perm.admin": - defaults.Perm.Admin = mustGetBool(flags, flag.Name) + defaults.Perm.Admin, err = getBool(flags, flag.Name) case "perm.execute": - defaults.Perm.Execute = mustGetBool(flags, flag.Name) + defaults.Perm.Execute, err = getBool(flags, flag.Name) case "perm.create": - defaults.Perm.Create = mustGetBool(flags, flag.Name) + defaults.Perm.Create, err = getBool(flags, flag.Name) case "perm.rename": - defaults.Perm.Rename = mustGetBool(flags, flag.Name) + defaults.Perm.Rename, err = getBool(flags, flag.Name) case "perm.modify": - defaults.Perm.Modify = mustGetBool(flags, flag.Name) + defaults.Perm.Modify, err = getBool(flags, flag.Name) case "perm.delete": - defaults.Perm.Delete = mustGetBool(flags, flag.Name) + defaults.Perm.Delete, err = getBool(flags, flag.Name) case "perm.share": - defaults.Perm.Share = mustGetBool(flags, flag.Name) + defaults.Perm.Share, err = getBool(flags, flag.Name) case "perm.download": - defaults.Perm.Download = mustGetBool(flags, flag.Name) + defaults.Perm.Download, err = getBool(flags, flag.Name) case "commands": - commands, err := flags.GetStringSlice(flag.Name) - checkErr(err) - defaults.Commands = commands + defaults.Commands, err = flags.GetStringSlice(flag.Name) case "sorting.by": - defaults.Sorting.By = mustGetString(flags, flag.Name) + defaults.Sorting.By, err = getString(flags, flag.Name) case "sorting.asc": - defaults.Sorting.Asc = mustGetBool(flags, flag.Name) + defaults.Sorting.Asc, err = getBool(flags, flag.Name) + } + if err != nil { + visitErr = err } } @@ -131,4 +141,5 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all } else { flags.Visit(visit) } + return visitErr } diff --git a/cmd/users_add.go b/cmd/users_add.go index c3b8af28..9d763d3d 100644 --- a/cmd/users_add.go +++ b/cmd/users_add.go @@ -16,36 +16,57 @@ var usersAddCmd = &cobra.Command{ Short: "Create a new user", Long: `Create a new user and add it to the database.`, Args: cobra.ExactArgs(2), - Run: python(func(cmd *cobra.Command, args []string, d pythonData) { + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { s, err := d.store.Settings.Get() - checkErr(err) - getUserDefaults(cmd.Flags(), &s.Defaults, false) + if err != nil { + return err + } + err = getUserDefaults(cmd.Flags(), &s.Defaults, false) + if err != nil { + return err + } password, err := users.ValidateAndHashPwd(args[1], s.MinimumPasswordLength) - checkErr(err) + if err != nil { + return err + } + + lockPassword, err := getBool(cmd.Flags(), "lockPassword") + if err != nil { + return err + } user := &users.User{ Username: args[0], Password: password, - LockPassword: mustGetBool(cmd.Flags(), "lockPassword"), + LockPassword: lockPassword, } s.Defaults.Apply(user) servSettings, err := d.store.Settings.GetServer() - checkErr(err) + if err != nil { + return err + } // since getUserDefaults() polluted s.Defaults.Scope // which makes the Scope not the one saved in the db // we need the right s.Defaults.Scope here s2, err := d.store.Settings.Get() - checkErr(err) + if err != nil { + return err + } userHome, err := s2.MakeUserDir(user.Username, user.Scope, servSettings.Root) - checkErr(err) + if err != nil { + return err + } user.Scope = userHome err = d.store.Users.Save(user) - checkErr(err) + if err != nil { + return err + } printUsers([]*users.User{user}) + return nil }, pythonConfig{}), } diff --git a/cmd/users_export.go b/cmd/users_export.go index 3b3798ad..d6009a37 100644 --- a/cmd/users_export.go +++ b/cmd/users_export.go @@ -14,11 +14,16 @@ var usersExportCmd = &cobra.Command{ Long: `Export all users to a json or yaml file. Please indicate the path to the file where you want to write the users.`, Args: jsonYamlArg, - Run: python(func(_ *cobra.Command, args []string, d pythonData) { + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { list, err := d.store.Users.Gets("") - checkErr(err) + if err != nil { + return err + } err = marshal(args[0], list) - checkErr(err) + if err != nil { + return err + } + return nil }, pythonConfig{}), } diff --git a/cmd/users_find.go b/cmd/users_find.go index 1f6e40c0..0dea071a 100644 --- a/cmd/users_find.go +++ b/cmd/users_find.go @@ -16,17 +16,17 @@ var usersFindCmd = &cobra.Command{ Short: "Find a user by username or id", Long: `Find a user by username or id. If no flag is set, all users will be printed.`, Args: cobra.ExactArgs(1), - Run: findUsers, + RunE: findUsers, } var usersLsCmd = &cobra.Command{ Use: "ls", Short: "List all users.", Args: cobra.NoArgs, - Run: findUsers, + RunE: findUsers, } -var findUsers = python(func(_ *cobra.Command, args []string, d pythonData) { +var findUsers = python(func(_ *cobra.Command, args []string, d *pythonData) error { var ( list []*users.User user *users.User @@ -46,6 +46,9 @@ var findUsers = python(func(_ *cobra.Command, args []string, d pythonData) { list, err = d.store.Users.Gets("") } - checkErr(err) + if err != nil { + return err + } printUsers(list) + return nil }, pythonConfig{}) diff --git a/cmd/users_import.go b/cmd/users_import.go index dee9d759..d20dca68 100644 --- a/cmd/users_import.go +++ b/cmd/users_import.go @@ -25,34 +25,54 @@ file. You can use this command to import new users to your installation. For that, just don't place their ID on the files list or set it to 0.`, Args: jsonYamlArg, - Run: python(func(cmd *cobra.Command, args []string, d pythonData) { + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { fd, err := os.Open(args[0]) - checkErr(err) + if err != nil { + return err + } defer fd.Close() list := []*users.User{} err = unmarshal(args[0], &list) - checkErr(err) + if err != nil { + return err + } for _, user := range list { err = user.Clean("") - checkErr(err) - } - - if mustGetBool(cmd.Flags(), "replace") { - oldUsers, err := d.store.Users.Gets("") - checkErr(err) - - err = marshal("users.backup.json", list) - checkErr(err) - - for _, user := range oldUsers { - err = d.store.Users.Delete(user.ID) - checkErr(err) + if err != nil { + return err } } - overwrite := mustGetBool(cmd.Flags(), "overwrite") + replace, err := getBool(cmd.Flags(), "replace") + if err != nil { + return err + } + + if replace { + oldUsers, userImportErr := d.store.Users.Gets("") + if userImportErr != nil { + return userImportErr + } + + err = marshal("users.backup.json", list) + if err != nil { + return err + } + + for _, user := range oldUsers { + err = d.store.Users.Delete(user.ID) + if err != nil { + return err + } + } + } + + overwrite, err := getBool(cmd.Flags(), "overwrite") + if err != nil { + return err + } for _, user := range list { onDB, err := d.store.Users.Get("", user.ID) @@ -60,7 +80,7 @@ list or set it to 0.`, // User exists in DB. if err == nil { if !overwrite { - checkErr(errors.New("user " + strconv.Itoa(int(user.ID)) + " is already registered")) + return errors.New("user " + strconv.Itoa(int(user.ID)) + " is already registered") } // If the usernames mismatch, check if there is another one in the DB @@ -68,7 +88,7 @@ list or set it to 0.`, // operation if user.Username != onDB.Username { if conflictuous, err := d.store.Users.Get("", user.Username); err == nil { //nolint:govet - checkErr(usernameConflictError(user.Username, conflictuous.ID, user.ID)) + return usernameConflictError(user.Username, conflictuous.ID, user.ID) } } } else { @@ -78,8 +98,11 @@ list or set it to 0.`, } err = d.store.Users.Save(user) - checkErr(err) + if err != nil { + return err + } } + return nil }, pythonConfig{}), } diff --git a/cmd/users_rm.go b/cmd/users_rm.go index 9041aa1b..55b973f4 100644 --- a/cmd/users_rm.go +++ b/cmd/users_rm.go @@ -15,7 +15,7 @@ var usersRmCmd = &cobra.Command{ Short: "Delete a user by username or id", Long: `Delete a user by username or id`, Args: cobra.ExactArgs(1), - Run: python(func(_ *cobra.Command, args []string, d pythonData) { + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { username, id := parseUsernameOrID(args[0]) var err error @@ -25,7 +25,10 @@ var usersRmCmd = &cobra.Command{ err = d.store.Users.Delete(id) } - checkErr(err) + if err != nil { + return err + } fmt.Println("user deleted successfully") + return nil }, pythonConfig{}), } diff --git a/cmd/users_update.go b/cmd/users_update.go index 2c58c4af..624bfda8 100644 --- a/cmd/users_update.go +++ b/cmd/users_update.go @@ -21,14 +21,22 @@ var usersUpdateCmd = &cobra.Command{ Long: `Updates an existing user. Set the flags for the options you want to change.`, Args: cobra.ExactArgs(1), - Run: python(func(cmd *cobra.Command, args []string, d pythonData) { + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { username, id := parseUsernameOrID(args[0]) flags := cmd.Flags() - password := mustGetString(flags, "password") - newUsername := mustGetString(flags, "username") + password, err := getString(flags, "password") + if err != nil { + return err + } + newUsername, err := getString(flags, "username") + if err != nil { + return err + } s, err := d.store.Settings.Get() - checkErr(err) + if err != nil { + return err + } var ( user *users.User @@ -40,7 +48,9 @@ options you want to change.`, user, err = d.store.Users.Get("", username) } - checkErr(err) + if err != nil { + return err + } defaults := settings.UserDefaults{ Scope: user.Scope, @@ -51,7 +61,10 @@ options you want to change.`, Sorting: user.Sorting, Commands: user.Commands, } - getUserDefaults(flags, &defaults, false) + err = getUserDefaults(flags, &defaults, false) + if err != nil { + return err + } user.Scope = defaults.Scope user.Locale = defaults.Locale user.ViewMode = defaults.ViewMode @@ -59,7 +72,10 @@ options you want to change.`, user.Perm = defaults.Perm user.Commands = defaults.Commands user.Sorting = defaults.Sorting - user.LockPassword = mustGetBool(flags, "lockPassword") + user.LockPassword, err = getBool(flags, "lockPassword") + if err != nil { + return err + } if newUsername != "" { user.Username = newUsername @@ -67,11 +83,16 @@ options you want to change.`, if password != "" { user.Password, err = users.ValidateAndHashPwd(password, s.MinimumPasswordLength) - checkErr(err) + if err != nil { + return err + } } err = d.store.Users.Update(user) - checkErr(err) + if err != nil { + return err + } printUsers([]*users.User{user}) + return nil }, pythonConfig{}), } diff --git a/cmd/utils.go b/cmd/utils.go index e88233fb..a4eb4d14 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -23,45 +23,50 @@ import ( const dbPerms = 0640 -func checkErr(err error) { +func returnErr(err error) error { if err != nil { - log.Fatal(err) + return err } + return nil } -func mustGetString(flags *pflag.FlagSet, flag string) string { +func getString(flags *pflag.FlagSet, flag string) (string, error) { s, err := flags.GetString(flag) - checkErr(err) - return s + return s, returnErr(err) } -func mustGetMode(flags *pflag.FlagSet, flag string) fs.FileMode { - s := mustGetString(flags, flag) +func getMode(flags *pflag.FlagSet, flag string) (fs.FileMode, error) { + s, err := getString(flags, flag) + if err != nil { + return 0, err + } b, err := strconv.ParseUint(s, 0, 32) - checkErr(err) - return fs.FileMode(b) + if err != nil { + return 0, err + } + return fs.FileMode(b), nil } -func mustGetBool(flags *pflag.FlagSet, flag string) bool { +func getBool(flags *pflag.FlagSet, flag string) (bool, error) { b, err := flags.GetBool(flag) - checkErr(err) - return b + return b, returnErr(err) } -func mustGetUint(flags *pflag.FlagSet, flag string) uint { +func getUint(flags *pflag.FlagSet, flag string) (uint, error) { b, err := flags.GetUint(flag) - checkErr(err) - return b + return b, returnErr(err) } func generateKey() []byte { k, err := settings.GenerateKey() - checkErr(err) + if err != nil { + panic(err) + } return k } -type cobraFunc func(cmd *cobra.Command, args []string) -type pythonFunc func(cmd *cobra.Command, args []string, data pythonData) +type cobraFunc func(cmd *cobra.Command, args []string) error +type pythonFunc func(cmd *cobra.Command, args []string, data *pythonData) error type pythonConfig struct { noDB bool @@ -71,6 +76,7 @@ type pythonConfig struct { type pythonData struct { hadDB bool store *storage.Storage + err error } func dbExists(path string) (bool, error) { @@ -94,8 +100,8 @@ func dbExists(path string) (bool, error) { } func python(fn pythonFunc, cfg pythonConfig) cobraFunc { - return func(cmd *cobra.Command, args []string) { - data := pythonData{hadDB: true} + return func(cmd *cobra.Command, args []string) error { + data := &pythonData{hadDB: true} path := getStringParam(cmd.Flags(), "database") absPath, err := filepath.Abs(path) @@ -117,17 +123,23 @@ func python(fn pythonFunc, cfg pythonConfig) cobraFunc { log.Println("Using database: " + absPath) data.hadDB = exists db, err := storm.Open(path, storm.BoltOptions(dbPerms, nil)) - checkErr(err) + if err != nil { + return err + } defer db.Close() data.store, err = bolt.NewStorage(db) - checkErr(err) - fn(cmd, args, data) + if err != nil { + return err + } + return fn(cmd, args, data) } } func marshal(filename string, data interface{}) error { fd, err := os.Create(filename) - checkErr(err) + if err != nil { + return err + } defer fd.Close() switch ext := filepath.Ext(filename); ext { @@ -145,7 +157,9 @@ func marshal(filename string, data interface{}) error { func unmarshal(filename string, data interface{}) error { fd, err := os.Open(filename) - checkErr(err) + if err != nil { + return err + } defer fd.Close() switch ext := filepath.Ext(filename); ext { diff --git a/errors/errors.go b/errors/errors.go index 5fd760c2..f8abee59 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -3,6 +3,15 @@ package errors import ( "errors" "fmt" + "os" + "syscall" +) + +const ( + ExitCodeSigTerm = 128 + int(syscall.SIGTERM) + ExitCodeSighup = 128 + int(syscall.SIGHUP) + ExitCodeSigint = 128 + int(syscall.SIGINT) + ExitCodeSigquit = 128 + int(syscall.SIGQUIT) ) var ( @@ -22,6 +31,10 @@ var ( ErrInvalidRequestParams = errors.New("invalid request params") ErrSourceIsParent = errors.New("source is parent") ErrRootUserDeletion = errors.New("user with id 1 can't be deleted") + ErrSigTerm = errors.New("exit on signal: sigterm") + ErrSighup = errors.New("exit on signal: sighup") + ErrSigint = errors.New("exit on signal: sigint") + ErrSigquit = errors.New("exit on signal: sigquit") ) type ErrShortPassword struct { @@ -31,3 +44,44 @@ type ErrShortPassword struct { func (e ErrShortPassword) Error() string { return fmt.Sprintf("password is too short, minimum length is %d", e.MinimumLength) } + +// GetExitCode returns the exit code for a given error. +func GetExitCode(err error) int { + if err == nil { + return 0 + } + + exitCodeMap := map[error]int{ + ErrSigTerm: ExitCodeSigTerm, + ErrSighup: ExitCodeSighup, + ErrSigint: ExitCodeSigint, + ErrSigquit: ExitCodeSigquit, + } + + for e, code := range exitCodeMap { + if errors.Is(err, e) { + return code + } + } + + if exitErr, ok := err.(interface{ ExitCode() int }); ok { + return exitErr.ExitCode() + } + + var pathErr *os.PathError + if errors.As(err, &pathErr) { + return 1 + } + + var syscallErr *os.SyscallError + if errors.As(err, &syscallErr) { + return 1 + } + + var errno syscall.Errno + if errors.As(err, &errno) { + return 1 + } + + return 1 +} diff --git a/main.go b/main.go index ab22ef45..d17550c9 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,14 @@ package main import ( + "os" + "github.com/filebrowser/filebrowser/v2/cmd" + "github.com/filebrowser/filebrowser/v2/errors" ) func main() { - cmd.Execute() + if err := cmd.Execute(); err != nil { + os.Exit(errors.GetExitCode(err)) + } } From e5e1b6dee48d5d2845350854d4b052458710f286 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 22 Jul 2025 08:28:22 +0200 Subject: [PATCH 009/225] chore(release): 2.41.0 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e641c790..0656166c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.41.0](https://github.com/filebrowser/filebrowser/compare/v2.40.2...v2.41.0) (2025-07-22) + + +### Features + +* Allow file and directory creation modes to be configured ([21ad653](https://github.com/filebrowser/filebrowser/commit/21ad653b7eb246c0e95ccdc131f8d59267de7818)), closes [#5316](https://github.com/filebrowser/filebrowser/issues/5316) [#5200](https://github.com/filebrowser/filebrowser/issues/5200) +* better error handling for sys kill signals ([1582b8b](https://github.com/filebrowser/filebrowser/commit/1582b8b2cd1c62fa93e60ca9b4e740e940b02e84)) + ### [2.40.2](https://github.com/filebrowser/filebrowser/compare/v2.40.1...v2.40.2) (2025-07-17) From 07dfdce8e4c371f4ca7480f3cef0bd66ff5c9abb Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 25 Jul 2025 01:27:33 +0000 Subject: [PATCH 010/225] feat: Translate frontend/src/i18n/en.json in sk 91% of minimum 50% translated source file: 'frontend/src/i18n/en.json' on 'sk'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format --- frontend/src/i18n/sk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/i18n/sk.json b/frontend/src/i18n/sk.json index b1e2c7d8..5f36b283 100644 --- a/frontend/src/i18n/sk.json +++ b/frontend/src/i18n/sk.json @@ -3,7 +3,7 @@ "cancel": "Zrušiť", "clear": "Zrušiť výber", "close": "Zavrieť", - "continue": "Continue", + "continue": "Pokračovať", "copy": "Kopírovať", "copyFile": "Kopírovať súbor", "copyToClipboard": "Kopírovať do schránky", From 5eb3bf40586c2ffc32f4834b5dd59f0eb719c1f7 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 26 Jul 2025 07:30:10 +0200 Subject: [PATCH 011/225] feat: Translate frontend/src/i18n/en.json in no --- frontend/src/i18n/no.json | 266 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 frontend/src/i18n/no.json diff --git a/frontend/src/i18n/no.json b/frontend/src/i18n/no.json new file mode 100644 index 00000000..d077e96f --- /dev/null +++ b/frontend/src/i18n/no.json @@ -0,0 +1,266 @@ +{ + "buttons": { + "cancel": "Avbryt", + "clear": "Fjern", + "close": "Lukk", + "continue": "Fortsett", + "copy": "Kopier", + "copyFile": "Fortsett", + "copyToClipboard": "Kopier til utklippstavlen", + "copyDownloadLinkToClipboard": "Kopier nedlastingslenken til utklippstavlen", + "create": "Opprett", + "delete": "Slett", + "download": "Nedlast", + "file": "Fil", + "folder": "Mappe", + "fullScreen": "Skru på fullskjerm", + "hideDotfiles": "Skjul punktfiler", + "info": "Info", + "more": "Meir", + "move": "Flytt", + "moveFile": "Flytt Fil", + "new": "Ny", + "next": "Neste", + "ok": "Ok", + "permalink": "Få permanent link", + "previous": "Tidligere", + "preview": "Forhåndsvisning", + "publish": "Publiser", + "rename": "Gi nytt navn", + "replace": "Bytt ut\n ", + "reportIssue": "Rapporter problem", + "save": "Lagre", + "schedule": "Planlegg ", + "search": "Søk", + "select": "Velg", + "selectMultiple": "Velg Fleire", + "share": "Del", + "shell": "Skru på shell", + "submit": "Send", + "switchView": "Skift visning", + "toggleSidebar": "Skru på sidebar", + "update": "Opptater", + "upload": "Last opp", + "openFile": "Open file", + "discardChanges": "Slett" + }, + "download": { + "downloadFile": "Nedlast filen", + "downloadFolder": "Nedlast mappen", + "downloadSelected": "Nedlast merket" + }, + "upload": { + "abortUpload": "Er du sikker på at du ønsker å avbryte?" + }, + "errors": { + "forbidden": "Du har ikkje tilgang til denne filen.", + "internal": "Noko gikk virkelig galt.", + "notFound": "Denne lokasjonen kan ikkje bli nådd.", + "connection": "Denne serveren kan ikkje nås." + }, + "files": { + "body": "Kropp", + "closePreview": "Lukk forhandsvisning", + "files": "Filer", + "folders": "Mappe", + "home": "Hjem", + "lastModified": "Sist endret", + "loading": "Laster....", + "lonely": "Det føltes ensomt her...", + "metadata": "Metadata", + "multipleSelectionEnabled": "Fleire seksjoner på", + "name": "Navn", + "size": "Størrelse", + "sortByLastModified": "Sorter etter sist endret", + "sortByName": "Sorter etter navn", + "sortBySize": "Sorter etter størrelse", + "noPreview": "Forhåndsvisning er ikkje tilgjengeleg for denne filen." + }, + "help": { + "click": "velg fil eller katalog", + "ctrl": { + "click": "velg flere filer eller mapper", + "f": "opner søk", + "s": "lagr en fil eller last ned direktoratet der du er" + }, + "del": "slett markert filer", + "doubleClick": "open en fil eller direktorat", + "esc": "visk av seleksjon og/eller lukk dette varselet", + "f1": "denne informasjonen", + "f2": "gi nytt navn til denne filen", + "help": "Hjelp" + }, + "login": { + "createAnAccount": "Opprett ein konto", + "loginInstead": "Du har allerede ein konto", + "password": "Passord", + "passwordConfirm": "Passordbekreftelse", + "passwordsDontMatch": "Passordene samsvarer ikkje", + "signup": "Registrer deg", + "submit": "Logg inn", + "username": "Brukernavn", + "usernameTaken": "Brukernavn er allerede i bruk", + "wrongCredentials": "Feil legitimasjon" + }, + "permanent": "Permanent", + "prompts": { + "copy": "Kopiere", + "copyMessage": "Velg hvor du vil kopiere filene dine:", + "currentlyNavigating": "Navigerer nå på:", + "deleteMessageMultiple": "Er du sikker på at du vil slette {count} fil(er)?", + "deleteMessageSingle": "Er du sikker på at du vil slette denne filen/mappen?", + "deleteMessageShare": "Er du sikker på at du vil slette denne delingen ({path})?", + "deleteUser": "Er du sikker at du vil slette denne brukeren?", + "deleteTitle": "Slett filer", + "displayName": "Vis Navn:", + "download": "Last ned filer", + "downloadMessage": "Velg kva format du ønsker å laste ned.", + "error": "Noko gikk galt.", + "fileInfo": "Fil informasjon", + "filesSelected": "{count} filer valgt.", + "lastModified": "Sist endret", + "move": "Flytt", + "moveMessage": "Velg nytt hjem for filen(e)/mappen(e)din:", + "newArchetype": "Opprett et nytt innlegg basert på en arketype. Filen din opprettes i innholdsmappen.", + "newDir": "Nytt Direktorat", + "newDirMessage": "Navn gi ditt nye direktorat", + "newFile": "Ny fil", + "newFileMessage": "Navn gi ditt nye fil", + "numberDirs": "Nummer av direktorat", + "numberFiles": "Nummer av filer", + "rename": "Gi nytt navn", + "renameMessage": "Sett inn nytt navn for", + "replace": "Bytt ut", + "replaceMessage": "En av filene du prøver å laste opp har et motstridende navn. Vil du hoppe over denne filen og fortsette opplastingen eller erstatte den eksisterende?\n", + "schedule": "Planlegg", + "scheduleMessage": "Velg en dato og et klokkeslett for å planlegge publiseringen av dette innlegget.", + "show": "Vis", + "size": "Størrelse", + "upload": "Last opp", + "uploadFiles": "Laster opp {filer} filer...", + "uploadMessage": "Velg et alternativ for opplasting.", + "optionalPassword": "Valgfritt passord", + "resolution": "Oppløysning", + "discardEditorChanges": "Er du sikker på at du vil forkaste endringene du har gjort?" + }, + "search": { + "images": "Bilde", + "music": "Musikk", + "pdf": "PDF", + "pressToSearch": "Trykk enter for å søke...", + "search": "Søk...", + "typeToSearch": "Trykk for å søke...", + "types": "Typer", + "video": "Video" + }, + "settings": { + "admin": "Admin", + "administrator": "Administrator", + "allowCommands": "Utfør kommandoer", + "allowEdit": "Rediger, gi nytt navn til og slett filer eller mapper", + "allowNew": "Opprett nye filer og direktorater", + "allowPublish": "Publiser nye innlegg og sider", + "allowSignup": "Tilat brukere å registrere seg", + "avoidChanges": "(la stå tomt for å unngå endringer)", + "branding": "Merkevarebygging", + "brandingDirectoryPath": "Bane for merkevarekatalog", + "brandingHelp": "Du kan tilpasse hvordan Filleser-instansen din ser ut og føles ved å endre navnet, erstatte logoen, legge til egendefinerte stiler og til og med deaktivere eksterne lenker til GitHub.\n\nFor mer informasjon om tilpasset merkevarebygging, se {0}.", + "changePassword": "Skift Passord", + "commandRunner": "Kommandoløper", + "commandRunnerHelp": "Her kan du angi kommandoer som skal utføres i de navngitte hendelsene. Du må skrive én per linje. Miljøvariablene {0} og {1} vil være tilgjengelige, siden de er {0} relative til {1}. For mer informasjon om denne funksjonen og de tilgjengelige miljøvariablene, vennligst les {2}.", + "commandsUpdated": "Komando opptatert!", + "createUserDir": "Opprett brukerens hjemmappe automatisk når du legger til en ny bruker", + "minimumPasswordLength": "Minimum passord lengde", + "tusUploads": "Klumpede opplastinger", + "tusUploadsHelp": "Filleseren støtter opplasting av delte filer, noe som gjør det mulig å lage effektive, pålitelige, gjenopptakbare og delte filer, selv på upålitelige nettverk.", + "tusUploadsChunkSize": "Angir maksimal størrelse på en forespørsel (direkte opplastinger vil bli brukt for mindre opplastinger). Du kan legge inn et heltall som angir bytestørrelsen, eller en streng som 10 MB, 1 GB osv.", + "tusUploadsRetryCount": "Antall nye forsøk som skal utføres hvis en del ikke lastes opp.", + "userHomeBasePath": "Basissti for brukerens hjemmekataloger", + "userScopeGenerationPlaceholder": "Omfanget vil bli generert automatisk", + "createUserHomeDirectory": "Opprett bruker hjemme direktorat", + "customStylesheet": "Egendefinert stilark", + "defaultUserDescription": "Dette er standardinnstillingene for nye brukere.", + "disableExternalLinks": "Deaktiver eksterne lenker (unntatt dokumentasjon)", + "disableUsedDiskPercentage": "Deaktiver grafen for prosentandelen brukt disk", + "documentation": "dokumentasjon", + "examples": "Eksempel", + "executeOnShell": "Kjør på skall", + "executeOnShellDescription": "Som standard kjører Filleseren kommandoene ved å kalle binærfilene direkte. Hvis du heller ønsker å kjøre dem på et skall (som Bash eller PowerShell), kan du definere det her med de nødvendige argumentene og flaggene. Hvis dette er angitt, vil kommandoen du kjører bli lagt til som et argument. Dette gjelder både brukerkommandoer og hendelseshooker.", + "globalRules": "Dette er et globalt sett med regler for tillatelse og forbud. De gjelder for alle brukere. Du kan definere spesifikke regler for hver brukers innstillinger for å overstyre disse.", + "globalSettings": "Globale Innstillinger", + "hideDotfiles": "Skjul punktfiler", + "insertPath": "Sett inn banen", + "insertRegex": "sett inn regex-uttrykk", + "instanceName": "Forekomstnavn", + "language": "Språk", + "lockPassword": "Hindre brukeren i å endre passordet", + "newPassword": "Sett ditt nye passord", + "newPasswordConfirm": "Bekreft ditt nye passord", + "newUser": "Ny bruker", + "password": "Passord", + "passwordUpdated": "Passord opptatert!", + "path": "Veg", + "perm": { + "create": "Opprett filer og direktorater", + "delete": "Slett filer og direktorater", + "download": "Nedlast", + "execute": "Utfør kommandoer", + "modify": "Endre filer", + "rename": "Gi nytt navn eller flytt filer og direktorater", + "share": "Del filer" + }, + "permissions": "Tilaterser", + "permissionsHelp": "Du kan angi brukeren som administrator eller velge tillatelsene individuelt. Hvis du velger «Administrator», vil alle de andre alternativene bli automatisk avkrysset. Administrasjon av brukere er fortsatt et privilegium for en administrator.\n", + "profileSettings": "Profil Innstilinger", + "ruleExample1": "forhindrer tilgang til noen dotfiler (som .git, .gitignore) i alle mapper.\n", + "ruleExample2": "blokkerer tilgangen til filen med navnet Caddyfile på roten av omfanget.", + "rules": "Regler", + "rulesHelp": "Her kan du definere et sett med tillatelses- og forbudsregler for denne spesifikke brukeren. De blokkerte filene vil ikke vises i listene, og de vil ikke være tilgjengelige for brukeren. Vi støtter regex og stier i forhold til brukerens omfang.", + "scope": "Omfang", + "setDateFormat": "Sett eksakt dato format", + "settingsUpdated": "Innstilinger opptatert!", + "shareDuration": "Del tidsbruk", + "shareManagement": "Del Ledelse", + "shareDeleted": "Delte ting slettet!", + "singleClick": "Bruk enkeltklikk for å åpne filer og mapper", + "themes": { + "default": "Systemstandard", + "dark": "Mørk", + "light": "Lyst", + "title": "Tema" + }, + "user": "Bruker", + "userCommands": "Kommando", + "userCommandsHelp": "En mellomromsseparert liste med tilgjengelige kommandoer for denne brukeren. Eksempel:\n", + "userCreated": "Bruker opprettet!", + "userDefaults": "Bruker systemstandard instillinger", + "userDeleted": "Bruker slettet!", + "userManagement": "Brukeradministrasjon", + "userUpdated": "Bruker opprettet!", + "username": "Brukernavn", + "users": "Bruker" + }, + "sidebar": { + "help": "Hjelp", + "hugoNew": "Hugo Ny", + "login": "Logg inn", + "logout": "Logg Ut", + "myFiles": "Mine filer", + "newFile": "Ny fil", + "newFolder": "Ny mappe", + "preview": "Forhåndsvis", + "settings": "Innstillinger", + "signup": "Registrer deg", + "siteSettings": "Side innstillinger" + }, + "success": { + "linkCopied": "Link koppiert!" + }, + "time": { + "days": "Dager", + "hours": "Timer", + "minutes": "Minutt", + "seconds": "Sekunder", + "unit": "Time format" + } +} From 25e47c3ce8b35b820b5370a4b8bfdf682bd5ae0b Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sat, 26 Jul 2025 07:35:46 +0200 Subject: [PATCH 012/225] feat: add Norwegian support (#5332) --- frontend/src/i18n/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts index b0550702..4e16357d 100644 --- a/frontend/src/i18n/index.ts +++ b/frontend/src/i18n/index.ts @@ -27,6 +27,7 @@ import("dayjs/locale/vi"); import("dayjs/locale/zh-cn"); import("dayjs/locale/zh-tw"); import("dayjs/locale/cs"); +import("dayjs/locale/no"); // All i18n resources specified in the plugin `include` option can be loaded // at once using the import syntax From cbeec6d225691723c4750d7f84122ebb14d662bf Mon Sep 17 00:00:00 2001 From: Ramires Viana <59319979+ramiresviana@users.noreply.github.com> Date: Sun, 27 Jul 2025 08:03:00 -0300 Subject: [PATCH 013/225] feat: select item on file list after navigating back (#5329) --- frontend/src/components/prompts/Copy.vue | 4 +- frontend/src/components/prompts/Delete.vue | 11 +++- .../prompts/DiscardEditorChanges.vue | 16 ++--- frontend/src/components/prompts/Move.vue | 5 +- frontend/src/components/prompts/Rename.vue | 6 +- frontend/src/css/base.css | 3 + frontend/src/css/styles.css | 3 + frontend/src/stores/file.ts | 2 + frontend/src/views/Files.vue | 50 ++++++++++------ frontend/src/views/files/Editor.vue | 48 ++++++++------- frontend/src/views/files/FileListing.vue | 58 +++++++++++++------ frontend/src/views/files/Preview.vue | 15 ++--- frontend/tsconfig.tsc.json | 1 + 13 files changed, 143 insertions(+), 79 deletions(-) diff --git a/frontend/src/components/prompts/Copy.vue b/frontend/src/components/prompts/Copy.vue index 43eff671..9b5e4c63 100644 --- a/frontend/src/components/prompts/Copy.vue +++ b/frontend/src/components/prompts/Copy.vue @@ -62,6 +62,7 @@ import FileList from "./FileList.vue"; import { files as api } from "@/api"; import buttons from "@/utils/buttons"; import * as upload from "@/utils/upload"; +import { removePrefix } from "@/api/utils"; export default { name: "copy", @@ -76,7 +77,7 @@ export default { computed: { ...mapState(useFileStore, ["req", "selected"]), ...mapState(useAuthStore, ["user"]), - ...mapWritableState(useFileStore, ["reload"]), + ...mapWritableState(useFileStore, ["reload", "preselect"]), }, methods: { ...mapActions(useLayoutStore, ["showHover", "closeHovers"]), @@ -100,6 +101,7 @@ export default { .copy(items, overwrite, rename) .then(() => { buttons.success("copy"); + this.preselect = removePrefix(items[0].to); if (this.$route.path === this.dest) { this.reload = true; diff --git a/frontend/src/components/prompts/Delete.vue b/frontend/src/components/prompts/Delete.vue index 39fc2511..aa2482ce 100644 --- a/frontend/src/components/prompts/Delete.vue +++ b/frontend/src/components/prompts/Delete.vue @@ -48,16 +48,15 @@ export default { "selectedCount", "req", "selected", - "currentPrompt", ]), - ...mapWritableState(useFileStore, ["reload"]), + ...mapState(useLayoutStore, ["currentPrompt"]), + ...mapWritableState(useFileStore, ["reload", "preselect"]), }, methods: { ...mapActions(useLayoutStore, ["closeHovers"]), submit: async function () { buttons.loading("delete"); - window.sessionStorage.setItem("modified", "true"); try { if (!this.isListing) { await api.remove(this.$route.path); @@ -81,6 +80,12 @@ export default { await Promise.all(promises); buttons.success("delete"); + + const nearbyItem = + this.req.items[Math.max(0, Math.min(this.selected) - 1)]; + + this.preselect = nearbyItem?.path; + this.reload = true; } catch (e) { buttons.done("delete"); diff --git a/frontend/src/components/prompts/DiscardEditorChanges.vue b/frontend/src/components/prompts/DiscardEditorChanges.vue index 69963674..4c1e5faa 100644 --- a/frontend/src/components/prompts/DiscardEditorChanges.vue +++ b/frontend/src/components/prompts/DiscardEditorChanges.vue @@ -17,7 +17,7 @@